diff --git a/DEPS b/DEPS
index 8f2a991..7b307eb 100644
--- a/DEPS
+++ b/DEPS
@@ -195,11 +195,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': '2531de9926d17e469b857e05bbd1ae5530e97a04',
+  'skia_revision': '07055b5e25a28e145e68ce6ccb71d9d6ee1d3481',
   # 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': '07b0b1dcde4a99294b8028d83f4ea244885cc091',
+  'v8_revision': '896ca12d998bf559bd044443018ebf22a1e63a40',
   # 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.
@@ -207,7 +207,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': '68bd685a76430f8dd392cdf5ca7e5976d58cb01f',
+  'angle_revision': '46d4522b161bf1af3b214d823940da7f8b08ee52',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -215,7 +215,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': 'e21911cc1c77d39dbc51001845bbfce2783e6514',
+  'pdfium_revision': 'aa7048b18b2f4713ac2d2158e48c14601a58025c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -246,7 +246,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '20186d1be6415d1bd7cb79ac56f1b806c26b677c',
+  'freetype_revision': '82d331556ce73de07c16afd51a865ba1ff806a65',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
@@ -266,7 +266,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '06e3f9cc6739527605ca05cf3705a2e33e95f006',
+  'devtools_frontend_revision': '30127e006a5b6fba602a0a8f19dccf4d4b195316',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -318,7 +318,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '6c3da3dc5b875a9500770644e0966c9f731dae7f',
+  'dawn_revision': '936ef0a5f21e5622e003257d665f049804d07516',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1254,7 +1254,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '109c355900d140e616c7ddc66c57e626678133ca',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7c7b98f060011e2ed9602bede9d8a6a5f875fb3c',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1486,7 +1486,7 @@
   },
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '3326535126e435f1ba647885ce43a8f0f3d317eb',
+    Var('webrtc_git') + '/src.git' + '@' + '1da46abbddb6802fd039853ab5454289658558ce',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1558,7 +1558,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@18d648b5376b2609389b185b8bb2c40035473dff',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fb0f797b07aa3fe343867e56364efffabc02e1c8',
     'condition': 'checkout_src_internal',
   },
 
@@ -1577,7 +1577,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'O6EAs9PlBe64a_zFWVQLK6xAWYLwB63WcFSEb9iMRLEC',
+        'version': 'tdIYOywbT-7Ua5VwVKvfLfPLbfSGfLAQ2PzHie1qBhsC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/aw_pdf_exporter.cc b/android_webview/browser/aw_pdf_exporter.cc
index 5adcf168..adfc9d88 100644
--- a/android_webview/browser/aw_pdf_exporter.cc
+++ b/android_webview/browser/aw_pdf_exporter.cc
@@ -66,10 +66,18 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   printing::PageRanges page_ranges;
   JNI_AwPdfExporter_GetPageRanges(env, pages, &page_ranges);
-  AwPrintManager* print_manager = AwPrintManager::CreateForWebContents(
-      web_contents_, CreatePdfSettings(env, obj, page_ranges), fd,
-      base::BindRepeating(&AwPdfExporter::DidExportPdf,
-                          base::Unretained(this)));
+
+  // Create an AwPrintManager for the provided WebContents if the
+  // AwPrintManager doesn't exist.
+  if (!AwPrintManager::FromWebContents(web_contents_))
+    AwPrintManager::CreateForWebContents(web_contents_);
+
+  // Update the parameters of the current print manager.
+  AwPrintManager* print_manager =
+      AwPrintManager::FromWebContents(web_contents_);
+  print_manager->UpdateParam(CreatePdfSettings(env, obj, page_ranges), fd,
+                             base::BindRepeating(&AwPdfExporter::DidExportPdf,
+                                                 base::Unretained(this)));
 
   if (!print_manager->PrintNow())
     DidExportPdf(0);
diff --git a/android_webview/browser/aw_print_manager.cc b/android_webview/browser/aw_print_manager.cc
index 95348e6d..12c6185 100644
--- a/android_webview/browser/aw_print_manager.cc
+++ b/android_webview/browser/aw_print_manager.cc
@@ -38,31 +38,8 @@
 
 }  // namespace
 
-// static
-AwPrintManager* AwPrintManager::CreateForWebContents(
-    content::WebContents* contents,
-    std::unique_ptr<printing::PrintSettings> settings,
-    int file_descriptor,
-    PrintManager::PdfWritingDoneCallback callback) {
-  AwPrintManager* print_manager = new AwPrintManager(
-      contents, std::move(settings), file_descriptor, std::move(callback));
-  contents->SetUserData(UserDataKey(), base::WrapUnique(print_manager));
-  return print_manager;
-}
-
-AwPrintManager::AwPrintManager(
-    content::WebContents* contents,
-    std::unique_ptr<printing::PrintSettings> settings,
-    int file_descriptor,
-    PdfWritingDoneCallback callback)
-    : PrintManager(contents),
-      settings_(std::move(settings)),
-      fd_(file_descriptor) {
-  DCHECK(settings_);
-  pdf_writing_done_callback_ = std::move(callback);
-  DCHECK(pdf_writing_done_callback_);
-  cookie_ = 1;  // Set a valid dummy cookie value.
-}
+AwPrintManager::AwPrintManager(content::WebContents* contents)
+    : PrintManager(contents) {}
 
 AwPrintManager::~AwPrintManager() = default;
 
@@ -89,6 +66,18 @@
   std::move(callback).Run(std::move(params));
 }
 
+void AwPrintManager::UpdateParam(
+    std::unique_ptr<printing::PrintSettings> settings,
+    int file_descriptor,
+    PrintManager::PdfWritingDoneCallback callback) {
+  settings_ = std::move(settings);
+  DCHECK(settings_);
+  fd_ = file_descriptor;
+  pdf_writing_done_callback_ = std::move(callback);
+  DCHECK(pdf_writing_done_callback_);
+  cookie_ = 1;  // Set a valid dummy cookie value.
+}
+
 void AwPrintManager::OnScriptedPrint(
     content::RenderFrameHost* render_frame_host,
     const printing::mojom::ScriptedPrintParams& scripted_params,
diff --git a/android_webview/browser/aw_print_manager.h b/android_webview/browser/aw_print_manager.h
index bc3d2f4..6d59853 100644
--- a/android_webview/browser/aw_print_manager.h
+++ b/android_webview/browser/aw_print_manager.h
@@ -19,15 +19,6 @@
 class AwPrintManager : public printing::PrintManager,
     public content::WebContentsUserData<AwPrintManager> {
  public:
-  // Creates an AwPrintManager for the provided WebContents. If the
-  // AwPrintManager already exists, it is destroyed and a new one is created.
-  // The returned pointer is owned by |contents|.
-  static AwPrintManager* CreateForWebContents(
-      content::WebContents* contents,
-      std::unique_ptr<printing::PrintSettings> settings,
-      int file_descriptor,
-      PdfWritingDoneCallback callback);
-
   ~AwPrintManager() override;
 
   // mojom::PrintManagerHost:
@@ -39,13 +30,15 @@
 
   bool PrintNow();
 
+  // Updates the parameters for printing.
+  void UpdateParam(std::unique_ptr<printing::PrintSettings> settings,
+                   int file_descriptor,
+                   PdfWritingDoneCallback callback);
+
  private:
   friend class content::WebContentsUserData<AwPrintManager>;
 
-  AwPrintManager(content::WebContents* contents,
-                 std::unique_ptr<printing::PrintSettings> settings,
-                 int file_descriptor,
-                 PdfWritingDoneCallback callback);
+  explicit AwPrintManager(content::WebContents* contents);
 
   // printing::PrintManager:
   void OnDidPrintDocument(
@@ -61,10 +54,10 @@
       std::unique_ptr<DelayedFrameDispatchHelper> helper,
       uint32_t page_count);
 
-  const std::unique_ptr<printing::PrintSettings> settings_;
+  std::unique_ptr<printing::PrintSettings> settings_;
 
   // The file descriptor into which the PDF of the document will be written.
-  int fd_;
+  int fd_ = -1;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
diff --git a/android_webview/ui/grit_resources_allowlist.txt b/android_webview/ui/grit_resources_allowlist.txt
index 39072e6..dce3a37 100644
--- a/android_webview/ui/grit_resources_allowlist.txt
+++ b/android_webview/ui/grit_resources_allowlist.txt
@@ -1,14 +1,14 @@
 IDR_ANDROID_ERROR_PAGE_LOAD_ERROR_HTML
 IDR_ABOUT_UI_CREDITS_HTML
-IDR_WEBUI_JS_LOAD_TIME_DATA
-IDR_WEBUI_JSTEMPLATE_JS
+IDR_WEBUI_JS_LOAD_TIME_DATA_JS
+IDR_WEBUI_JS_JSTEMPLATE_COMPILED_JS
 IDR_SECURITY_INTERSTITIAL_HTML
-IDR_WEBUI_CSS_TEXT_DEFAULTS
+IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS
 IDR_SECURITY_INTERSTITIAL_QUIET_HTML
 IDR_SAFE_BROWSING_CSS
 IDR_SAFE_BROWSING_JS
 IDR_SAFE_BROWSING_HTML
-IDR_WEBUI_JS_CR
-IDR_WEBUI_JS_UTIL
-IDR_WEBUI_JS_PROMISE_RESOLVER
+IDR_WEBUI_JS_CR_JS
+IDR_WEBUI_JS_UTIL_JS
+IDR_WEBUI_JS_PROMISE_RESOLVER_JS
 IDR_MOJO_MOJO_BINDINGS_LITE_JS
diff --git a/ash/hud_display/memory_status.cc b/ash/hud_display/memory_status.cc
index 2898ba3..e465ae5 100644
--- a/ash/hud_display/memory_status.cc
+++ b/ash/hud_display/memory_status.cc
@@ -168,7 +168,12 @@
   base::GetSystemMemoryInfo(&meminfo);
   total_ram_size_ = meminfo.total * 1024LL;
   total_free_ = meminfo.free * 1024LL;
-  gpu_kernel_ = std::max(meminfo.gem_size, 0LL);  // == -1 when not supported.
+
+  base::GraphicsMemoryInfoKB gpu_meminfo;
+  if (base::GetGraphicsMemoryInfo(&gpu_meminfo))
+    gpu_kernel_ = gpu_meminfo.gpu_memory_size;
+  else
+    gpu_kernel_ = 0LL;
 }
 
 }  // namespace hud_display
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb
index 4689666..4c69ce66 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb
@@ -46,7 +46,7 @@
 <translation id="2480851840841871861">Google Туслахыг нээх</translation>
 <translation id="2488661730534396940">Зүүн талын дэлгэцийг идэвхжүүлэх</translation>
 <translation id="2515586267016047495">Alt</translation>
-<translation id="2530339807289914946">Вэб хуудсыг доош гүйлгэх</translation>
+<translation id="2530339807289914946">Веб хуудсыг доош гүйлгэх</translation>
 <translation id="2530896289327917474">Caret browsing-г асаах эсвэл унтраах</translation>
 <translation id="2574014812750545982">Хуудас дахь томруулалтын түвшинг шинэчлэх</translation>
 <translation id="2596078834055697711">Цонхны дэлгэцийн зургийг дарах</translation>
@@ -122,7 +122,7 @@
 <translation id="5541719484267030947">Чихтэй хуудсыг чирэх үедээ <ph name="ESC" />-г дарах</translation>
 <translation id="5554139136362089836">Одоогийн хуудсыг хайх</translation>
 <translation id="5563050856984839829"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" />-г дараад холбоосыг дарах</translation>
-<translation id="561814908794220892">Чихтэй хуудсанд вэб хуудсыг нээх</translation>
+<translation id="561814908794220892">Чихтэй хуудсанд веб хуудсыг нээх</translation>
 <translation id="5620219513321115856">Идэвхтэй цонхыг баруун талын дэлгэц рүү шилжүүлэх</translation>
 <translation id="5710621673935162997"><ph name="CTRL" /><ph name="SEPARATOR1" /><ph name="L" /> эсвэл <ph name="ALT" /><ph name="SEPARATOR2" /><ph name="D" /></translation>
 <translation id="5757111373163288447">Чихтэй хуудсанд холбоос нээх</translation>
@@ -165,7 +165,7 @@
 <translation id="7025325401470358758">Дараагийн самбар</translation>
 <translation id="7076878155205969899">Дууны дууг хаах</translation>
 <translation id="7077383985738259936">Хавчуургын хэсгийг сонгох эсвэл тодруулах (хэрэв харагдаж байгаа бол)</translation>
-<translation id="7237562915163138771">Хаяг оруулах хэсэгт вэб хаягийг оруулаад <ph name="ALT" /><ph name="SEPARATOR" /><ph name="ENTER" />-г дарах</translation>
+<translation id="7237562915163138771">Хаяг оруулах хэсэгт веб хаягийг оруулаад <ph name="ALT" /><ph name="SEPARATOR" /><ph name="ENTER" />-г дарах</translation>
 <translation id="7254764037241667478">Төхөөрөмжийг амраах горимд оруулах (түр хаах)</translation>
 <translation id="7422707470576323858">Дараагийн боломжтой оруулах арга руу сэлгэх</translation>
 <translation id="743754632698445141">Аппыг тогтоосныг нь болиулах</translation>
@@ -209,7 +209,7 @@
 <translation id="906458777597946297">Цонхыг томсгох</translation>
 <translation id="9072882242928138086"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" />, дараа нь <ph name="LEFT" /> эсвэл <ph name="RIGHT" /> эсвэл <ph name="UP" /> эсвэл <ph name="DOWN" /></translation>
 <translation id="9091855755813503076">Мөрийн эхлэл рүү очно уу</translation>
-<translation id="9106898733795143799">Хуудас болон вэб хөтөч</translation>
+<translation id="9106898733795143799">Хуудас болон веб хөтөч</translation>
 <translation id="9162942292291287644"><ph name="QUERY" />-н хайлтын илэрц алга</translation>
 <translation id="9179672198516322668">Нийтлэг товчлолууд</translation>
 <translation id="93603345341560814"><ph name="SHIFT" />-г дараад холбоосыг дарах</translation>
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb
index 83c3e8a..5eb3c82 100644
--- a/ash/strings/ash_strings_af.xtb
+++ b/ash/strings/ash_strings_af.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> koppel tans.</translation>
 <translation id="553675580533261935">Gaan tans uit sessie</translation>
 <translation id="5537725057119320332">Saai uit</translation>
-<translation id="5548285847212963613">Die uitbreiding "<ph name="EXTENSION_NAME" />" kan help om aan hierdie netwerk te verbind.</translation>
 <translation id="554893713779400387">Wissel diktering</translation>
 <translation id="556042886152191864">Knoppie</translation>
 <translation id="5571066253365925590">Bluetooth geaktiveer</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 1dd399f0..d2ee59f7 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> በመገናኘት ላይ ነው።</translation>
 <translation id="553675580533261935">ከክፍለ-ጊዜ በመውጣት ላይ</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">«<ph name="EXTENSION_NAME" />» ቅጥያ ወደዚህ አውታረመረብ ለማገናኘት ሊያግዝ ይችላል።</translation>
 <translation id="554893713779400387">የቃል ጽሑፍን ቀያይር</translation>
 <translation id="556042886152191864">አዘራር</translation>
 <translation id="5571066253365925590">ብሉቱዝ ነቅቷል</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 97dc2f2..47b8fe7 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">جارٍ اتصال <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">جارٍ الخروج من الجلسة</translation>
 <translation id="5537725057119320332">إرسال</translation>
-<translation id="5548285847212963613">يمكن أن تساعد الإضافة " <ph name="EXTENSION_NAME" /> "على الاتصال بهذه الشبكة.</translation>
 <translation id="554893713779400387">تبديل الإملاء</translation>
 <translation id="556042886152191864">زر</translation>
 <translation id="5571066253365925590">تم تفعيل البلوتوث</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index 49e6e5e8..602d934ea 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -442,7 +442,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" />এ সংযোগ কৰি আছে।</translation>
 <translation id="553675580533261935">ছেশ্বন বন্ধ কৰি আছে</translation>
 <translation id="5537725057119320332">কাষ্ট কৰক</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" এক্সটেনশ্বনটোৱে এই নেটৱৰ্কটোত সংযোগ হোৱাত সহায় কৰিব পাৰে।</translation>
 <translation id="554893713779400387">শ্ৰুতলিপি দিয়া বুটামটো টগ'ল কৰক</translation>
 <translation id="556042886152191864">বুটাম</translation>
 <translation id="5571066253365925590">ব্লুটুথ সক্ষম কৰা হ'ল</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index c4f55cc..61a7a55 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> qoşulur.</translation>
 <translation id="553675580533261935">Mövcud sessiya</translation>
 <translation id="5537725057119320332">Yayım</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" artırması bu şəbəkəyə qoşulmağa kömək edə bilər.</translation>
 <translation id="554893713779400387">İmlanı aktiv edin</translation>
 <translation id="556042886152191864">Düymə</translation>
 <translation id="5571066253365925590">Bluetooth aktivdir</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb
index 8f7167a..24219179 100644
--- a/ash/strings/ash_strings_be.xtb
+++ b/ash/strings/ash_strings_be.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> падключаецца.</translation>
 <translation id="553675580533261935">Выконваецца выхад з сеанса</translation>
 <translation id="5537725057119320332">Трансліраваць</translation>
-<translation id="5548285847212963613">Пашырэнне "<ph name="EXTENSION_NAME" />" дапамагае падключыцца да гэтай сеткі.</translation>
 <translation id="554893713779400387">Уключыць або выключыць дыктаванне</translation>
 <translation id="556042886152191864">Кнопка</translation>
 <translation id="5571066253365925590">Bluetooth уключаны</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 54bb346..fd08be64 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Функцията „<ph name="FEATURE_NAME" />“ установява връзка.</translation>
 <translation id="553675580533261935">Излизане от сесията</translation>
 <translation id="5537725057119320332">Предаване</translation>
-<translation id="5548285847212963613">Разширението <ph name="EXTENSION_NAME" /> може да помогне за свързването с тази мрежа.</translation>
 <translation id="554893713779400387">Превключване на режима на диктуване</translation>
 <translation id="556042886152191864">Бутон</translation>
 <translation id="5571066253365925590">Bluetooth е активиран</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 32016a9..5678dde 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> কানেক্ট করা হচ্ছে।</translation>
 <translation id="553675580533261935">সেশন থেকে প্রস্থান করছে</translation>
 <translation id="5537725057119320332">কাস্ট করুন</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" এক্সটেনশনটি এই নেটওয়ার্কের সাথে সংযোগ স্থাপন করতে সাহায্য করতে পারে৷</translation>
 <translation id="554893713779400387">ডিক্টেশন চালু বা বন্ধ করুন</translation>
 <translation id="556042886152191864">বোতাম</translation>
 <translation id="5571066253365925590">ব্লুটুথ সক্ষমিত</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index 693a1c4..6a37e9c3 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Povezivanje funkcije <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">Izlazak iz sesije</translation>
 <translation id="5537725057119320332">Emitiraj</translation>
-<translation id="5548285847212963613">Ekstenzija "<ph name="EXTENSION_NAME" />" može pomoći prilikom povezivanja na ovu mrežu.</translation>
 <translation id="554893713779400387">Uključi/isključi diktiranje</translation>
 <translation id="556042886152191864">Dugme</translation>
 <translation id="5571066253365925590">Bluetooth je omogućen</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index a080f49..e172563 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> s'està connectant.</translation>
 <translation id="553675580533261935">S'està tancant la sessió</translation>
 <translation id="5537725057119320332">Emet</translation>
-<translation id="5548285847212963613">L'extensió "<ph name="EXTENSION_NAME" />" pot ajudar a connectar-se a aquesta xarxa.</translation>
 <translation id="554893713779400387">Activa o desactiva el dictat</translation>
 <translation id="556042886152191864">Botó</translation>
 <translation id="5571066253365925590">S'ha activat el Bluetooth</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index e2c2d751..c8441af 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Probíhá připojování funkce <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">Ukončení návštěvy</translation>
 <translation id="5537725057119320332">Odeslat</translation>
-<translation id="5548285847212963613">S připojení k této síti může pomoci rozšíření <ph name="EXTENSION_NAME" />.</translation>
 <translation id="554893713779400387">Přepnout diktování</translation>
 <translation id="556042886152191864">Tlačítko</translation>
 <translation id="5571066253365925590">Rozhraní Bluetooth aktivováno</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 48a0f30e4..722f56c 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> opretter forbindelse.</translation>
 <translation id="553675580533261935">Afslutter session</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Udvidelsen "<ph name="EXTENSION_NAME" />" kan hjælpe med at oprette forbindelse til dette netværk.</translation>
 <translation id="554893713779400387">Slå diktering til/fra</translation>
 <translation id="556042886152191864">Knap</translation>
 <translation id="5571066253365925590">Bluetooth er aktiveret</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 70a494d..4ae7bb6 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">"<ph name="FEATURE_NAME" />" wird verbunden.</translation>
 <translation id="553675580533261935">Sitzung wird beendet</translation>
 <translation id="5537725057119320332">Streamen</translation>
-<translation id="5548285847212963613">Die Erweiterung "<ph name="EXTENSION_NAME" />" kann die Verbindung mit diesem Netzwerk unterstützen.</translation>
 <translation id="554893713779400387">Diktierfunktion ein-/ausschalten</translation>
 <translation id="556042886152191864">Schaltfläche</translation>
 <translation id="5571066253365925590">Bluetooth aktiviert</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index d033850..abf0d53 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Πραγματοποιείται σύνδεση της λειτουργίας <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">Έξοδος από περίοδο σύνδεσης</translation>
 <translation id="5537725057119320332">Μετάδοση</translation>
-<translation id="5548285847212963613">Η επέκταση "<ph name="EXTENSION_NAME" />" μπορεί να διευκολύνει τη σύνδεση σε αυτό το δίκτυο.</translation>
 <translation id="554893713779400387">Εναλλαγή υπαγόρευσης</translation>
 <translation id="556042886152191864">Κουμπί</translation>
 <translation id="5571066253365925590">Το Bluetooth έχει ενεργοποιηθεί</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 9b4c847f..03d2f84 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -313,6 +313,7 @@
 <translation id="4072264167173457037">Medium signal</translation>
 <translation id="4112140312785995938">Seek backwards</translation>
 <translation id="4114315158543974537">Turn on Phone Hub</translation>
+<translation id="4121728057981832179">A virtual machine is using your microphone</translation>
 <translation id="4129129681837227511">To see notifications on your lock screen, unlock to change the setting</translation>
 <translation id="4146833061457621061">Play music</translation>
 <translation id="4149156641122542261"><ph name="DEVICE_TYPE" /> managed by <ph name="DOMAIN" /></translation>
@@ -327,6 +328,7 @@
 <translation id="4217571870635786043">Dictation</translation>
 <translation id="4239069858505860023">GPRS</translation>
 <translation id="4261870227682513959">Show notification settings. Notifications are off</translation>
+<translation id="4267383818855338811">A virtual machine is using your camera</translation>
 <translation id="4269883910223712419">The admin of this device has the ability to:</translation>
 <translation id="4279490309300973883">Mirroring</translation>
 <translation id="4285498937028063278">Unpin</translation>
@@ -362,6 +364,7 @@
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Bluetooth device "<ph name="DEVICE_NAME" />" would like permission to pair.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> until full</translation>
+<translation id="4544483149666270818">Select a window to record</translation>
 <translation id="4560576029703263363">On</translation>
 <translation id="4561267230861221837">3G</translation>
 <translation id="4565377596337484307">Hide password</translation>
@@ -401,6 +404,15 @@
 <translation id="4918086044614829423">Accept</translation>
 <translation id="4924411785043111640">Restart and reset</translation>
 <translation id="4925542575807923399">The administrator for this account requires this account to be the first signed-in account in a multiple sign-in session.</translation>
+<translation id="4942878304446937978">Status tray, time <ph name="TIME" />,
+        <ph name="BATTERY" />
+        <ph name="NETWORK" />,
+        <ph name="MIC" />,
+        <ph name="CAMERA" />,
+        <ph name="NOTIFICATION" />,
+        <ph name="IME" />
+        <ph name="LOCALE" /></translation>
+<translation id="4946376291507881335">Capture</translation>
 <translation id="495046168593986294">Scroll up</translation>
 <translation id="4961318399572185831">Cast screen</translation>
 <translation id="4969092041573468113"><ph name="HOURS" />h <ph name="MINUTES" />m <ph name="SECONDS" />s</translation>
@@ -443,10 +455,10 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> is connecting.</translation>
 <translation id="553675580533261935">Exiting session</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">The extension "<ph name="EXTENSION_NAME" />" can help connect to this network.</translation>
 <translation id="554893713779400387">Toggle dictation</translation>
 <translation id="556042886152191864">Button</translation>
 <translation id="5571066253365925590">Bluetooth enabled</translation>
+<translation id="558849140439112033">Drag to select an area to capture</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5600837773213129531">Press Ctrl + Alt + Z to disable spoken feedback.</translation>
 <translation id="5625955975703555628">LTE+</translation>
@@ -474,9 +486,11 @@
 <translation id="5860033963881614850">Off</translation>
 <translation id="5876666360658629066">Enter parental code</translation>
 <translation id="5895138241574237353">Restart</translation>
+<translation id="589817443623831496">Point scanning</translation>
 <translation id="5901316534475909376">Shift+Esc</translation>
 <translation id="5909862606227538307">Inactive desk.</translation>
 <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
+<translation id="5915278665499293471">Click anywhere to capture fullscreen</translation>
 <translation id="5916664084637901428">On</translation>
 <translation id="5920710855273935292">Mic is muted.</translation>
 <translation id="594179686076170922">Connecting to your phone...</translation>
@@ -534,6 +548,7 @@
 <translation id="6490471652906364588">USB-C device (right port)</translation>
 <translation id="649452524636452238">Smart card PIN</translation>
 <translation id="6501401484702599040">Casting screen to <ph name="RECEIVER_NAME" /></translation>
+<translation id="6520517963145875092">Select a window to capture</translation>
 <translation id="652139407789908527">Your screen will go blank for longer than usual (up to a minute) during this update. Please don't press the power button while the update is in progress.</translation>
 <translation id="6528179044667508675">Do not disturb</translation>
 <translation id="65320610082834431">Emojis</translation>
@@ -563,6 +578,7 @@
 <translation id="6751052314767925245">Enforced by your administrator</translation>
 <translation id="6751826523481687655">Performance tracing is turned on</translation>
 <translation id="6752912906630585008">Desk <ph name="REMOVED_DESK" /> removed and merged with Desk <ph name="RECEIVE_DESK" /></translation>
+<translation id="6757237461819837179">No media playing</translation>
 <translation id="6777216307882431711">Powering connected USB-C devices</translation>
 <translation id="6790428901817661496">Play</translation>
 <translation id="6803622936009808957">Could not mirror displays since no supported resolutions found. Entered extended desktop instead.</translation>
@@ -611,6 +627,7 @@
 <translation id="7348093485538360975">On-Screen Keyboard</translation>
 <translation id="735745346212279324">VPN disconnected</translation>
 <translation id="7377169924702866686">Caps Lock is on.</translation>
+<translation id="7378203170292176219">Drag to select an area to record</translation>
 <translation id="7378594059915113390">Media controls</translation>
 <translation id="7398254312354928459">Switched network connection</translation>
 <translation id="7405710164030118432">To unlock the device, enter your Family Link parent access code</translation>
@@ -638,6 +655,7 @@
 <translation id="7618774594543487847">Neutral</translation>
 <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation>
 <translation id="7633755430369750696">Show Nearby Share settings.</translation>
+<translation id="7641938616688887143">Record</translation>
 <translation id="7642647758716480637">Open settings for <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /></translation>
 <translation id="7645176681409127223"><ph name="USER_NAME" /> (owner)</translation>
 <translation id="7647488630410863958">Unlock device to view your notifications</translation>
@@ -734,6 +752,7 @@
 <translation id="8563862697512465947">Notification Settings</translation>
 <translation id="857201607579416096">Menu moved to the bottom-right corner of the screen.</translation>
 <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation>
+<translation id="861041328460089089">Tap anywhere to capture fullscreen</translation>
 <translation id="8627191004499078455">Connected to <ph name="DEVICE_NAME" /></translation>
 <translation id="8631727435199967028">Accessibility settings</translation>
 <translation id="8637598503828012618"><ph name="CONNECTION_STATUS" />, signal strength <ph name="SIGNAL_STRENGTH" />, managed by your administrator</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index e577fa3..4aa0b81 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166">Se está conectando <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">Salir de la sesión</translation>
 <translation id="5537725057119320332">Transmitir</translation>
-<translation id="5548285847212963613">La extensión "<ph name="EXTENSION_NAME" />" puede ayudarte a conectarte a la red.</translation>
 <translation id="554893713779400387">Activar o desactivar el dictado</translation>
 <translation id="556042886152191864">Botón</translation>
 <translation id="5571066253365925590">Bluetooth activado</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 38dc06a..6a615f7 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> se está conectando.</translation>
 <translation id="553675580533261935">Saliendo de la sesión</translation>
 <translation id="5537725057119320332">Enviar</translation>
-<translation id="5548285847212963613">La extensión "<ph name="EXTENSION_NAME" />" puede permitir conectarse a esta red.</translation>
 <translation id="554893713779400387">Activar o desactivar dictado</translation>
 <translation id="556042886152191864">Botón</translation>
 <translation id="5571066253365925590">Bluetooth habilitado</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 43fa74a..08ca835 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> loob ühendust.</translation>
 <translation id="553675580533261935">Seansist väljumine</translation>
 <translation id="5537725057119320332">Ülekanne</translation>
-<translation id="5548285847212963613">Laiendus „<ph name="EXTENSION_NAME" />” aitab selle võrguga ühenduse loomisel.</translation>
 <translation id="554893713779400387">Dikteerimise sisse-/väljalülitamine</translation>
 <translation id="556042886152191864">Nupp</translation>
 <translation id="5571066253365925590">Bluetooth on lubatud</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index 9846912..62b10f8 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> konektatzen ari da.</translation>
 <translation id="553675580533261935">Saiotik irteten</translation>
 <translation id="5537725057119320332">Igorri</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" luzapenak sare honetara konektatzen lagun dezake.</translation>
 <translation id="554893713779400387">Aktibatu/Desaktibatu diktaketa</translation>
 <translation id="556042886152191864">Botoia</translation>
 <translation id="5571066253365925590">Bluetooth-a gaitu da</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 15155c2..2b2e2dfb 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> درحال اتصال است.</translation>
 <translation id="553675580533261935">خروج از جلسه</translation>
 <translation id="5537725057119320332">فرستادن</translation>
-<translation id="5548285847212963613">افزونه «<ph name="EXTENSION_NAME" />» می‌تواند در اتصال به این شبکه به شما کمک کند.</translation>
 <translation id="554893713779400387">روشن/خاموش کردن املا</translation>
 <translation id="556042886152191864">دکمه</translation>
 <translation id="5571066253365925590">بلوتوث فعال شد</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 7d7abc2..6463c8e 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> muodostaa yhteyttä.</translation>
 <translation id="553675580533261935">Käyttökerran lopettaminen</translation>
 <translation id="5537725057119320332">Suoratoista</translation>
-<translation id="5548285847212963613">Laajennus <ph name="EXTENSION_NAME" /> voi auttaa muodostamaan yhteyden tähän verkkoon.</translation>
 <translation id="554893713779400387">Laita sanelu päälle tai pois päältä</translation>
 <translation id="556042886152191864">Painike</translation>
 <translation id="5571066253365925590">Bluetooth käytössä</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 5bd85e0..915683c 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Kumokonekta ang <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">Lumalabas sa session</translation>
 <translation id="5537725057119320332">I-cast</translation>
-<translation id="5548285847212963613">Maaaring makatulong na makakonekta sa network na ito ang extension na "<ph name="EXTENSION_NAME" />."</translation>
 <translation id="554893713779400387">I-toggle ang pagdidikta</translation>
 <translation id="556042886152191864">Pindutan</translation>
 <translation id="5571066253365925590">Pinapagana ang Bluetooth</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb
index 754608a..eb51b93 100644
--- a/ash/strings/ash_strings_fr-CA.xtb
+++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">La fonctionnalité <ph name="FEATURE_NAME" /> en train de se connecter.</translation>
 <translation id="553675580533261935">Fermeture de la session</translation>
 <translation id="5537725057119320332">Diffuser</translation>
-<translation id="5548285847212963613">L'extension « <ph name="EXTENSION_NAME" /> » peut faciliter la connexion à ce réseau.</translation>
 <translation id="554893713779400387">Activer/désactiver la dictée</translation>
 <translation id="556042886152191864">Bouton</translation>
 <translation id="5571066253365925590">Bluetooth activé</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index dba5896..27c0ad5 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> est en train de se connecter.</translation>
 <translation id="553675580533261935">Fermeture de la session</translation>
 <translation id="5537725057119320332">Caster</translation>
-<translation id="5548285847212963613">L'extension "<ph name="EXTENSION_NAME" />" peut aider à se connecter à ce réseau.</translation>
 <translation id="554893713779400387">Activer ou désactiver la dictée</translation>
 <translation id="556042886152191864">Bouton</translation>
 <translation id="5571066253365925590">Bluetooth activé</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb
index 68ad848..7b05bf1 100644
--- a/ash/strings/ash_strings_gl.xtb
+++ b/ash/strings/ash_strings_gl.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166">A función <ph name="FEATURE_NAME" /> estase conectando.</translation>
 <translation id="553675580533261935">Pechando sesión</translation>
 <translation id="5537725057119320332">Emitir</translation>
-<translation id="5548285847212963613">A extensión "<ph name="EXTENSION_NAME" />" pode axudar a conectarte a esta rede.</translation>
 <translation id="554893713779400387">Activar ou desactivar ditado</translation>
 <translation id="556042886152191864">Botón</translation>
 <translation id="5571066253365925590">Bluetooth activado</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 98bb5367..1526e364 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> કનેક્ટ થઈ રહ્યું છે.</translation>
 <translation id="553675580533261935">સત્રથી બહાર નીકળી રહ્યાં છે</translation>
 <translation id="5537725057119320332">કાસ્ટ કરો</translation>
-<translation id="5548285847212963613">વિસ્તાર "<ph name="EXTENSION_NAME" />" આ નેટવર્ક સાથે કનેક્ટ કરવામાં મદદ કરી શકે છે.</translation>
 <translation id="554893713779400387">શ્રુતલેખન ટૉગલ કરો</translation>
 <translation id="556042886152191864">બટન</translation>
 <translation id="5571066253365925590">Bluetooth સક્ષમ છે</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 5519adf..b2d727144 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> कनेक्ट हो रहा है.</translation>
 <translation id="553675580533261935">सत्र से बाहर निकलें</translation>
 <translation id="5537725057119320332">कास्‍ट करें</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" एक्‍सटेंशन इस नेटवर्क से कनेक्‍ट करने में सहायता कर सकता है.</translation>
 <translation id="554893713779400387">डिक्टेशन (आप जो बोलते हैं उसे लिखना) टॉगल करें</translation>
 <translation id="556042886152191864">बटन</translation>
 <translation id="5571066253365925590">ब्लूटूथ सक्षम किया गया</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index b324a0bb..576971da 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Značajka <ph name="FEATURE_NAME" /> se povezuje.</translation>
 <translation id="553675580533261935">Napuštanje sesije</translation>
 <translation id="5537725057119320332">Emitiraj</translation>
-<translation id="5548285847212963613">Proširenje "<ph name="EXTENSION_NAME" />" može pomoći pri povezivanju s tom mrežom.</translation>
 <translation id="554893713779400387">Uključivanje/isključivanje diktata</translation>
 <translation id="556042886152191864">Gumb</translation>
 <translation id="5571066253365925590">Bluetooth omogućen</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 9b860c1..d400edaa 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166">A(z) <ph name="FEATURE_NAME" /> csatlakozik.</translation>
 <translation id="553675580533261935">Kilépés a munkamenetből</translation>
 <translation id="5537725057119320332">Küldés</translation>
-<translation id="5548285847212963613">A(z) „<ph name="EXTENSION_NAME" />” bővítmény segíthet a hálózathoz való csatlakozásban.</translation>
 <translation id="554893713779400387">Diktálás váltása</translation>
 <translation id="556042886152191864">Gomb</translation>
 <translation id="5571066253365925590">Bluetooth engedélyezve</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb
index e8c7e3e4..2261f60 100644
--- a/ash/strings/ash_strings_hy.xtb
+++ b/ash/strings/ash_strings_hy.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">«<ph name="FEATURE_NAME" />» գործառույթը միանում է։</translation>
 <translation id="553675580533261935">Ելք աշխատաշրջանից</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">«<ph name="EXTENSION_NAME" />» կօգնի կապվել այս ցանցին:</translation>
 <translation id="554893713779400387">Միացնել/անջատել ձայնային ներածումը</translation>
 <translation id="556042886152191864">Կոճակ</translation>
 <translation id="5571066253365925590">Bluetooth-ը միացված է</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 791273a..545bcf4 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> sedang dihubungkan.</translation>
 <translation id="553675580533261935">Keluar dari sesi</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Ekstensi "<ph name="EXTENSION_NAME" />" dapat membantu menyambungkan ke jaringan ini.</translation>
 <translation id="554893713779400387">Aktifkan dikte</translation>
 <translation id="556042886152191864">Tombol</translation>
 <translation id="5571066253365925590">Bluetooth diaktifkan</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index a2b69e2..c66bd5b 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> tengist.</translation>
 <translation id="553675580533261935">Lokar lotu</translation>
 <translation id="5537725057119320332">Senda út</translation>
-<translation id="5548285847212963613">Viðbótin „<ph name="EXTENSION_NAME" />“ getur aðstoðað þig við að tengjast þessu neti.</translation>
 <translation id="554893713779400387">Kveikja og slökkva á upplestri</translation>
 <translation id="556042886152191864">Hnappur</translation>
 <translation id="5571066253365925590">Kveikt á Bluetooth</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index 71e93d9..fe0f3f0f 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166">La funzionalità <ph name="FEATURE_NAME" /> sta cercando di connettersi.</translation>
 <translation id="553675580533261935">Uscita dalla sessione</translation>
 <translation id="5537725057119320332">Trasmetti</translation>
-<translation id="5548285847212963613">L'estensione "<ph name="EXTENSION_NAME" />" può essere utile per il collegamento a questa rete.</translation>
 <translation id="554893713779400387">Attiva/disattiva la dettatura</translation>
 <translation id="556042886152191864">Pulsante</translation>
 <translation id="5571066253365925590">Bluetooth attivo</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index f3070ba..7f8efd15 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">התכונה <ph name="FEATURE_NAME" /> מתחברת.</translation>
 <translation id="553675580533261935">יציאה מההפעלה</translation>
 <translation id="5537725057119320332">העברה</translation>
-<translation id="5548285847212963613">התוסף "<ph name="EXTENSION_NAME" />" יכול לעזור בהתחברות אל הרשת הזו.</translation>
 <translation id="554893713779400387">הפעלת הכתבה או הפסקתה</translation>
 <translation id="556042886152191864">לחצן</translation>
 <translation id="5571066253365925590">‏Bluetooth מופעל</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 3955f3f..b98cfc5 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> を接続しています。</translation>
 <translation id="553675580533261935">セッションの終了</translation>
 <translation id="5537725057119320332">キャスト</translation>
-<translation id="5548285847212963613">拡張機能「<ph name="EXTENSION_NAME" />」はこのネットワークへの接続をサポートします。</translation>
 <translation id="554893713779400387">音声入力を切り替え</translation>
 <translation id="556042886152191864">ボタン</translation>
 <translation id="5571066253365925590">Bluetooth オン</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb
index 78c192f..47be0d5 100644
--- a/ash/strings/ash_strings_ka.xtb
+++ b/ash/strings/ash_strings_ka.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> უკავშირდება.</translation>
 <translation id="553675580533261935">მიმდინარეობს სესიიდან გამოსვლა</translation>
 <translation id="5537725057119320332">მაუწყებლობა</translation>
-<translation id="5548285847212963613">გაფართოებას „<ph name="EXTENSION_NAME" />“ ამ ქსელთან დაკავშირებაში დახმარება შეუძლია.</translation>
 <translation id="554893713779400387">კარნახის გადართვა</translation>
 <translation id="556042886152191864">ღილაკი</translation>
 <translation id="5571066253365925590">Bluetooth ჩართულია</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb
index 3e90a93..765e209 100644
--- a/ash/strings/ash_strings_kk.xtb
+++ b/ash/strings/ash_strings_kk.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> қосылуда.</translation>
 <translation id="553675580533261935">Сеанстан шығу</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" кеңейтімі осы желіге қосылуға көмектесуі мүмкін.</translation>
 <translation id="554893713779400387">Дауыстап оқуды қосу/өшіру</translation>
 <translation id="556042886152191864">Түйме</translation>
 <translation id="5571066253365925590">Bluetooth қосылды</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb
index 9fbf625..8cc740b 100644
--- a/ash/strings/ash_strings_km.xtb
+++ b/ash/strings/ash_strings_km.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> កំពុងភ្ជាប់។</translation>
 <translation id="553675580533261935">ការ​ចាកចេញ​ពី​សម័យ</translation>
 <translation id="5537725057119320332">ខាស</translation>
-<translation id="5548285847212963613">កម្មវិធីបន្ថែម "<ph name="EXTENSION_NAME" />" អាចជួយភ្ជាប់ទៅបណ្តាញនេះ។</translation>
 <translation id="554893713779400387">បិទ/បើក​ការសរសេរតាមអាន</translation>
 <translation id="556042886152191864">ប៊ូតុង</translation>
 <translation id="5571066253365925590">ប៊្លូធូសបានបើកដំណើរការ</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 1d6d4860..b15d215 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> ಅನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="553675580533261935">ಸೆಷನ್ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5537725057119320332">ಪಾತ್ರವರ್ಗ</translation>
-<translation id="5548285847212963613">ಈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು "<ph name="EXTENSION_NAME" />" ವಿಸ್ತರಣೆಯು ಸಹಾಯ ಮಾಡಬಹುದು.</translation>
 <translation id="554893713779400387">ಡಿಕ್ಟೇಶನ್ ಟಾಗಲ್ ಮಾಡಿ</translation>
 <translation id="556042886152191864">ಬಟನ್</translation>
 <translation id="5571066253365925590">ಬ್ಲೂಟೂತ್‌ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 2ddbcd5..843a1f52 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" />이 연결을 시도하는 중입니다.</translation>
 <translation id="553675580533261935">세션 종료</translation>
 <translation id="5537725057119320332">전송</translation>
-<translation id="5548285847212963613">확장 프로그램('<ph name="EXTENSION_NAME" />')을 사용하여 이 네트워크에 연결할 수 있습니다.</translation>
 <translation id="554893713779400387">음성기록 전환</translation>
 <translation id="556042886152191864">버튼</translation>
 <translation id="5571066253365925590">블루투스를 사용함</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index 04ac9e0..857e12a 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> туташууда.</translation>
 <translation id="553675580533261935">Учурдагы сеанс</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" кеңейтүүсү ушул тармакка туташууга жардам бериши мүмкүн.</translation>
 <translation id="554893713779400387">Үн менен жазууну күйгүзүү же өчүрүү</translation>
 <translation id="556042886152191864">Баскыч</translation>
 <translation id="5571066253365925590">Bluetooth иштетилди</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb
index 6d7c229..c52084e 100644
--- a/ash/strings/ash_strings_lo.xtb
+++ b/ash/strings/ash_strings_lo.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> ກຳລັງເຊື່ອມຕໍ່.</translation>
 <translation id="553675580533261935">ກໍາລັງອອກຈາກເຊດຊັນ</translation>
 <translation id="5537725057119320332">ຄາສທ໌</translation>
-<translation id="5548285847212963613">ສ່ວນ​ຂະ​ຫຍາຍ "<ph name="EXTENSION_NAME" />" ສາ​ມາດ​ຊ່ວຍ​ເຊື່ອມ​ຕໍ່​ເຄືອ​ຂ່າຍ​ນີ້.</translation>
 <translation id="554893713779400387">ເປີດປິດການຂຽນຕາມຄຳບອກ</translation>
 <translation id="556042886152191864">ປຸ່ມ</translation>
 <translation id="5571066253365925590">Bluetooth ເປີດໃຊ້ງານແລ້ວ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index feb378c..ae9e1ff 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">„<ph name="FEATURE_NAME" />“ prijungiama.</translation>
 <translation id="553675580533261935">Išeinama iš sesijos</translation>
 <translation id="5537725057119320332">Perduoti</translation>
-<translation id="5548285847212963613">Galite prisijungti prie šio tinklo naudodami plėtinį „<ph name="EXTENSION_NAME" />“.</translation>
 <translation id="554893713779400387">Perjungti diktavimą</translation>
 <translation id="556042886152191864">Mygtukas</translation>
 <translation id="5571066253365925590">„Bluetooth“ įgalinta</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index a40f8c0..a18a2f3 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Funkcijā “<ph name="FEATURE_NAME" />” notiek savienojuma izveide.</translation>
 <translation id="553675580533261935">Iziešana no sesijas</translation>
 <translation id="5537725057119320332">Apraidīt</translation>
-<translation id="5548285847212963613">Paplašinājums “<ph name="EXTENSION_NAME" />” var palīdzēt pievienoties šim tīklam.</translation>
 <translation id="554893713779400387">Pārslēgt diktēšanas režīmu</translation>
 <translation id="556042886152191864">Poga</translation>
 <translation id="5571066253365925590">Bluetooth iespējots</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb
index 85f34ba2..1f01a8f 100644
--- a/ash/strings/ash_strings_mk.xtb
+++ b/ash/strings/ash_strings_mk.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> се поврзува.</translation>
 <translation id="553675580533261935">Излегува од сесијата</translation>
 <translation id="5537725057119320332">Емитувај</translation>
-<translation id="5548285847212963613">Наставката „<ph name="EXTENSION_NAME" />“ може да помогне во поврзувањето со мрежава.</translation>
 <translation id="554893713779400387">Вклучи/исклучи диктат</translation>
 <translation id="556042886152191864">Копче</translation>
 <translation id="5571066253365925590">Bluetooth е овозможен</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 7acf043a..d872d259 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> കണക്റ്റ് ചെയ്യുന്നു.</translation>
 <translation id="553675580533261935">സെഷനിൽ നിന്ന് പുറത്തുകടക്കുന്നു</translation>
 <translation id="5537725057119320332">കാസ്റ്റ്</translation>
-<translation id="5548285847212963613">ഈ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാൻ "<ph name="EXTENSION_NAME" />" വിപുലീകരണത്തിന് സഹായിക്കാനാകും.</translation>
 <translation id="554893713779400387">പറഞ്ഞ് കൊടുക്കൽ മാറ്റുക</translation>
 <translation id="556042886152191864">ബട്ടൺ</translation>
 <translation id="5571066253365925590">Bluetooth പ്രവർത്തനക്ഷമമാക്കി</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb
index c45bb3b..41435b3 100644
--- a/ash/strings/ash_strings_mn.xtb
+++ b/ash/strings/ash_strings_mn.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> холбогдож байна.</translation>
 <translation id="553675580533261935">Харилцан үйлдлээс гарч байна</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Энэ өргөтгөл нь "<ph name="EXTENSION_NAME" />" энэ сүлжээнд холбогдоход тусална.</translation>
 <translation id="554893713779400387">Диктафоныг унтраах/асаах</translation>
 <translation id="556042886152191864">Товч</translation>
 <translation id="5571066253365925590">Bluetooth идэвхжсэн байна</translation>
@@ -505,7 +504,7 @@
 <translation id="607652042414456612">Таны компьютер ойролцоо байгаа Bluetooth төхөөрөмж дээр илрэх боломжтой бөгөөд <ph name="ADDRESS" /> хаяг бүхий "<ph name="NAME" />" нэрээр гарч ирэх болно.</translation>
 <translation id="612734058257491180">Зочны сургалтад Google Туслах боломжгүй байна.</translation>
 <translation id="615957422585914272">Дэлгэц дээрх гарыг харуулах</translation>
-<translation id="6164005077879661055">Хэрэв энэ хяналттай хэрэглэгчийг устгавал түүнтэй холбоотой бүх файлууд болон суурин өгөгдлүүд бүрмөсөн устах болно. Энэ хяналттай хэрэглэгчийн орж байсан вэб сайтууд болон тохиргоонуудыг <ph name="MANAGEMENT_URL" /> дэх менежер харах боломжтой байна.</translation>
+<translation id="6164005077879661055">Хэрэв энэ хяналттай хэрэглэгчийг устгавал түүнтэй холбоотой бүх файлууд болон суурин өгөгдлүүд бүрмөсөн устах болно. Энэ хяналттай хэрэглэгчийн орж байсан веб сайтууд болон тохиргоонуудыг <ph name="MANAGEMENT_URL" /> дэх менежер харах боломжтой байна.</translation>
 <translation id="6165508094623778733">Нэмэлт мэдээлэл авах</translation>
 <translation id="6192859646269780503">Утасны байршил тогтоох</translation>
 <translation id="622484624075952240">Бууруулсан жагсаалт</translation>
@@ -550,7 +549,7 @@
 <translation id="6637729079642709226">Цагийг өөрчлөх</translation>
 <translation id="6650933572246256093">"<ph name="DEVICE_NAME" />" bluetooth төхөөрөмж нь хослуулах зөвшөөрөл хүсч байна. Энэ төхөөрөмж дээр нэвтрэх түлхүүрийг оруулна уу: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Нууц үг</translation>
-<translation id="6665545700722362599">Вэб сайтууд, аппууд болон өргөтгөлүүдэд байршлын үйлчилгээ, төхөөрөмжийн микрофон, камер болон бусад онцлогийг ашиглахыг зөвшөөрөх</translation>
+<translation id="6665545700722362599">Веб сайтууд, аппууд болон өргөтгөлүүдэд байршлын үйлчилгээ, төхөөрөмжийн микрофон, камер болон бусад онцлогийг ашиглахыг зөвшөөрөх</translation>
 <translation id="6670153871843998651">Дэлгэц 3</translation>
 <translation id="6671495933530132209">Зургийг хуулах</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index bfa9591..bcf4a80 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> कनेक्ट करत आहे.</translation>
 <translation id="553675580533261935">सेशनमधून बाहेर पडत आहे</translation>
 <translation id="5537725057119320332">कास्ट करा</translation>
-<translation id="5548285847212963613">या नेटवर्कवर कनेक्ट करण्यात "<ph name="EXTENSION_NAME" />" एक्स्टेंशन मदत करू शकतो.</translation>
 <translation id="554893713779400387">डिक्टेशन टॉगल करा</translation>
 <translation id="556042886152191864">बटण</translation>
 <translation id="5571066253365925590">ब्लूटूथ सक्षम</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index 41be60e..f6f039f 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> sedang menyambung.</translation>
 <translation id="553675580533261935">Keluar daripada sesi</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Sambungan "<ph name="EXTENSION_NAME" />" boleh membantu menyambung ke rangkaian ini.</translation>
 <translation id="554893713779400387">Togol pengimlakan</translation>
 <translation id="556042886152191864">Butang</translation>
 <translation id="5571066253365925590">Bluetooth didayakan</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb
index e322f47..498ba0da 100644
--- a/ash/strings/ash_strings_my.xtb
+++ b/ash/strings/ash_strings_my.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> သည် ချိတ်ဆက်နေပါသည်။</translation>
 <translation id="553675580533261935">စက်ရှင်မှ ထွက်နေသည်</translation>
 <translation id="5537725057119320332">သရုပ်ဆောင်​များ</translation>
-<translation id="5548285847212963613">တိုးချဲ့လိုင်း "<ph name="EXTENSION_NAME" />" သည် ဤ ကွန်ယက်အား ချိတ်ဆက်ရန် ကူညီနိုင်သည်။</translation>
 <translation id="554893713779400387">အဖွင့်၊ အပိတ် ခလုတ်</translation>
 <translation id="556042886152191864">ခလုတ်</translation>
 <translation id="5571066253365925590">ဘလူးတုသ်ကို ဖွင့်ထား</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb
index b680182..21ce98d 100644
--- a/ash/strings/ash_strings_ne.xtb
+++ b/ash/strings/ash_strings_ne.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> कनेक्ट हुँदै छ।</translation>
 <translation id="553675580533261935">सत्रबाट बाहिर जाँदै</translation>
 <translation id="5537725057119320332">कास्ट गर्नु</translation>
-<translation id="5548285847212963613">विस्तार "<ph name="EXTENSION_NAME" />" ले यो नेटवर्कमा जडान गर्न मद्दत गर्न सक्छ।</translation>
 <translation id="554893713779400387">श्रुतिलेखन सुविधा टगल गर्नुहोस्</translation>
 <translation id="556042886152191864">बटन</translation>
 <translation id="5571066253365925590">ब्लुटूथ सक्षम भयो</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 073d124..7e6476c 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> maakt verbinding.</translation>
 <translation id="553675580533261935">Sessie sluiten</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Met de extensie '<ph name="EXTENSION_NAME" />' kun je verbinding maken met dit netwerk.</translation>
 <translation id="554893713779400387">Dicteren in-/uitschakelen</translation>
 <translation id="556042886152191864">Knop</translation>
 <translation id="5571066253365925590">Bluetooth ingeschakeld</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index a227f52..4c2a57c 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> kobler til.</translation>
 <translation id="553675580533261935">Avslutning av økten</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Utvidelsen «<ph name="EXTENSION_NAME" />» kan hjelpe deg med å koble deg til dette nettverket.</translation>
 <translation id="554893713779400387">Slå av/på diktering</translation>
 <translation id="556042886152191864">Knapp</translation>
 <translation id="5571066253365925590">Bluetooth er aktivert</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb
index e242509..16e00bf 100644
--- a/ash/strings/ash_strings_or.xtb
+++ b/ash/strings/ash_strings_or.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" />କୁ ସଂଯୋଗ କରାଯାଉଛି।</translation>
 <translation id="553675580533261935">ସମୟ ଅବଧିରୁ ପ୍ରସ୍ଥାନ କରୁଛି</translation>
 <translation id="5537725057119320332">କାଷ୍ଟ</translation>
-<translation id="5548285847212963613">ଏହି ନେଟ୍‌ୱର୍କ ସହ ସଂଯୋଗ କରିବାରେ "<ph name="EXTENSION_NAME" />" ଏକ୍ସଟେନ୍‌ସନ୍ ସାହାଯ୍ୟ କରିପାରେ।</translation>
 <translation id="554893713779400387">ଶ୍ରୁତଲିଖନକୁ ଟୋଗଲ୍ କରନ୍ତୁ</translation>
 <translation id="556042886152191864">ବଟନ୍</translation>
 <translation id="5571066253365925590">ବ୍ଲୁଟୁଥ୍‌ ସକ୍ଷମ ଅଛି</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index 4fa513fd..d68031ba 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation>
 <translation id="553675580533261935">ਸੈਸ਼ਨ ਤੋਂ ਬਾਹਰ ਜਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="5537725057119320332">ਕਾਸਟ ਕਰੋ</translation>
-<translation id="5548285847212963613">ਐਕਸਟੈਂਸ਼ਨ "<ph name="EXTENSION_NAME" />" ਇਸ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦੀ ਹੈ।</translation>
 <translation id="554893713779400387">ਬੋਲ ਅਨੁਸਾਰ ਲਿਖਤ ਨੂੰ ਟੌਗਲ ਕਰੋ</translation>
 <translation id="556042886152191864">ਬਟਨ</translation>
 <translation id="5571066253365925590">ਬਲੂਟੁੱਥ ਸਮਰਥਿਤ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index ec37f415..ee85716 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Funkcja <ph name="FEATURE_NAME" /> nawiązuje połączenie.</translation>
 <translation id="553675580533261935">Zamykanie sesji</translation>
 <translation id="5537725057119320332">Przesyłaj</translation>
-<translation id="5548285847212963613">Rozszerzenie „<ph name="EXTENSION_NAME" />” może ułatwić połączenie z tą siecią.</translation>
 <translation id="554893713779400387">Włącz lub wyłącz dyktowanie</translation>
 <translation id="556042886152191864">Przycisk</translation>
 <translation id="5571066253365925590">Bluetooth włączony</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 093c97c1..795cd8d2 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">O recurso <ph name="FEATURE_NAME" /> está se conectando.</translation>
 <translation id="553675580533261935">Saindo da sessão</translation>
 <translation id="5537725057119320332">Transmitir</translation>
-<translation id="5548285847212963613">A extensão "<ph name="EXTENSION_NAME" />" pode ajudar na conexão com esta rede.</translation>
 <translation id="554893713779400387">Alternar para o ditado</translation>
 <translation id="556042886152191864">Botão</translation>
 <translation id="5571066253365925590">Bluetooth ativado</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index b04a6c56..c94c353 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">A funcionalidade <ph name="FEATURE_NAME" /> está a estabelecer ligação.</translation>
 <translation id="553675580533261935">A sair da sessão…</translation>
 <translation id="5537725057119320332">Transmitir</translation>
-<translation id="5548285847212963613">A extensão "<ph name="EXTENSION_NAME" />" pode ajudar a estabelecer ligação a esta rede.</translation>
 <translation id="554893713779400387">Ativar/desativar o ditado</translation>
 <translation id="556042886152191864">Botão</translation>
 <translation id="5571066253365925590">Bluetooth ativado</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index ce1570b5..cfb9545 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Opțiunea <ph name="FEATURE_NAME" /> se conectează.</translation>
 <translation id="553675580533261935">Se iese din sesiune</translation>
 <translation id="5537725057119320332">Proiectează</translation>
-<translation id="5548285847212963613">Extensia „<ph name="EXTENSION_NAME" />” te poate ajuta să te conectezi la această rețea.</translation>
 <translation id="554893713779400387">Activează/dezactivează dictarea</translation>
 <translation id="556042886152191864">Buton</translation>
 <translation id="5571066253365925590">Bluetooth activat</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 3b2db5b..6f79800 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Функция "<ph name="FEATURE_NAME" />" выполняет подключение.</translation>
 <translation id="553675580533261935">Завершение сеанса</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Подключиться к этой сети можно с помощью расширения "<ph name="EXTENSION_NAME" />".</translation>
 <translation id="554893713779400387">Включение голосового ввода</translation>
 <translation id="556042886152191864">Кнопка</translation>
 <translation id="5571066253365925590">Bluetooth включен</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb
index a723904..1f23e3ac 100644
--- a/ash/strings/ash_strings_si.xtb
+++ b/ash/strings/ash_strings_si.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> සම්බන්ධ වෙමින්.</translation>
 <translation id="553675580533261935">සැසියෙන් ඉවත් වෙමින්</translation>
 <translation id="5537725057119320332">විකාශය</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" දිගුවට මෙම ජාලයට සම්බන්ධ වීමට හැකිය.</translation>
 <translation id="554893713779400387">අනුලේඛනය ටොගල් කරන්න</translation>
 <translation id="556042886152191864">බොත්තම</translation>
 <translation id="5571066253365925590">Bluetooth සක්‍රීයයි</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 0eb8368..1545c6f 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> sa pripája.</translation>
 <translation id="553675580533261935">Ukončuje sa relácia</translation>
 <translation id="5537725057119320332">Prenášať</translation>
-<translation id="5548285847212963613">Rozšírenie <ph name="EXTENSION_NAME" /> vám môže pomôcť pripojiť sa k tejto sieti.</translation>
 <translation id="554893713779400387">Prepnúť diktovanie</translation>
 <translation id="556042886152191864">Tlačidlo</translation>
 <translation id="5571066253365925590">Rozhranie Bluetooth je povolené</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index bf422ff..d608f51f 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">Vzpostavljanje povezave s funkcijo <ph name="FEATURE_NAME" />.</translation>
 <translation id="553675580533261935">Odjava iz seje</translation>
 <translation id="5537725057119320332">Predvajanje</translation>
-<translation id="5548285847212963613">Razširitev »<ph name="EXTENSION_NAME" />« lahko pomaga vzpostavi povezavo s tem omrežjem.</translation>
 <translation id="554893713779400387">Preklop narekovanja</translation>
 <translation id="556042886152191864">Gumb</translation>
 <translation id="5571066253365925590">Bluetooth omogočen</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb
index 6616107..0599b0f 100644
--- a/ash/strings/ash_strings_sq.xtb
+++ b/ash/strings/ash_strings_sq.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> po lidhet.</translation>
 <translation id="553675580533261935">Po del nga seanca</translation>
 <translation id="5537725057119320332">Transmeto</translation>
-<translation id="5548285847212963613">Shtesa "<ph name="EXTENSION_NAME" />" mund të ndihmojë në lidhjen me këtë rrjet.</translation>
 <translation id="554893713779400387">Ndërro diktimin</translation>
 <translation id="556042886152191864">Buton</translation>
 <translation id="5571066253365925590">Bluetooth-i u aktivizua</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb
index 81f0db2..4be9b60b1 100644
--- a/ash/strings/ash_strings_sr-Latn.xtb
+++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> se povezuje.</translation>
 <translation id="553675580533261935">Napuštanje sesije</translation>
 <translation id="5537725057119320332">Prebacuj</translation>
-<translation id="5548285847212963613">Dodatak „<ph name="EXTENSION_NAME" />“ može da pomogne u povezivanju sa ovom mrežom.</translation>
 <translation id="554893713779400387">Uključi/isključi diktiranje</translation>
 <translation id="556042886152191864">Dugme</translation>
 <translation id="5571066253365925590">Bluetooth je omogućen</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index a6c43c6..6795f23 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> се повезује.</translation>
 <translation id="553675580533261935">Напуштање сесије</translation>
 <translation id="5537725057119320332">Пребацуј</translation>
-<translation id="5548285847212963613">Додатак „<ph name="EXTENSION_NAME" />“ може да помогне у повезивању са овом мрежом.</translation>
 <translation id="554893713779400387">Укључи/искључи диктирање</translation>
 <translation id="556042886152191864">Дугме</translation>
 <translation id="5571066253365925590">Bluetooth је омогућен</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index f9606ca..4473e76 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> ansluter.</translation>
 <translation id="553675580533261935">Sessionen avslutas</translation>
 <translation id="5537725057119320332">Casta</translation>
-<translation id="5548285847212963613">Tillägget <ph name="EXTENSION_NAME" /> kan hjälpa till med att ansluta till nätverket.</translation>
 <translation id="554893713779400387">Aktivera och inaktivera diktamen</translation>
 <translation id="556042886152191864">Knapp</translation>
 <translation id="5571066253365925590">Bluetooth aktiverad</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 756fd758..e14913d 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> inaunganishwa.</translation>
 <translation id="553675580533261935">Unaondoka kwenye kipindi</translation>
 <translation id="5537725057119320332">Tuma</translation>
-<translation id="5548285847212963613">Kiendelezi "<ph name="EXTENSION_NAME" />" kinaweza kusaidia kuunganisha kwenye mtandao huu.</translation>
 <translation id="554893713779400387">Kuwasha au kuzima huduma ya matamshi</translation>
 <translation id="556042886152191864">Kitufe</translation>
 <translation id="5571066253365925590">Bluetooth imewezeshwa</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index cdf041e..dfcd30b4 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> இணைக்கப்படுகிறது.</translation>
 <translation id="553675580533261935">அமர்விலிருந்து வெளியேறுதல்</translation>
 <translation id="5537725057119320332">அலைபரப்பு</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" என்ற நீட்டிப்பு இந்த நெட்வொர்க்குடன் இணைய உதவும்.</translation>
 <translation id="554893713779400387">சொல்வதை எழுதுவதை நிலைமாற்று</translation>
 <translation id="556042886152191864">பொத்தான்</translation>
 <translation id="5571066253365925590">புளூடூத் இயக்கப்பட்டது</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 5be1378..8779983 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -444,7 +444,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> కనెక్ట్ అవుతోంది.</translation>
 <translation id="553675580533261935">సెషన్ నుండి నిష్క్రమిస్తోంది</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" ఎక్స్‌టెన్షన్ ఈ నెట్‌వర్క్‌కు కనెక్ట్ చేయడంలో సహాయపడగలదు.</translation>
 <translation id="554893713779400387">డిక్టేషన్‌ను టోగుల్ చేయి</translation>
 <translation id="556042886152191864">బటన్</translation>
 <translation id="5571066253365925590">బ్లూటూత్‌ ప్రారంభించబడింది</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 98f9fab..b2b1530 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> กำลังเชื่อมต่อ</translation>
 <translation id="553675580533261935">กำลังออกจากเซสชัน</translation>
 <translation id="5537725057119320332">แคสต์</translation>
-<translation id="5548285847212963613">ส่วนขยาย "<ph name="EXTENSION_NAME" />" สามารถช่วยในการเชื่อมต่อเครือข่ายนี้</translation>
 <translation id="554893713779400387">สลับการเขียนตามคำบอก</translation>
 <translation id="556042886152191864">ปุ่ม</translation>
 <translation id="5571066253365925590">เปิดใช้งานบลูทูธแล้ว</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index f4fe0da..74e28e5 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> bağlanıyor.</translation>
 <translation id="553675580533261935">Oturum kapatılıyor</translation>
 <translation id="5537725057119320332">Yayınla</translation>
-<translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" uzantısı bu ağa bağlanmaya yardımcı olabilir.</translation>
 <translation id="554893713779400387">Dikte özelliğini aç/kapat</translation>
 <translation id="556042886152191864">Düğme</translation>
 <translation id="5571066253365925590">Bluetooth etkin</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 7ef0d4c..319fc66 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> підключається.</translation>
 <translation id="553675580533261935">Завершення сеансу</translation>
 <translation id="5537725057119320332">Трансляція</translation>
-<translation id="5548285847212963613">За допомогою розширення <ph name="EXTENSION_NAME" /> можна під’єднуватися до цієї мережі.</translation>
 <translation id="554893713779400387">Перемкнути диктування</translation>
 <translation id="556042886152191864">Кнопка</translation>
 <translation id="5571066253365925590">Bluetooth увімкнено</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index b9aeee2..4e489b9 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> منسلک ہو رہی ہے۔</translation>
 <translation id="553675580533261935">سیشن سے باہر نکل رہے ہیں</translation>
 <translation id="5537725057119320332">کاسٹ کریں</translation>
-<translation id="5548285847212963613">ایکسٹینشن "<ph name="EXTENSION_NAME" />" اس نیٹ ورک سے منسلک ہونے میں مدد کر سکتا ہے۔</translation>
 <translation id="554893713779400387">ڈکٹیشن ٹوگل کریں</translation>
 <translation id="556042886152191864">بٹن</translation>
 <translation id="5571066253365925590">بلوٹوتھ فعال ہے</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index e4c793c..079859c 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> ulanmoqda.</translation>
 <translation id="553675580533261935">Seans yakunlanmoqda</translation>
 <translation id="5537725057119320332">Cast</translation>
-<translation id="5548285847212963613">Ushbu tarmoqqa “<ph name="EXTENSION_NAME" />” kengaytmasi yordamida o‘tib olish mumkin.</translation>
 <translation id="554893713779400387">Diktovkani yoqish</translation>
 <translation id="556042886152191864">Tugma</translation>
 <translation id="5571066253365925590">Bluetooth yoniq</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 991f7c8..1e7a32cd 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> đang kết nối.</translation>
 <translation id="553675580533261935">Thoát phiên</translation>
 <translation id="5537725057119320332">Truyền</translation>
-<translation id="5548285847212963613">Tiện ích "<ph name="EXTENSION_NAME" />" có thể giúp kết nối với mạng này.</translation>
 <translation id="554893713779400387">Bật/tắt tính năng nhập bằng giọng nói</translation>
 <translation id="556042886152191864">Nút</translation>
 <translation id="5571066253365925590">Đã bật bluetooth</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index ed7ef5c..3677381 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">“<ph name="FEATURE_NAME" />”正在连接。</translation>
 <translation id="553675580533261935">退出会话</translation>
 <translation id="5537725057119320332">投射</translation>
-<translation id="5548285847212963613">扩展程序“<ph name="EXTENSION_NAME" />”可帮助连接到此网络。</translation>
 <translation id="554893713779400387">开启/关闭语音输入</translation>
 <translation id="556042886152191864">按钮</translation>
 <translation id="5571066253365925590">蓝牙已启用</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb
index 0f587834..724f4fd 100644
--- a/ash/strings/ash_strings_zh-HK.xtb
+++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">「<ph name="FEATURE_NAME" />」正在連線。</translation>
 <translation id="553675580533261935">正在結束工作階段</translation>
 <translation id="5537725057119320332">投放</translation>
-<translation id="5548285847212963613">擴充程式「<ph name="EXTENSION_NAME" />」可用來連線至此網絡。</translation>
 <translation id="554893713779400387">切換語音輸入</translation>
 <translation id="556042886152191864">按鈕</translation>
 <translation id="5571066253365925590">藍牙已啟用</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 43bba9c..2ade30f7 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">「<ph name="FEATURE_NAME" />」正在連線。</translation>
 <translation id="553675580533261935">結束工作階段</translation>
 <translation id="5537725057119320332">投放</translation>
-<translation id="5548285847212963613">「<ph name="EXTENSION_NAME" />」擴充功能可協助連線至這個網路。</translation>
 <translation id="554893713779400387">切換語音輸入</translation>
 <translation id="556042886152191864">按鈕</translation>
 <translation id="5571066253365925590">藍牙已啟用</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb
index 4b30314ac..ae04fb7 100644
--- a/ash/strings/ash_strings_zu.xtb
+++ b/ash/strings/ash_strings_zu.xtb
@@ -443,7 +443,6 @@
 <translation id="5523434445161341166">I-<ph name="FEATURE_NAME" /> iyaxhumeka.</translation>
 <translation id="553675580533261935">Iphuma kuseshini</translation>
 <translation id="5537725057119320332">Sakaza</translation>
-<translation id="5548285847212963613">Isandiso esingu-"<ph name="EXTENSION_NAME" />" singasiza ukuxhumeka kule nethiwekhi.</translation>
 <translation id="554893713779400387">Guqula ukuthola</translation>
 <translation id="556042886152191864">Inkinobho</translation>
 <translation id="5571066253365925590">I-Bluetooth inikwe amandla</translation>
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 859ccb21..0438b0cc 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1290,19 +1290,23 @@
       "allocator/allocator_shim.cc",
       "allocator/allocator_shim.h",
       "allocator/allocator_shim_internals.h",
-      "allocator/allocator_shim_override_cpp_symbols.h",
-      "allocator/allocator_shim_override_libc_symbols.h",
     ]
     if (is_android) {
-      sources +=
-          [ "allocator/allocator_shim_override_linker_wrapped_symbols.h" ]
+      sources += [
+        "allocator/allocator_shim_override_cpp_symbols.h",
+        "allocator/allocator_shim_override_linker_wrapped_symbols.h",
+      ]
       all_dependent_configs += [ "//base/allocator:wrap_malloc_symbols" ]
     }
     if (is_apple) {
       sources += [ "allocator/allocator_shim_override_mac_symbols.h" ]
     }
     if (is_chromeos || is_linux) {
-      sources += [ "allocator/allocator_shim_override_glibc_weak_symbols.h" ]
+      sources += [
+        "allocator/allocator_shim_override_cpp_symbols.h",
+        "allocator/allocator_shim_override_glibc_weak_symbols.h",
+        "allocator/allocator_shim_override_libc_symbols.h",
+      ]
     }
     if (is_win) {
       sources += [
@@ -2135,7 +2139,6 @@
       "trace_event/optional_trace_event.h",
       "trace_event/process_memory_dump.cc",
       "trace_event/process_memory_dump.h",
-      "trace_event/task_execution_macros.h",
       "trace_event/thread_instruction_count.cc",
       "trace_event/thread_instruction_count.h",
       "trace_event/trace_arguments.cc",
diff --git a/base/allocator/BUILD.gn b/base/allocator/BUILD.gn
index 2ca6714..62206dd 100644
--- a/base/allocator/BUILD.gn
+++ b/base/allocator/BUILD.gn
@@ -306,8 +306,14 @@
     "-Wl,-wrap,realloc",
     "-Wl,-wrap,valloc",
 
+    # <stdlib.h> functions
+    "-Wl,-wrap,realpath",
+
     # <string.h> functions
     "-Wl,-wrap,strdup",
     "-Wl,-wrap,strndup",
+
+    # <unistd.h> functions
+    "-Wl,-wrap,getcwd",
   ]
 }
diff --git a/base/allocator/allocator_shim_override_linker_wrapped_symbols.h b/base/allocator/allocator_shim_override_linker_wrapped_symbols.h
index 367db78..e2c6a68 100644
--- a/base/allocator/allocator_shim_override_linker_wrapped_symbols.h
+++ b/base/allocator/allocator_shim_override_linker_wrapped_symbols.h
@@ -54,6 +54,26 @@
   return ShimValloc(size, nullptr);
 }
 
+const size_t kPathMaxSize = 8192;
+static_assert(kPathMaxSize >= PATH_MAX, "");
+
+extern char* __wrap_strdup(const char* str);
+
+// Override <stdlib.h>
+
+extern char* __real_realpath(const char* path, char* resolved_path);
+
+SHIM_ALWAYS_EXPORT char* __wrap_realpath(const char* path,
+                                         char* resolved_path) {
+  if (resolved_path)
+    return __real_realpath(path, resolved_path);
+
+  char buffer[kPathMaxSize];
+  if (!__real_realpath(path, buffer))
+    return nullptr;
+  return __wrap_strdup(buffer);
+}
+
 // Override <string.h> functions
 
 SHIM_ALWAYS_EXPORT char* __wrap_strdup(const char* str) {
@@ -74,4 +94,20 @@
   return buffer;
 }
 
+// Override <unistd.h>
+
+extern char* __real_getcwd(char* buffer, size_t size);
+
+SHIM_ALWAYS_EXPORT char* __wrap_getcwd(char* buffer, size_t size) {
+  if (buffer)
+    return __real_getcwd(buffer, size);
+
+  if (!size)
+    size = kPathMaxSize;
+  char local_buffer[size];
+  if (!__real_getcwd(local_buffer, size))
+    return nullptr;
+  return __wrap_strdup(local_buffer);
+}
+
 }  // extern "C"
diff --git a/base/allocator/allocator_shim_unittest.cc b/base/allocator/allocator_shim_unittest.cc
index b8631a3..2c4dbc2 100644
--- a/base/allocator/allocator_shim_unittest.cc
+++ b/base/allocator/allocator_shim_unittest.cc
@@ -637,6 +637,15 @@
 
   InsertAllocatorDispatch(&g_mock_dispatch);
 
+  // <stdlib.h>
+  counts_before = counts_after;
+  ptr = realpath(".", nullptr);
+  EXPECT_NE(nullptr, ptr);
+  free(ptr);
+  counts_after = total_counts(allocs_intercepted_by_size);
+  EXPECT_GT(counts_after, counts_before);
+
+  // <string.h>
   counts_before = counts_after;
   ptr = strdup("hello, world");
   EXPECT_NE(nullptr, ptr);
@@ -651,6 +660,14 @@
   counts_after = total_counts(allocs_intercepted_by_size);
   EXPECT_GT(counts_after, counts_before);
 
+  // <unistd.h>
+  counts_before = counts_after;
+  ptr = getcwd(nullptr, 0);
+  EXPECT_NE(nullptr, ptr);
+  free(ptr);
+  counts_after = total_counts(allocs_intercepted_by_size);
+  EXPECT_GT(counts_after, counts_before);
+
   RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
 }
 #endif  // defined(OS_ANDROID)
diff --git a/base/allocator/partition_allocator/partition_alloc.h b/base/allocator/partition_allocator/partition_alloc.h
index c47fa566..cb83aef 100644
--- a/base/allocator/partition_allocator/partition_alloc.h
+++ b/base/allocator/partition_allocator/partition_alloc.h
@@ -561,6 +561,17 @@
     return total_size_of_committed_pages;
   }
 
+  ALWAYS_INLINE internal::PartitionTag GetNewPartitionTag() {
+#if ENABLE_TAG_FOR_CHECKED_PTR2 || ENABLE_TAG_FOR_MTE_CHECKED_PTR
+    auto tag = ++current_partition_tag;
+    tag += !tag;  // Avoid 0.
+    current_partition_tag = tag;
+    return tag;
+#else
+    return 0;
+#endif
+  }
+
  private:
   // Allocates memory, without any cookies / tags.
   //
@@ -579,17 +590,6 @@
                                       bool* is_already_zeroed)
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
-  ALWAYS_INLINE internal::PartitionTag GetNewPartitionTag() {
-#if ENABLE_TAG_FOR_CHECKED_PTR2 || ENABLE_TAG_FOR_MTE_CHECKED_PTR
-    auto tag = ++current_partition_tag;
-    tag += !tag;  // Avoid 0.
-    current_partition_tag = tag;
-    return tag;
-#else
-    return 0;
-#endif
-  }
-
   bool ReallocDirectMappedInPlace(internal::PartitionPage<thread_safe>* page,
                                   size_t requested_size)
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
@@ -707,8 +707,6 @@
   PA_DCHECK(IsValidPage(page));
 
   if (allow_extras) {
-    size_t allocated_size = page->GetAllocatedSize();
-
     // |ptr| points after the tag and the cookie.
     // The layout is | tag or ref count | cookie | data | cookie |
     //               ^                           ^
@@ -719,6 +717,8 @@
         internal::PartitionPointerAdjustSubtract(true /* allow_extras */, ptr);
 
 #if DCHECK_IS_ON()
+    size_t allocated_size = page->GetAllocatedSize();
+
     void* start_cookie_ptr =
         internal::PartitionCookiePointerAdjustSubtract(ptr);
     void* end_cookie_ptr = internal::PartitionCookiePointerAdjustSubtract(
@@ -730,12 +730,17 @@
 #endif
 
     if (!page->bucket->is_direct_mapped()) {
-      size_t size_with_no_extras =
-          internal::PartitionSizeAdjustSubtract(true, allocated_size);
+      // PartitionTagIncrementValue and PartitionTagClearValue require that the
+      // size is tag_bitmap::kBytesPerPartitionTag-aligned (currently 16
+      // bytes-aligned) when MTECheckedPtr is enabled. However, allocated_size
+      // may not be aligned for single-slot slot spans. So we need the bucket's
+      // slot_size.
+      size_t slot_size_with_no_extras =
+          internal::PartitionSizeAdjustSubtract(true, page->bucket->slot_size);
 #if ENABLE_TAG_FOR_MTE_CHECKED_PTR && MTE_CHECKED_PTR_SET_TAG_AT_FREE
-      internal::PartitionTagIncrementValue(ptr, size_with_no_extras);
+      internal::PartitionTagIncrementValue(ptr, slot_size_with_no_extras);
 #else
-      internal::PartitionTagClearValue(ptr, size_with_no_extras);
+      internal::PartitionTagClearValue(ptr, slot_size_with_no_extras);
 #endif
 
 #if ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR
@@ -1080,8 +1085,12 @@
     // Do not set tag for MTECheckedPtr in the set-tag-at-free case.
     // It is set only at Free() time and at slot span allocation time.
 #if !ENABLE_TAG_FOR_MTE_CHECKED_PTR || !MTE_CHECKED_PTR_SET_TAG_AT_FREE
-    size_t slot_size_with_no_extras =
-        internal::PartitionSizeAdjustSubtract(allow_extras, allocated_size);
+    // PartitionTagSetValue requires that the size is
+    // tag_bitmap::kBytesPerPartitionTag-aligned (currently 16 bytes-aligned)
+    // when MTECheckedPtr is enabled. However, allocated_size may not be aligned
+    // for single-slot slot spans. So we need the bucket's slot_size.
+    size_t slot_size_with_no_extras = internal::PartitionSizeAdjustSubtract(
+        allow_extras, buckets[bucket_index].slot_size);
     internal::PartitionTagSetValue(ret, slot_size_with_no_extras,
                                    GetNewPartitionTag());
 #endif  // !ENABLE_TAG_FOR_MTE_CHECKED_PTR || !MTE_CHECKED_PTR_SET_TAG_AT_FREE
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index b687f35..9b09690b 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -417,7 +417,7 @@
   EXPECT_EQ(kPointerOffset,
             reinterpret_cast<size_t>(ptr) & PartitionPageOffsetMask());
   // Check that the offset appears to include a guard page.
-  EXPECT_EQ(PartitionPageSize() + kPointerOffset + kReservedTagBitmapSize,
+  EXPECT_EQ(PartitionPageSize() + kPointerOffset + ReservedTagBitmapSize(),
             reinterpret_cast<size_t>(ptr) & kSuperPageOffsetMask);
 
   allocator.root()->Free(ptr);
@@ -630,7 +630,7 @@
   size_t num_pages_per_slot_span = GetNumPagesPerSlotSpan(kTestAllocSize);
   // 1 SuperPage has 2 guard PartitionPages.
   size_t num_slot_span_needed =
-      (NumPartitionPagesPerSuperPage() - kNumPartitionPagesPerTagBitmap - 2) /
+      (NumPartitionPagesPerSuperPage() - NumPartitionPagesPerTagBitmap() - 2) /
       num_pages_per_slot_span;
 
   // This is guaranteed to cross a super page boundary because the first
@@ -659,7 +659,7 @@
           reinterpret_cast<uintptr_t>(storage_ptr) & kSuperPageOffsetMask;
       EXPECT_FALSE(second_super_page_base == first_super_page_base);
       // Check that we allocated a guard page for the second page.
-      EXPECT_EQ(PartitionPageSize() + kReservedTagBitmapSize,
+      EXPECT_EQ(PartitionPageSize() + ReservedTagBitmapSize(),
                 second_super_page_offset);
     }
   }
@@ -1265,7 +1265,7 @@
   // The -2 is because the first and last partition pages in a super page are
   // guard pages.
   size_t num_slot_span_needed =
-      (NumPartitionPagesPerSuperPage() - kNumPartitionPagesPerTagBitmap - 2) /
+      (NumPartitionPagesPerSuperPage() - NumPartitionPagesPerTagBitmap() - 2) /
       num_pages_per_slot_span;
   size_t num_partition_pages_needed =
       num_slot_span_needed * num_pages_per_slot_span;
@@ -1283,9 +1283,9 @@
 
   char* page_base = reinterpret_cast<char*>(
       PartitionRoot<ThreadSafe>::Page::ToPointer(first_super_page_pages[0]));
-  EXPECT_EQ(PartitionPageSize() + kReservedTagBitmapSize,
+  EXPECT_EQ(PartitionPageSize() + ReservedTagBitmapSize(),
             reinterpret_cast<uintptr_t>(page_base) & kSuperPageOffsetMask);
-  page_base -= PartitionPageSize() - kReservedTagBitmapSize;
+  page_base -= PartitionPageSize() - ReservedTagBitmapSize();
   // Map a single system page either side of the mapping for our allocations,
   // with the goal of tripping up alignment of the next mapping.
   void* map1 = AllocPages(
@@ -1305,9 +1305,9 @@
 
   page_base = reinterpret_cast<char*>(
       PartitionRoot<ThreadSafe>::Page::ToPointer(second_super_page_pages[0]));
-  EXPECT_EQ(PartitionPageSize() + kReservedTagBitmapSize,
+  EXPECT_EQ(PartitionPageSize() + ReservedTagBitmapSize(),
             reinterpret_cast<uintptr_t>(page_base) & kSuperPageOffsetMask);
-  page_base -= PartitionPageSize() - kReservedTagBitmapSize;
+  page_base -= PartitionPageSize() - ReservedTagBitmapSize();
   // Map a single system page either side of the mapping for our allocations,
   // with the goal of tripping up alignment of the next mapping.
   map1 = AllocPages(page_base - PageAllocationGranularity(),
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc
index fdc42ecb..1748c71 100644
--- a/base/allocator/partition_allocator/partition_bucket.cc
+++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -240,7 +240,7 @@
       char* super_page = reinterpret_cast<char*>(
           reinterpret_cast<uintptr_t>(ret) & kSuperPageBaseMask);
       char* tag_bitmap = super_page + PartitionPageSize();
-      PA_DCHECK(next_tag_bitmap_page <= tag_bitmap + kActualTagBitmapSize);
+      PA_DCHECK(next_tag_bitmap_page <= tag_bitmap + ActualTagBitmapSize());
       PA_DCHECK(next_tag_bitmap_page > tag_bitmap);
 #endif
       SetSystemPagesAccess(root->next_tag_bitmap_page,
@@ -287,7 +287,7 @@
   // TODO(tasak): Consider starting the bitmap right after metadata to save
   // space.
   char* tag_bitmap = super_page + PartitionPageSize();
-  char* quarantine_bitmaps = tag_bitmap + kReservedTagBitmapSize;
+  char* quarantine_bitmaps = tag_bitmap + ReservedTagBitmapSize();
   const size_t quarantine_bitmaps_size =
       root->pcscan ? 2 * sizeof(QuarantineBitmap) : 0;
   PA_DCHECK(quarantine_bitmaps_size % PartitionPageSize() == 0);
@@ -317,7 +317,7 @@
       bits::Align(reinterpret_cast<uintptr_t>(
                       PartitionTagPointer(root->next_partition_page)),
                   SystemPageSize()));
-  PA_DCHECK(next_tag_bitmap_page <= tag_bitmap + kActualTagBitmapSize);
+  PA_DCHECK(next_tag_bitmap_page <= tag_bitmap + ActualTagBitmapSize());
   PA_DCHECK(next_tag_bitmap_page > tag_bitmap);
   // |ret| points at the end of the tag bitmap.
   PA_DCHECK(next_tag_bitmap_page <= ret);
@@ -340,9 +340,9 @@
   // TODO(ajwong): Refactor Page Allocator API so the SuperPage comes in
   // decommited initially.
   SetSystemPagesAccess(
-      super_page + PartitionPageSize() + kReservedTagBitmapSize +
+      super_page + PartitionPageSize() + ReservedTagBitmapSize() +
           quarantine_bitmaps_size + total_size,
-      (kSuperPageSize - PartitionPageSize() - kReservedTagBitmapSize -
+      (kSuperPageSize - PartitionPageSize() - ReservedTagBitmapSize() -
        quarantine_bitmaps_size - total_size),
       PageInaccessible);
 
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h
index 89c52834..5044433a 100644
--- a/base/allocator/partition_allocator/partition_page.h
+++ b/base/allocator/partition_allocator/partition_page.h
@@ -192,7 +192,7 @@
   const auto ptr_as_uint = reinterpret_cast<uintptr_t>(ptr);
   const auto super_page_base = ptr_as_uint & kSuperPageBaseMask;
   const uintptr_t payload_start =
-      super_page_base + PartitionPageSize() + kReservedTagBitmapSize +
+      super_page_base + PartitionPageSize() + ReservedTagBitmapSize() +
       (with_pcscan ? 2 * sizeof(QuarantineBitmap) : 0);
   const uintptr_t payload_end =
       super_page_base + kSuperPageSize - PartitionPageSize();
@@ -394,7 +394,7 @@
   auto* super_page = reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(ptr) &
                                              kSuperPageBaseMask);
   auto* first_bitmap = reinterpret_cast<QuarantineBitmap*>(
-      super_page + PartitionPageSize() + kReservedTagBitmapSize);
+      super_page + PartitionPageSize() + ReservedTagBitmapSize());
   auto* second_bitmap = first_bitmap + 1;
 
   if (type == QuarantineBitmapType::kScanner)
diff --git a/base/allocator/partition_allocator/partition_tag.h b/base/allocator/partition_allocator/partition_tag.h
index becb6fe..003255d 100644
--- a/base/allocator/partition_allocator/partition_tag.h
+++ b/base/allocator/partition_allocator/partition_tag.h
@@ -109,8 +109,8 @@
   // feature, use "offset" to see whether the given ptr is_direct_mapped or not.
   // DirectMap object should cause this PA_DCHECK's failure, as tags aren't
   // currently supported there.
-  PA_DCHECK(offset >= kReservedTagBitmapSize);
-  size_t bitmap_offset = (offset - kReservedTagBitmapSize) >>
+  PA_DCHECK(offset >= ReservedTagBitmapSize());
+  size_t bitmap_offset = (offset - ReservedTagBitmapSize()) >>
                          tag_bitmap::kBytesPerPartitionTagShift
                              << tag_bitmap::kPartitionTagSizeShift;
   return reinterpret_cast<PartitionTag* const>(bitmap_base + bitmap_offset);
diff --git a/base/allocator/partition_allocator/partition_tag_bitmap.h b/base/allocator/partition_allocator/partition_tag_bitmap.h
index 55fca45..c0ff8dd 100644
--- a/base/allocator/partition_allocator/partition_tag_bitmap.h
+++ b/base/allocator/partition_allocator/partition_tag_bitmap.h
@@ -6,6 +6,7 @@
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_TAG_BITMAP_H_
 
 #include "base/allocator/partition_allocator/checked_ptr_support.h"
+#include "base/allocator/partition_allocator/page_allocator_constants.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
 
 namespace base {
@@ -79,13 +80,14 @@
 }  // namespace tag_bitmap
 
 // kTagBitmapSize is calculated in the following way:
-// (1) kSuperPageSize - 2 * PartitionPageSize() = kTagBitmapSize + kSlotSpanSize
-// (2) kTagBitmapSize >= kSlotSpanSize / kBytesPerPartitionTag *
+// (1) kSuperPageSize - 2 * PartitionPageSize() = kTagBitmapSize +
+// SlotSpanSize()
+// (2) kTagBitmapSize >= SlotSpanSize() / kBytesPerPartitionTag *
 // sizeof(PartitionTag)
 //--
-// (1)' kSlotSpanSize = kSuperPageSize - 2 * PartitionPageSize() -
+// (1)' SlotSpanSize() = kSuperPageSize - 2 * PartitionPageSize() -
 // kTagBitmapSize
-// (2)' kSlotSpanSize <= kTagBitmapSize * Y
+// (2)' SlotSpanSize() <= kTagBitmapSize * Y
 // (3)' Y = kBytesPerPartitionTag / sizeof(PartitionTag) =
 // kBytesPerPartitionTagRatio
 //
@@ -94,30 +96,41 @@
 //   PartitionPageSize()
 // Finally,
 //   kTagBitmapSize >= (kSuperPageSize - 2 * PartitionPageSize()) / (1 + Y)
-static constexpr size_t kNumPartitionPagesPerTagBitmap =
-    tag_bitmap::CeilCountOfUnits(kSuperPageSize / PartitionPageSize() - 2,
-                                 tag_bitmap::kBytesPerPartitionTagRatio + 1);
+PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
+NumPartitionPagesPerTagBitmap() {
+  return tag_bitmap::CeilCountOfUnits(
+      kSuperPageSize / PartitionPageSize() - 2,
+      tag_bitmap::kBytesPerPartitionTagRatio + 1);
+}
 
 // To make guard pages between the tag bitmap and the slot span, calculate the
 // number of SystemPages of TagBitmap. If kNumSystemPagesPerTagBitmap *
 // SystemPageSize() < kTagBitmapSize, guard pages will be created. (c.f. no
 // guard pages if sizeof(PartitionTag) == 2.)
-static constexpr size_t kNumSystemPagesPerTagBitmap =
-    tag_bitmap::CeilCountOfUnits(kSuperPageSize / SystemPageSize() -
-                                     2 * PartitionPageSize() / SystemPageSize(),
-                                 tag_bitmap::kBytesPerPartitionTagRatio + 1);
+PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
+NumSystemPagesPerTagBitmap() {
+  return tag_bitmap::CeilCountOfUnits(
+      kSuperPageSize / SystemPageSize() -
+          2 * PartitionPageSize() / SystemPageSize(),
+      tag_bitmap::kBytesPerPartitionTagRatio + 1);
+}
 
-static constexpr size_t kActualTagBitmapSize =
-    kNumSystemPagesPerTagBitmap * SystemPageSize();
+PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
+ActualTagBitmapSize() {
+  return NumSystemPagesPerTagBitmap() * SystemPageSize();
+}
 
 // PartitionPageSize-aligned tag bitmap size.
-static constexpr size_t kReservedTagBitmapSize =
-    PartitionPageSize() * kNumPartitionPagesPerTagBitmap;
+PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
+ReservedTagBitmapSize() {
+  return PartitionPageSize() * NumPartitionPagesPerTagBitmap();
+}
 
-static_assert(kActualTagBitmapSize <= kReservedTagBitmapSize,
+#if PAGE_ALLOCATOR_CONSTANTS_ARE_CONSTEXPR
+static_assert(ActualTagBitmapSize() <= ReservedTagBitmapSize(),
               "kActualTagBitmapSize should be smaller than or equal to "
               "kReservedTagBitmapSize.");
-static_assert(kReservedTagBitmapSize - kActualTagBitmapSize <
+static_assert(ReservedTagBitmapSize() - ActualTagBitmapSize() <
                   PartitionPageSize(),
               "Unused space in the tag bitmap should be smaller than "
               "PartitionPageSize()");
@@ -125,21 +138,33 @@
 // The region available for slot spans is the reminder of the super page, after
 // taking away the first and last partition page (for metadata and guard pages)
 // and partition pages reserved for the tag bitmap.
-static constexpr size_t kSlotSpansSize =
-    kSuperPageSize - 2 * PartitionPageSize() - kReservedTagBitmapSize;
-static_assert(kActualTagBitmapSize * tag_bitmap::kBytesPerPartitionTagRatio >=
-                  kSlotSpansSize,
+PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
+SlotSpansSize() {
+  return kSuperPageSize - 2 * PartitionPageSize() - ReservedTagBitmapSize();
+}
+
+static_assert(ActualTagBitmapSize() * tag_bitmap::kBytesPerPartitionTagRatio >=
+                  SlotSpansSize(),
               "bitmap is large enough to cover slot spans");
-static_assert((kActualTagBitmapSize - PartitionPageSize()) *
+static_assert((ActualTagBitmapSize() - PartitionPageSize()) *
                       tag_bitmap::kBytesPerPartitionTagRatio <
-                  kSlotSpansSize,
+                  SlotSpansSize(),
               "any smaller bitmap wouldn't suffice to cover slots spans");
+#endif
 
 #else  // !ENABLE_TAG_FOR_MTE_CHECKED_PTR
 
-static constexpr size_t kNumPartitionPagesPerTagBitmap = 0;
-static constexpr size_t kActualTagBitmapSize = 0;
-static constexpr size_t kReservedTagBitmapSize = 0;
+constexpr ALWAYS_INLINE size_t NumPartitionPagesPerTagBitmap() {
+  return 0;
+}
+
+constexpr ALWAYS_INLINE size_t ActualTagBitmapSize() {
+  return 0;
+}
+
+constexpr ALWAYS_INLINE size_t ReservedTagBitmapSize() {
+  return 0;
+}
 
 #endif
 
diff --git a/base/allocator/partition_allocator/thread_cache.h b/base/allocator/partition_allocator/thread_cache.h
index 0509747..e1d0c34 100644
--- a/base/allocator/partition_allocator/thread_cache.h
+++ b/base/allocator/partition_allocator/thread_cache.h
@@ -9,6 +9,7 @@
 #include <cstdint>
 #include <memory>
 
+#include "base/allocator/partition_allocator/checked_ptr_support.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
 #include "base/allocator/partition_allocator/partition_cookie.h"
 #include "base/allocator/partition_allocator/partition_freelist_entry.h"
@@ -169,7 +170,7 @@
   };
 
   // TODO(lizeb): Optimize the threshold.
-#if defined(ARCH_CPU_64_BITS)
+#if defined(ARCH_CPU_64_BITS) || ENABLE_TAG_FOR_MTE_CHECKED_PTR
   static constexpr size_t kBucketCount = 41;
 #else
   static constexpr size_t kBucketCount = 49;
diff --git a/base/cpu.cc b/base/cpu.cc
index 6590dde..6e89a52 100644
--- a/base/cpu.cc
+++ b/base/cpu.cc
@@ -388,16 +388,14 @@
   return true;
 }
 
-}  // namespace
-
-// static
-std::vector<CPU::CoreType> CPU::GuessCoreTypes() {
+std::vector<CPU::CoreType> GuessCoreTypes() {
   // Try to guess the CPU architecture and cores of each cluster by comparing
   // the maximum frequencies of the available (online and offline) cores.
   const char kCPUMaxFreqPath[] =
       "/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq";
   int num_cpus = SysInfo::NumberOfProcessors();
-  std::vector<CPU::CoreType> core_index_to_type(num_cpus, CoreType::kUnknown);
+  std::vector<CPU::CoreType> core_index_to_type(num_cpus,
+                                                CPU::CoreType::kUnknown);
 
   std::vector<uint32_t> max_core_frequencies_mhz(num_cpus, 0);
   flat_set<uint32_t> frequencies_mhz;
@@ -424,9 +422,9 @@
   for (int core_index = 0; core_index < num_cpus; ++core_index) {
     uint32_t core_frequency_mhz = max_core_frequencies_mhz[core_index];
 
-    CoreType core_type = CoreType::kOther;
+    CPU::CoreType core_type = CPU::CoreType::kOther;
     if (num_frequencies == 1u) {
-      core_type = CoreType::kSymmetric;
+      core_type = CPU::CoreType::kSymmetric;
     } else if (num_frequencies == 2u || num_frequencies == 3u) {
       auto it = frequencies_mhz.find(core_frequency_mhz);
       if (it != frequencies_mhz.end()) {
@@ -435,16 +433,17 @@
         switch (frequency_index) {
           case 0:
             core_type = num_frequencies == 2u
-                            ? CoreType::kBigLittle_Little
-                            : CoreType::kBigLittleBigger_Little;
+                            ? CPU::CoreType::kBigLittle_Little
+                            : CPU::CoreType::kBigLittleBigger_Little;
             break;
           case 1:
-            core_type = num_frequencies == 2u ? CoreType::kBigLittle_Big
-                                              : CoreType::kBigLittleBigger_Big;
+            core_type = num_frequencies == 2u
+                            ? CPU::CoreType::kBigLittle_Big
+                            : CPU::CoreType::kBigLittleBigger_Big;
             break;
           case 2:
             DCHECK_EQ(num_frequencies, 3u);
-            core_type = CoreType::kBigLittleBigger_Bigger;
+            core_type = CPU::CoreType::kBigLittleBigger_Bigger;
             break;
           default:
             NOTREACHED();
@@ -458,6 +457,14 @@
   return core_index_to_type;
 }
 
+}  // namespace
+
+// static
+const std::vector<CPU::CoreType>& CPU::GetGuessedCoreTypes() {
+  static NoDestructor<std::vector<CoreType>> kCoreTypes(GuessCoreTypes());
+  return *kCoreTypes.get();
+}
+
 // static
 bool CPU::GetTimeInState(TimeInState& time_in_state) {
   time_in_state.clear();
@@ -467,7 +474,7 @@
   if (!kSupportsTimeInState)
     return false;
 
-  static NoDestructor<std::vector<CoreType>> kCoreTypes(GuessCoreTypes());
+  static const std::vector<CoreType>& kCoreTypes = GetGuessedCoreTypes();
 
   // time_in_state is reported per cluster. Identify the first cores of each
   // cluster.
@@ -516,7 +523,7 @@
     if (!ReadFileToString(time_in_state_path, &buffer))
       return false;
 
-    if (!ParseTimeInState(buffer, (*kCoreTypes)[cluster_core_index],
+    if (!ParseTimeInState(buffer, kCoreTypes[cluster_core_index],
                           cluster_core_index, time_in_state)) {
       return false;
     }
diff --git a/base/cpu.h b/base/cpu.h
index b79cc464..0789e491 100644
--- a/base/cpu.h
+++ b/base/cpu.h
@@ -90,10 +90,9 @@
   // Attempts to guess the core types of individual CPU cores based on frequency
   // information from /sys/devices/system/cpu/cpuN/cpufreq/cpuinfo_max_freq.
   // Beware that it is kernel/hardware dependent whether the information from
-  // sys is accurate.
-  //
-  // Returns a vector with the guessed type for core N at index N.
-  static std::vector<CoreType> GuessCoreTypes();
+  // sys is accurate. Returns a reference to a static-storage vector (leaked on
+  // shutdown) with the guessed type for core N at index N.
+  static const std::vector<CoreType>& GetGuessedCoreTypes();
 
   struct TimeInStateEntry {
     CPU::CoreType core_type;      // type of the cores in this cluster.
diff --git a/base/cpu_affinity_posix.cc b/base/cpu_affinity_posix.cc
index cb033d8c..6fc0f84 100644
--- a/base/cpu_affinity_posix.cc
+++ b/base/cpu_affinity_posix.cc
@@ -17,7 +17,7 @@
   static const cpu_set_t kAllCores = []() {
     cpu_set_t set;
     CPU_ZERO(&set);
-    std::vector<CPU::CoreType> core_types = CPU::GuessCoreTypes();
+    const std::vector<CPU::CoreType>& core_types = CPU::GetGuessedCoreTypes();
     if (core_types.empty()) {
       memset(&set, 0xff, sizeof(set));
     } else {
@@ -31,7 +31,7 @@
 
 const cpu_set_t& LittleCores() {
   static const cpu_set_t kLittleCores = []() {
-    std::vector<CPU::CoreType> core_types = CPU::GuessCoreTypes();
+    const std::vector<CPU::CoreType>& core_types = CPU::GetGuessedCoreTypes();
     if (core_types.empty())
       return AllCores();
 
@@ -64,7 +64,7 @@
 
 bool HasBigCpuCores() {
   static const bool kHasBigCores = []() {
-    std::vector<CPU::CoreType> core_types = CPU::GuessCoreTypes();
+    const std::vector<CPU::CoreType>& core_types = CPU::GetGuessedCoreTypes();
     if (core_types.empty())
       return false;
     for (CPU::CoreType core_type : core_types) {
diff --git a/base/process/process_metrics.cc b/base/process/process_metrics.cc
index 28ec57b..8939af0 100644
--- a/base/process/process_metrics.cc
+++ b/base/process/process_metrics.cc
@@ -56,6 +56,7 @@
 #endif
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
   GetSwapInfo(&system_metrics.swap_info_);
+  GetGraphicsMemoryInfo(&system_metrics.gpu_memory_info_);
 #endif
 #if defined(OS_WIN)
   GetSystemPerformanceInfo(&system_metrics.performance_);
@@ -76,6 +77,7 @@
 #endif
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
   res->Set("swapinfo", swap_info_.ToValue());
+  res->Set("gpu_meminfo", gpu_memory_info_.ToValue());
 #endif
 #if defined(OS_WIN)
   res->Set("perfinfo", performance_.ToValue());
diff --git a/base/process/process_metrics.h b/base/process/process_metrics.h
index 8dd93b3..bbf88c5 100644
--- a/base/process/process_metrics.h
+++ b/base/process/process_metrics.h
@@ -249,9 +249,6 @@
 #if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID) || \
     defined(OS_AIX)
   CPU::CoreType GetCoreType(int core_index);
-
-  // Initialized on the first call to GetCoreType().
-  base::Optional<std::vector<CPU::CoreType>> core_index_to_type_;
 #endif  // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID) ||
         // defined(OS_AIX)
 
@@ -336,7 +333,7 @@
 // GetSystemMemoryInfo(). Total/free swap memory are available on all platforms
 // except on Mac. Buffers/cached/active_anon/inactive_anon/active_file/
 // inactive_file/dirty/reclaimable/pswpin/pswpout/pgmajfault are available on
-// Linux/Android/Chrome OS. Shmem/slab/gem_objects/gem_size are Chrome OS only.
+// Linux/Android/Chrome OS. Shmem/slab are Chrome OS only.
 // Speculative/file_backed/purgeable are Mac and iOS only.
 // Free is absent on Windows (see "avail_phys" below).
 struct BASE_EXPORT SystemMemoryInfoKB {
@@ -392,9 +389,6 @@
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
   int shmem = 0;
   int slab = 0;
-  // Gem data will be -1 if not supported.
-  int gem_objects = -1;
-  long long gem_size = -1;
 #endif  // defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
 
 #if defined(OS_APPLE)
@@ -531,6 +525,22 @@
 // Fills in the provided |swap_data| structure.
 // Returns true on success or false for a parsing error.
 BASE_EXPORT bool GetSwapInfo(SwapInfo* swap_info);
+
+// Data about GPU memory usage. These fields will be -1 if not supported.
+struct BASE_EXPORT GraphicsMemoryInfoKB {
+  // Serializes the platform specific fields to value.
+  std::unique_ptr<Value> ToValue() const;
+
+  int gpu_objects = -1;
+  int64_t gpu_memory_size = -1;
+};
+
+// Report on Chrome OS graphics memory. Returns true on success.
+// /run/debugfs_gpu is a bind mount into /sys/kernel/debug and synchronously
+// reading the in-memory files in /sys is fast in most cases. On platform that
+// reading the graphics memory info is slow, this function returns false.
+BASE_EXPORT bool GetGraphicsMemoryInfo(GraphicsMemoryInfoKB* gpu_meminfo);
+
 #endif  // defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
 
 struct BASE_EXPORT SystemPerformanceInfo {
@@ -594,6 +604,7 @@
 #endif
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
   SwapInfo swap_info_;
+  GraphicsMemoryInfoKB gpu_memory_info_;
 #endif
 #if defined(OS_WIN)
   SystemPerformanceInfo performance_;
diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc
index 66c904cb..719a740 100644
--- a/base/process/process_metrics_linux.cc
+++ b/base/process/process_metrics_linux.cc
@@ -29,6 +29,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
+#include "base/system/sys_info.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 
@@ -150,44 +151,6 @@
   return ParseTotalCPUTimeFromStats(proc_stats);
 }
 
-#if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
-// Report on Chrome OS GEM object graphics memory. /run/debugfs_gpu is a
-// bind mount into /sys/kernel/debug and synchronously reading the in-memory
-// files in /sys is fast.
-void ReadChromeOSGraphicsMemory(SystemMemoryInfoKB* meminfo) {
-#if defined(ARCH_CPU_ARM_FAMILY)
-  FilePath geminfo_file("/run/debugfs_gpu/exynos_gem_objects");
-#else
-  FilePath geminfo_file("/run/debugfs_gpu/i915_gem_objects");
-#endif
-  std::string geminfo_data;
-  meminfo->gem_objects = -1;
-  meminfo->gem_size = -1;
-  if (ReadFileToString(geminfo_file, &geminfo_data)) {
-    int gem_objects = -1;
-    long long gem_size = -1;
-    int num_res = sscanf(geminfo_data.c_str(), "%d objects, %lld bytes",
-                         &gem_objects, &gem_size);
-    if (num_res == 2) {
-      meminfo->gem_objects = gem_objects;
-      meminfo->gem_size = gem_size;
-    }
-  }
-
-#if defined(ARCH_CPU_ARM_FAMILY)
-  // Incorporate Mali graphics memory if present.
-  FilePath mali_memory_file("/sys/class/misc/mali0/device/memory");
-  std::string mali_memory_data;
-  if (ReadFileToStringNonBlocking(mali_memory_file, &mali_memory_data)) {
-    long long mali_size = -1;
-    int num_res = sscanf(mali_memory_data.c_str(), "%lld bytes", &mali_size);
-    if (num_res == 1)
-      meminfo->gem_size += mali_size;
-  }
-#endif  // defined(ARCH_CPU_ARM_FAMILY)
-}
-#endif  // defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
-
 bool SupportsPerTaskTimeInState() {
   FilePath time_in_state_path = internal::GetProcPidDir(GetCurrentProcId())
                                     .Append("task")
@@ -481,13 +444,10 @@
 }
 
 CPU::CoreType ProcessMetrics::GetCoreType(int core_index) {
-  if (!core_index_to_type_)
-    core_index_to_type_ = CPU::GuessCoreTypes();
-
-  if (static_cast<size_t>(core_index) >= core_index_to_type_->size())
+  const std::vector<CPU::CoreType>& core_types = CPU::GetGuessedCoreTypes();
+  if (static_cast<size_t>(core_index) >= core_types.size())
     return CPU::CoreType::kUnknown;
-
-  return core_index_to_type_->at(static_cast<size_t>(core_index));
+  return core_types[static_cast<size_t>(core_index)];
 }
 
 const char kProcSelfExe[] = "/proc/self/exe";
@@ -566,8 +526,6 @@
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
   res->SetIntKey("shmem", shmem);
   res->SetIntKey("slab", slab);
-  res->SetIntKey("gem_objects", gem_objects);
-  res->SetIntKey("gem_size", gem_size);
 #endif
 
   return res;
@@ -699,7 +657,7 @@
 }
 
 bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) {
-  // Synchronously reading files in /proc and /sys are safe.
+  // Synchronously reading files in /proc is safe.
   ThreadRestrictions::ScopedAllowIO allow_io;
 
   // Used memory is: total - free - buffers - caches
@@ -715,10 +673,6 @@
     return false;
   }
 
-#if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
-  ReadChromeOSGraphicsMemory(meminfo);
-#endif
-
   return true;
 }
 
@@ -731,7 +685,7 @@
 }
 
 bool GetVmStatInfo(VmStatInfo* vmstat) {
-  // Synchronously reading files in /proc and /sys are safe.
+  // Synchronously reading files in /proc is safe.
   ThreadRestrictions::ScopedAllowIO allow_io;
 
   FilePath vmstat_file("/proc/vmstat");
@@ -910,6 +864,14 @@
   return std::move(res);
 }
 
+std::unique_ptr<Value> GraphicsMemoryInfoKB::ToValue() const {
+  auto res = std::make_unique<DictionaryValue>();
+  res->SetIntKey("gpu_objects", gpu_objects);
+  res->SetDouble("gpu_memory_size", static_cast<double>(gpu_memory_size));
+
+  return std::move(res);
+}
+
 bool ParseZramMmStat(StringPiece mm_stat_data, SwapInfo* swap_info) {
   // There are 7 columns in /sys/block/zram0/mm_stat,
   // split by several spaces. The first three columns
@@ -1049,6 +1011,54 @@
   }
   return true;
 }
+
+bool GetGraphicsMemoryInfo(GraphicsMemoryInfoKB* gpu_meminfo) {
+#if defined(ARCH_CPU_X86_FAMILY)
+  // Reading i915_gem_objects on intel platform with kernel 5.4 is slow and is
+  // prohibited.
+  // TODO(b/170397975): Update if i915_gem_objects reading time is improved.
+  static bool is_newer_kernel =
+      base::StartsWith(base::SysInfo::KernelVersion(), "5.");
+  static bool is_intel_cpu = base::CPU().vendor_name() == "GenuineIntel";
+  if (is_newer_kernel && is_intel_cpu)
+    return false;
+#endif
+
+#if defined(ARCH_CPU_ARM_FAMILY)
+  const FilePath geminfo_path("/run/debugfs_gpu/exynos_gem_objects");
+#else
+  const FilePath geminfo_path("/run/debugfs_gpu/i915_gem_objects");
+#endif
+  std::string geminfo_data;
+  gpu_meminfo->gpu_objects = -1;
+  gpu_meminfo->gpu_memory_size = -1;
+  if (ReadFileToStringNonBlocking(geminfo_path, &geminfo_data)) {
+    int gpu_objects = -1;
+    int64_t gpu_memory_size = -1;
+    int num_res = sscanf(geminfo_data.c_str(), "%d objects, %" SCNd64 " bytes",
+                         &gpu_objects, &gpu_memory_size);
+    if (num_res == 2) {
+      gpu_meminfo->gpu_objects = gpu_objects;
+      gpu_meminfo->gpu_memory_size = gpu_memory_size;
+    }
+  }
+
+#if defined(ARCH_CPU_ARM_FAMILY)
+  // Incorporate Mali graphics memory if present.
+  FilePath mali_memory_file("/sys/class/misc/mali0/device/memory");
+  std::string mali_memory_data;
+  if (ReadFileToStringNonBlocking(mali_memory_file, &mali_memory_data)) {
+    int64_t mali_size = -1;
+    int num_res =
+        sscanf(mali_memory_data.c_str(), "%" SCNd64 " bytes", &mali_size);
+    if (num_res == 1)
+      gpu_meminfo->gpu_memory_size += mali_size;
+  }
+#endif  // defined(ARCH_CPU_ARM_FAMILY)
+
+  return gpu_meminfo->gpu_memory_size != -1;
+}
+
 #endif  // defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
 
 #if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_AIX)
diff --git a/base/process/process_metrics_unittest.cc b/base/process/process_metrics_unittest.cc
index 778e803b..a50f09b 100644
--- a/base/process/process_metrics_unittest.cc
+++ b/base/process/process_metrics_unittest.cc
@@ -475,8 +475,6 @@
   // Chrome OS exposes shmem.
   EXPECT_GT(info.shmem, 0);
   EXPECT_LT(info.shmem, info.total);
-  // Chrome unit tests are not run on actual Chrome OS hardware, so gem_objects
-  // and gem_size cannot be tested here.
 #endif
 }
 #endif  // defined(OS_WIN) || defined(OS_APPLE) || defined(OS_LINUX) ||
diff --git a/base/profiler/stack_copier_signal_unittest.cc b/base/profiler/stack_copier_signal_unittest.cc
index dd7434c..c6d4839 100644
--- a/base/profiler/stack_copier_signal_unittest.cc
+++ b/base/profiler/stack_copier_signal_unittest.cc
@@ -6,6 +6,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/debug/alias.h"
 #include "base/profiler/sampling_profiler_thread_token.h"
 #include "base/profiler/stack_buffer.h"
 #include "base/profiler/stack_copier_signal.h"
@@ -100,11 +101,11 @@
   ASSERT_TRUE(thread_delegate);
   StackCopierSignal copier(std::move(thread_delegate));
 
-  // Copy the sentinel values onto the stack. Volatile to defeat compiler
-  // optimizations.
-  volatile uint32_t sentinels[size(kStackSentinels)];
+  // Copy the sentinel values onto the stack.
+  uint32_t sentinels[size(kStackSentinels)];
   for (size_t i = 0; i < size(kStackSentinels); ++i)
     sentinels[i] = kStackSentinels[i];
+  base::debug::Alias((void*)sentinels);  // Defeat compiler optimizations.
 
   bool result = copier.CopyStack(&stack_buffer, &stack_top, &timestamp,
                                  &context, &stack_copier_delegate);
diff --git a/base/ranges/algorithm_unittest.cc b/base/ranges/algorithm_unittest.cc
index 43313fd..0d5cec9 100644
--- a/base/ranges/algorithm_unittest.cc
+++ b/base/ranges/algorithm_unittest.cc
@@ -1664,4 +1664,26 @@
   EXPECT_THAT(bits, ElementsAre(0, 0, 0, 1, 0));
 }
 
+namespace internal {
+const auto predicate = [](int value) { return value; };
+struct TestPair {
+  int a;
+  int b;
+};
+}  // namespace internal
+
+// This is a compilation test that checks that using predicates and projections
+// from the base::internal namespace in range algorithms doesn't result in
+// ambiguous calls to base::invoke.
+TEST(RangesTest, DontClashWithPredicateFromInternalInvoke) {
+  {
+    int input[] = {0, 1, 2};
+    ranges::any_of(input, internal::predicate);
+  }
+  {
+    internal::TestPair input[] = {{1, 2}, {3, 4}};
+    ranges::any_of(input, base::identity{}, &internal::TestPair::a);
+  }
+}
+
 }  // namespace base
diff --git a/base/stl_util.h b/base/stl_util.h
index 5d8632b4..59f1863 100644
--- a/base/stl_util.h
+++ b/base/stl_util.h
@@ -221,7 +221,7 @@
           typename T1,
           typename... Args,
           EnableIf<IsMemFunPtr<F> && IsMemPtrToBaseOf<F, T1>> = true>
-constexpr decltype(auto) invoke(F&& f, T1&& t1, Args&&... args) {
+constexpr decltype(auto) InvokeImpl(F&& f, T1&& t1, Args&&... args) {
   return (std::forward<T1>(t1).*f)(std::forward<Args>(args)...);
 }
 
@@ -233,7 +233,7 @@
           typename T1,
           typename... Args,
           EnableIf<IsMemFunPtr<F> && IsRefWrapper<T1>> = true>
-constexpr decltype(auto) invoke(F&& f, T1&& t1, Args&&... args) {
+constexpr decltype(auto) InvokeImpl(F&& f, T1&& t1, Args&&... args) {
   return (t1.get().*f)(std::forward<Args>(args)...);
 }
 
@@ -246,7 +246,7 @@
           typename... Args,
           EnableIf<IsMemFunPtr<F> && !IsMemPtrToBaseOf<F, T1> &&
                    !IsRefWrapper<T1>> = true>
-constexpr decltype(auto) invoke(F&& f, T1&& t1, Args&&... args) {
+constexpr decltype(auto) InvokeImpl(F&& f, T1&& t1, Args&&... args) {
   return ((*std::forward<T1>(t1)).*f)(std::forward<Args>(args)...);
 }
 
@@ -257,7 +257,7 @@
 template <typename F,
           typename T1,
           EnableIf<IsMemObjPtr<F> && IsMemPtrToBaseOf<F, T1>> = true>
-constexpr decltype(auto) invoke(F&& f, T1&& t1) {
+constexpr decltype(auto) InvokeImpl(F&& f, T1&& t1) {
   return std::forward<T1>(t1).*f;
 }
 
@@ -268,7 +268,7 @@
 template <typename F,
           typename T1,
           EnableIf<IsMemObjPtr<F> && IsRefWrapper<T1>> = true>
-constexpr decltype(auto) invoke(F&& f, T1&& t1) {
+constexpr decltype(auto) InvokeImpl(F&& f, T1&& t1) {
   return t1.get().*f;
 }
 
@@ -280,7 +280,7 @@
           typename T1,
           EnableIf<IsMemObjPtr<F> && !IsMemPtrToBaseOf<F, T1> &&
                    !IsRefWrapper<T1>> = true>
-constexpr decltype(auto) invoke(F&& f, T1&& t1) {
+constexpr decltype(auto) InvokeImpl(F&& f, T1&& t1) {
   return (*std::forward<T1>(t1)).*f;
 }
 
@@ -289,7 +289,7 @@
 //
 // Reference: https://wg21.link/func.require#1.7
 template <typename F, typename... Args>
-constexpr decltype(auto) invoke(F&& f, Args&&... args) {
+constexpr decltype(auto) InvokeImpl(F&& f, Args&&... args) {
   return std::forward<F>(f)(std::forward<Args>(args)...);
 }
 
@@ -305,7 +305,7 @@
 // - https://wg21.link/func.invoke
 template <typename F, typename... Args>
 constexpr decltype(auto) invoke(F&& f, Args&&... args) {
-  return internal::invoke(std::forward<F>(f), std::forward<Args>(args)...);
+  return internal::InvokeImpl(std::forward<F>(f), std::forward<Args>(args)...);
 }
 
 // Implementation of C++20's std::identity.
diff --git a/base/trace_event/base_tracing.h b/base/trace_event/base_tracing.h
index ae3c60e7..c5831f237d 100644
--- a/base/trace_event/base_tracing.h
+++ b/base/trace_event/base_tracing.h
@@ -16,10 +16,8 @@
 // Update the check in //base/PRESUBMIT.py when adding new headers here.
 // TODO(crbug/1006541): Switch to perfetto for trace event implementation.
 #include "base/trace_event/blame_context.h"
-#include "base/trace_event/heap_profiler.h"
 #include "base/trace_event/memory_allocator_dump_guid.h"
 #include "base/trace_event/memory_dump_provider.h"
-#include "base/trace_event/task_execution_macros.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
 #include "base/trace_event/typed_macros.h"
diff --git a/base/trace_event/common/trace_event_common.h b/base/trace_event/common/trace_event_common.h
index 120481f3..28b7275 100644
--- a/base/trace_event/common/trace_event_common.h
+++ b/base/trace_event/common/trace_event_common.h
@@ -969,7 +969,6 @@
 #define TRACE_TASK_EXECUTION(run_function, task) \
   INTERNAL_TRACE_TASK_EXECUTION(run_function, task)
 
-// Special trace event macro to trace log messages.
 #define TRACE_LOG_MESSAGE(file, message, line) \
   INTERNAL_TRACE_LOG_MESSAGE(file, message, line)
 
diff --git a/base/trace_event/task_execution_macros.h b/base/trace_event/task_execution_macros.h
deleted file mode 100644
index 156bcf0..0000000
--- a/base/trace_event/task_execution_macros.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TRACE_EVENT_TASK_EXECUTION_MACROS_H_
-#define BASE_TRACE_EVENT_TASK_EXECUTION_MACROS_H_
-
-#include "base/location.h"
-#include "base/trace_event/heap_profiler.h"
-#include "base/trace_event/typed_macros.h"
-#include "third_party/perfetto/include/perfetto/tracing/track_event_interned_data_index.h"
-#include "third_party/perfetto/protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "third_party/perfetto/protos/perfetto/trace/track_event/log_message.pbzero.h"
-#include "third_party/perfetto/protos/perfetto/trace/track_event/source_location.pbzero.h"
-#include "third_party/perfetto/protos/perfetto/trace/track_event/task_execution.pbzero.h"
-
-namespace {
-
-// TrackEventInternedDataIndex expects the same data structure to be used for
-// all interned fields with the same field number. We can't use base::Location
-// for log event's location since base::Location uses program counter based
-// location.
-struct TraceSourceLocation {
-  const char* function_name = nullptr;
-  const char* file_name = nullptr;
-  int line_number = 0;
-
-  bool operator==(const TraceSourceLocation& other) const {
-    return file_name == other.file_name &&
-           function_name == other.function_name &&
-           line_number == other.line_number;
-  }
-};
-
-}  // namespace
-
-namespace std {
-
-template <>
-struct ::std::hash<TraceSourceLocation> {
-  std::size_t operator()(const TraceSourceLocation& loc) const {
-    return base::FastHash(base::as_bytes(base::make_span(&loc, 1)));
-  }
-};
-
-}  // namespace std
-
-namespace {
-
-struct InternedSourceLocation
-    : public perfetto::TrackEventInternedDataIndex<
-          InternedSourceLocation,
-          perfetto::protos::pbzero::InternedData::kSourceLocationsFieldNumber,
-          TraceSourceLocation> {
-  static void Add(perfetto::protos::pbzero::InternedData* interned_data,
-                  size_t iid,
-                  const TraceSourceLocation& location) {
-    auto* msg = interned_data->add_source_locations();
-    msg->set_iid(iid);
-    if (location.file_name != nullptr)
-      msg->set_file_name(location.file_name);
-    if (location.function_name != nullptr)
-      msg->set_function_name(location.function_name);
-    // TODO(ssid): Add line number once it is whitelisted in internal proto.
-    // TODO(ssid): Add program counter to the proto fields when
-    // !BUILDFLAG(ENABLE_LOCATION_SOURCE).
-    // TODO(http://crbug.com760702) remove file name and just pass the program
-    // counter to the heap profiler macro.
-    // TODO(ssid): Consider writing the program counter of the current task
-    // (from the callback function pointer) instead of location that posted the
-    // task.
-  }
-};
-
-struct InternedLogMessage
-    : public perfetto::TrackEventInternedDataIndex<
-          InternedLogMessage,
-          perfetto::protos::pbzero::InternedData::kLogMessageBodyFieldNumber,
-          std::string> {
-  static void Add(perfetto::protos::pbzero::InternedData* interned_data,
-                  size_t iid,
-                  const std::string& log_message) {
-    auto* msg = interned_data->add_log_message_body();
-    msg->set_iid(iid);
-    msg->set_body(log_message);
-  }
-};
-
-}  // namespace
-
-// Implementation detail: internal macro to trace a task execution with the
-// location where it was posted from.
-#define INTERNAL_TRACE_TASK_EXECUTION(run_function, task)                 \
-  TRACE_EVENT("toplevel", run_function, [&](perfetto::EventContext ctx) { \
-    ctx.event()->set_task_execution()->set_posted_from_iid(               \
-        InternedSourceLocation::Get(&ctx,                                 \
-                                    {(task).posted_from.function_name(),  \
-                                     (task).posted_from.file_name(),      \
-                                     (task).posted_from.line_number()})); \
-  });                                                                     \
-  TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION INTERNAL_TRACE_EVENT_UID( \
-      task_event)((task).posted_from.file_name());                        \
-  TRACE_HEAP_PROFILER_API_SCOPED_WITH_PROGRAM_COUNTER                     \
-  INTERNAL_TRACE_EVENT_UID(task_pc_event)                                 \
-  ((task).posted_from.program_counter());
-
-// Implementation detail: internal macro to trace a log message, with the source
-// location of the log statement.
-#define INTERNAL_TRACE_LOG_MESSAGE(file, message, line)                        \
-  TRACE_EVENT_INSTANT(                                                         \
-      "log", "LogMessage", TRACE_EVENT_SCOPE_THREAD,                           \
-      [&](perfetto::EventContext ctx) {                                        \
-        perfetto::protos::pbzero::LogMessage* log =                            \
-            ctx.event()->set_log_message();                                    \
-        log->set_source_location_iid(InternedSourceLocation::Get(              \
-            &ctx,                                                              \
-            TraceSourceLocation{/*function_name=*/nullptr, file, line}));      \
-        log->set_body_iid(InternedLogMessage::Get(&ctx, message.as_string())); \
-      });
-
-#endif  // BASE_TRACE_EVENT_TASK_EXECUTION_MACROS_H_
diff --git a/base/trace_event/trace_event.h b/base/trace_event/trace_event.h
index a0cd28cf..6c6a6c0 100644
--- a/base/trace_event/trace_event.h
+++ b/base/trace_event/trace_event.h
@@ -22,6 +22,7 @@
 #include "base/time/time_override.h"
 #include "base/trace_event/builtin_categories.h"
 #include "base/trace_event/common/trace_event_common.h"
+#include "base/trace_event/heap_profiler.h"
 #include "base/trace_event/log_message.h"
 #include "base/trace_event/thread_instruction_count.h"
 #include "base/trace_event/trace_arguments.h"
@@ -389,6 +390,45 @@
     }                                                                \
   } while (0)
 
+#define INTERNAL_TRACE_LOG_MESSAGE(file, message, line)                        \
+  TRACE_EVENT_INSTANT1(                                                        \
+      "log", "LogMessage",                                                     \
+      TRACE_EVENT_FLAG_TYPED_PROTO_ARGS | TRACE_EVENT_SCOPE_THREAD, "message", \
+      std::make_unique<base::trace_event::LogMessage>(file, message, line))
+
+#if BUILDFLAG(ENABLE_LOCATION_SOURCE)
+
+// Implementation detail: internal macro to trace a task execution with the
+// location where it was posted from.
+//
+// This implementation is for when location sources are available.
+// TODO(ssid): The program counter of the current task should be added here.
+#define INTERNAL_TRACE_TASK_EXECUTION(run_function, task)                      \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLAGS(                                  \
+      "toplevel", run_function, TRACE_EVENT_FLAG_TYPED_PROTO_ARGS, "src_file", \
+      (task).posted_from.file_name(), "src_func",                              \
+      (task).posted_from.function_name());                                     \
+  TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION INTERNAL_TRACE_EVENT_UID(      \
+      task_event)((task).posted_from.file_name());                             \
+  TRACE_HEAP_PROFILER_API_SCOPED_WITH_PROGRAM_COUNTER                          \
+  INTERNAL_TRACE_EVENT_UID(task_pc_event)((task).posted_from.program_counter());
+
+#else
+
+// TODO(http://crbug.com760702) remove file name and just pass the program
+// counter to the heap profiler macro.
+// TODO(ssid): The program counter of the current task should be added here.
+#define INTERNAL_TRACE_TASK_EXECUTION(run_function, task)                 \
+  INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLAGS(                             \
+      "toplevel", run_function, TRACE_EVENT_FLAG_TYPED_PROTO_ARGS, "src", \
+      (task).posted_from.ToString())                                      \
+  TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION INTERNAL_TRACE_EVENT_UID( \
+      task_event)((task).posted_from.file_name());                        \
+  TRACE_HEAP_PROFILER_API_SCOPED_WITH_PROGRAM_COUNTER                     \
+  INTERNAL_TRACE_EVENT_UID(task_pc_event)((task).posted_from.program_counter());
+
+#endif
+
 namespace trace_event_internal {
 
 // Specify these values when the corresponding argument of AddTraceEvent is not
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 7c0c1d1..c38fef7 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -621,7 +621,7 @@
       # files on Windows (https://crbug.com/871962).
       ldflags += [
         "/opt:lldlto=" + lto_opt_level,
-        "/opt:lldltojobs=" + max_jobs_per_link,
+        "/opt:lldltojobs=all",
 
         # Experimentally determined to yield a reasonable trade-off between
         # build time, run-time performance, and binary size.
@@ -637,10 +637,11 @@
       # usage in crbug.com/1038040. Note this will increase build time in
       # Chrome OS.
 
-      # Limit the parallelism to avoid too aggressive competition between
-      # linker jobs. This is still suboptimal to a potential dynamic
-      # resource allocation scheme, but should be good enough.
-      ldflags += [ "-Wl,--thinlto-jobs=" + max_jobs_per_link ]
+      # In ThinLTO builds, we run at most one link process at a time,
+      # and let it use all cores.
+      # TODO(thakis): Check if '=0' (that is, number of cores, instead
+      # of "all" which means number of hardware threads) is faster.
+      ldflags += [ "-Wl,--thinlto-jobs=all" ]
 
       # Limit the size of the ThinLTO cache to the lesser of 10% of
       # available disk space, 10GB and 100000 files.
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
index 03c05a3..4d70712 100644
--- a/build/config/compiler/compiler.gni
+++ b/build/config/compiler/compiler.gni
@@ -73,8 +73,8 @@
   # If true, use Goma for ThinLTO code generation where applicable.
   use_goma_thin_lto = false
 
-  # Limit the number of jobs (threads/processes) the linker is allowed
-  # to use (for linkers that support this).
+  # Ignored, only exists temporarily for backwards compat.
+  # TODO(thakis): Remove this once bots no longer set it.
   max_jobs_per_link = 8
 
   # Whether we're using a sample profile collected on an architecture different
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 0092336..cbb63df1 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20201012.0.1
+0.20201012.1.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 493905b..cbb63df1 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20201011.3.1
+0.20201012.1.1
diff --git a/build/toolchain/concurrent_links.gni b/build/toolchain/concurrent_links.gni
index 3742273..6ba25a1d 100644
--- a/build/toolchain/concurrent_links.gni
+++ b/build/toolchain/concurrent_links.gni
@@ -76,16 +76,24 @@
   # so that we can compute better values.
   _command_dict = exec_script("get_concurrent_links.py", _args, "scope")
 
-  concurrent_links = _command_dict.primary_pool_size
-  concurrent_links_logs = _command_dict.explanation
-  if (_command_dict.secondary_pool_size >= concurrent_links) {
-    # Have R8 / Lint share the link pool unless we would safely get more
-    # concurrency out of using a separate one.
-    # On low-RAM machines, this allows an apk's native library to link at the
-    # same time as its java is optimized with R8.
-    java_cmd_pool_size = _command_dict.secondary_pool_size
+  if (use_thin_lto) {
+    concurrent_links = 1
+    concurrent_links_logs =
+        [ "thinlto -- only one link at once but every link can use all cores" ]
+  } else {
+    concurrent_links = _command_dict.primary_pool_size
+    concurrent_links_logs = _command_dict.explanation
+
+    if (_command_dict.secondary_pool_size >= concurrent_links) {
+      # Have R8 / Lint share the link pool unless we would safely get more
+      # concurrency out of using a separate one.
+      # On low-RAM machines, this allows an apk's native library to link at the
+      # same time as its java is optimized with R8.
+      java_cmd_pool_size = _command_dict.secondary_pool_size
+    }
   }
 } else {
+  assert(!use_thin_lto, "can't explicitly set concurrent_links with thinlto")
   concurrent_links_logs =
       [ "concurrent_links set by GN arg (value=$concurrent_links)" ]
 }
diff --git a/cc/raster/synchronous_task_graph_runner.cc b/cc/raster/synchronous_task_graph_runner.cc
index 03a5a46..b7e0e94 100644
--- a/cc/raster/synchronous_task_graph_runner.cc
+++ b/cc/raster/synchronous_task_graph_runner.cc
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/threading/simple_thread.h"
-#include "base/trace_event/heap_profiler.h"
 #include "base/trace_event/trace_event.h"
 
 namespace cc {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java
index 73cd0eb..4124fb6 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java
@@ -5,10 +5,7 @@
 package org.chromium.chrome.browser.autofill_assistant.overlay;
 
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.graphics.RectF;
-import android.text.TextUtils;
-import android.util.DisplayMetrics;
 
 import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiController;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
@@ -86,23 +83,7 @@
                 mEventFilter.setTapTrackingDurationMs(
                         model.get(AssistantOverlayModel.TAP_TRACKING_DURATION_MS));
             } else if (AssistantOverlayModel.OVERLAY_IMAGE == propertyKey) {
-                AssistantOverlayImage image = model.get(AssistantOverlayModel.OVERLAY_IMAGE);
-                if (image != null && !TextUtils.isEmpty(image.mImageUrl)) {
-                    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
-                    // TODO(b/143517837) Merge autofill assistant image fetcher UMA names.
-                    ImageFetcher.Params params = ImageFetcher.Params.create(
-                            image.mImageUrl, ImageFetcher.ASSISTANT_DETAILS_UMA_CLIENT_NAME);
-                    mImageFetcher.fetchImage(
-                            params, result -> {
-                                image.mImageBitmap = result != null ? Bitmap.createScaledBitmap(
-                                                             result, image.mImageSizeInPixels,
-                                                             image.mImageSizeInPixels, true)
-                                                                    : null;
-                                mDrawable.setFullOverlayImage(image);
-                            });
-                } else {
-                    mDrawable.setFullOverlayImage(image);
-                }
+                mDrawable.setFullOverlayImage(model.get(AssistantOverlayModel.OVERLAY_IMAGE));
             }
         });
     }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java
index 74996e0..5c948d5 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java
@@ -291,11 +291,13 @@
         canvas.drawPaint(mBackground);
 
         // Draw overlay image, if specified.
-        if (!mPartial && mOverlayImage != null && mOverlayImage.mImageBitmap != null) {
-            canvas.drawBitmap(mOverlayImage.mImageBitmap,
-                    bounds.left + (bounds.right - bounds.left) / 2.0f
-                            - mOverlayImage.mImageSizeInPixels / 2.0f,
-                    yTop + mOverlayImage.mImageTopMarginInPixels, null);
+        if (!mPartial && mOverlayImage != null && mOverlayImage.mDrawable != null) {
+            int left = bounds.left + (bounds.right - bounds.left) / 2
+                    - mOverlayImage.mImageSizeInPixels / 2;
+            int top = yTop + mOverlayImage.mImageTopMarginInPixels;
+            mOverlayImage.mDrawable.setBounds(left, top, left + mOverlayImage.mImageSizeInPixels,
+                    top + mOverlayImage.mImageSizeInPixels);
+            mOverlayImage.mDrawable.draw(canvas);
 
             if (!TextUtils.isEmpty(mOverlayImage.mText)) {
                 String text = trimStringToWidth(
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java
index edb77eb0..403fb213 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java
@@ -4,17 +4,15 @@
 
 package org.chromium.chrome.browser.autofill_assistant.overlay;
 
-import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.Nullable;
 
 /** Java equivalent to {@code OverlayImageProto}. */
 public class AssistantOverlayImage {
-    /** The url of the image to display. */
-    public final String mImageUrl;
-    /** The image to display, after {@code mImageUrl} has been resolved. */
-    public @Nullable Bitmap mImageBitmap;
+    /** The image to display. */
+    public @Nullable Drawable mDrawable;
     /** The size of the image to display. */
     public final int mImageSizeInPixels;
     /** The margin between the top of the page (anchor) and the image. */
@@ -28,10 +26,9 @@
     /** The size of the text to display. */
     public final int mTextSizeInPixels;
 
-    public AssistantOverlayImage(String imageUrl, int imageSizeInPixels, int imageTopMarginInPixels,
+    public AssistantOverlayImage(int imageSizeInPixels, int imageTopMarginInPixels,
             int imageBottomMarginInPixels, String text, @Nullable @ColorInt Integer textColor,
             int textSizeInPixels) {
-        mImageUrl = imageUrl;
         mImageSizeInPixels = imageSizeInPixels;
         mImageTopMarginInPixels = imageTopMarginInPixels;
         mImageBottomMarginInPixels = imageBottomMarginInPixels;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java
index fa7ebb2..faba6f3 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.autofill_assistant.overlay;
 
+import android.content.Context;
 import android.graphics.RectF;
 
 import androidx.annotation.ColorInt;
@@ -11,6 +12,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDrawable;
 import org.chromium.ui.modelutil.PropertyModel;
 
 import java.util.ArrayList;
@@ -101,12 +103,22 @@
     }
 
     @CalledByNative
-    private void setOverlayImage(String imageUrl, int imageSizeInPixels, int imageTopMarginInPixels,
-            int imageBottomMarginInPixels, String text, @Nullable @ColorInt Integer textColor,
-            int textSizeInPixels) {
-        set(OVERLAY_IMAGE,
-                new AssistantOverlayImage(imageUrl, imageSizeInPixels, imageTopMarginInPixels,
-                        imageBottomMarginInPixels, text, textColor, textSizeInPixels));
+    private void setOverlayImage(Context context, @Nullable AssistantDrawable imageDrawable,
+            int imageSizeInPixels, int imageTopMarginInPixels, int imageBottomMarginInPixels,
+            String text, @Nullable @ColorInt Integer textColor, int textSizeInPixels) {
+        AssistantOverlayImage assistantOverlayImage =
+                new AssistantOverlayImage(imageSizeInPixels, imageTopMarginInPixels,
+                        imageBottomMarginInPixels, text, textColor, textSizeInPixels);
+        if (imageDrawable == null) {
+            set(OVERLAY_IMAGE, assistantOverlayImage);
+            return;
+        }
+        imageDrawable.getDrawable(context, drawable -> {
+            if (drawable != null) {
+                assistantOverlayImage.mDrawable = drawable;
+                set(OVERLAY_IMAGE, assistantOverlayImage);
+            }
+        });
     }
 
     @CalledByNative
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mn.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mn.xtb
index 3460937..86caf2b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mn.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mn.xtb
@@ -11,17 +11,17 @@
 <translation id="4437727785356380473">Chrome-н Google Туслахыг хаалаа.</translation>
 <translation id="4517854969512651305">Утгыг нэмэгдүүлэх</translation>
 <translation id="4850886885716139402">Харах</translation>
-<translation id="4952448020231702394">Google Туслах нь хайлт болон тооцоо хийх зэрэг вэб дээрх үйлдлүүдийг дуусгахад тусалж, таны цагийг хэмнэдэг.</translation>
+<translation id="4952448020231702394">Google Туслах нь хайлт болон тооцоо хийх зэрэг веб дээрх үйлдлүүдийг дуусгахад тусалж, таны цагийг хэмнэдэг.</translation>
 <translation id="4982366513646093083">Хэдхэн товшилтоор\nхоол захиалаарай</translation>
 <translation id="5267269112080050255">Chrome-н Google Туслахыг бүрэн өндрөөр нээлээ.</translation>
 <translation id="5447168050208292829">Хэдхэн товшилтоор\nнислэгтээ бүртгүүлээрэй</translation>
 <translation id="6555233628095991027">Chrome-н Google Туслахыг хагас өндрөөр нээлээ.</translation>
-<translation id="6785872064505734160">Chrome-н Google Туслах нь вэб сайт дээрх үйлдлүүдийг танд зориулан гүйцээх боломжтой</translation>
+<translation id="6785872064505734160">Chrome-н Google Туслах нь вебсайт дээрх үйлдлүүдийг танд зориулан гүйцээх боломжтой</translation>
 <translation id="6973932557599545801">Уучлаарай, би туслах боломжгүй байна. Та өөрөө үргэлжлүүлнэ үү.</translation>
 <translation id="7135664311366978968">Хэдхэн товшилтоор\nкиноны тасалбар худалдаж аваарай</translation>
 <translation id="7455021968451468078">Нууц үгээ өөрчлөхөд тань\nтуслахыг Google Туслахад зөвшөөрөх</translation>
 <translation id="7658239707568436148">Болих</translation>
-<translation id="7953600313732929223">Вэб сайтууд дээр\nдуут үйлдлийг туршиж үзнэ үү</translation>
+<translation id="7953600313732929223">Веб сайтууд дээр\nдуут үйлдлийг туршиж үзнэ үү</translation>
 <translation id="8253702004019660079">Chrome-н Google Туслах.</translation>
 <translation id="8500511870202433545">Хэдхэн товшилтоор\nмашин түрээслээрэй</translation>
 <translation id="945522503751344254">Санал хүсэлт илгээх</translation>
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
index bcd12436..9c564486 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
@@ -145,8 +145,8 @@
         AssistantOverlayModel model = new AssistantOverlayModel();
         AssistantOverlayCoordinator coordinator = createCoordinator(model);
 
-        AssistantOverlayImage image = new AssistantOverlayImage("http://localhost/example.png", 64,
-                64, 40, "example.com", Color.parseColor("#B3FFFFFF"), 40);
+        AssistantOverlayImage image = new AssistantOverlayImage(
+                64, 64, 40, "example.com", Color.parseColor("#B3FFFFFF"), 40);
         runOnUiThreadBlocking(() -> {
             model.set(AssistantOverlayModel.STATE, AssistantOverlayState.FULL);
             model.set(AssistantOverlayModel.OVERLAY_IMAGE, image);
@@ -234,8 +234,7 @@
         runOnUiThreadBlocking(() -> {
             model.set(AssistantOverlayModel.STATE, AssistantOverlayState.FULL);
             model.set(AssistantOverlayModel.OVERLAY_IMAGE,
-                    new AssistantOverlayImage("https://www.example.com/example.png", 32, 32, 12,
-                            "Text", Color.RED, 20));
+                    new AssistantOverlayImage(32, 32, 12, "Text", Color.RED, 20));
         });
 
         assertScrimDisplayed(true);
@@ -252,8 +251,7 @@
         runOnUiThreadBlocking(() -> {
             model.set(AssistantOverlayModel.STATE, AssistantOverlayState.FULL);
             model.set(AssistantOverlayModel.OVERLAY_IMAGE,
-                    new AssistantOverlayImage("https://www.example.com/example.png", 32, 32, 12,
-                            "Text", Color.RED, 20));
+                    new AssistantOverlayImage(32, 32, 12, "Text", Color.RED, 20));
         });
 
         assertScrimDisplayed(true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
index 3af8707..dc9bedb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
@@ -211,12 +211,6 @@
             threadInterceptor.ignoreExternalMethod(Violation.DETECT_DISK_READ,
                     "android.net.ConnectivityManager#registerDefaultNetworkCallback");
         }
-
-        // crbug.com/1133401
-        threadInterceptor.ignoreExternalMethod(
-                Violation.DETECT_DISK_IO, "android.content.ContentResolver#setIsSyncable");
-        threadInterceptor.ignoreExternalMethod(
-                Violation.DETECT_DISK_IO, "android.content.ContentResolver#setSyncAutomatically");
     }
 
     public static void addExemptions(ThreadStrictModeInterceptor.Builder threadInterceptor) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
index e0f8ad2..802c469 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -658,12 +658,11 @@
 
     @Override
     public Bundle getBundleForMenuItem(MenuItem item) {
+        Bundle bundle = new Bundle();
         if (item.getItemId() == R.id.add_to_homescreen_id) {
-            Bundle payload = new Bundle();
-            payload.putInt(AppBannerManager.MENU_TITLE_KEY, mAddAppTitleShown);
-            return payload;
+            bundle.putInt(AppBannerManager.MENU_TITLE_KEY, mAddAppTitleShown);
         }
-        return null;
+        return bundle;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
index 5951af9..97bbdcb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -240,16 +240,13 @@
     }
 
     @Override
-    public @Nullable Bundle getBundleForMenuItem(MenuItem item) {
+    public Bundle getBundleForMenuItem(MenuItem item) {
         Bundle itemBundle = super.getBundleForMenuItem(item);
 
         if (!mItemToIndexMap.containsKey(item)) {
             return itemBundle;
         }
 
-        if (itemBundle == null) {
-            itemBundle = new Bundle();
-        }
         itemBundle.putInt(CUSTOM_MENU_ITEM_ID_KEY, mItemToIndexMap.get(item).intValue());
         return itemBundle;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/AndroidSyncSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/AndroidSyncSettings.java
index 21aef454..ff9f5cc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/AndroidSyncSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/AndroidSyncSettings.java
@@ -16,6 +16,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ObserverList;
+import org.chromium.base.StrictModeContext;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -226,7 +227,9 @@
         if (value == mChromeSyncEnabled || mAccount == null) return;
         mChromeSyncEnabled = value;
 
-        mSyncContentResolverDelegate.setSyncAutomatically(mAccount, mContractAuthority, value);
+        try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+            mSyncContentResolverDelegate.setSyncAutomatically(mAccount, mContractAuthority, value);
+        }
         notifyObservers();
     }
 
@@ -243,24 +246,29 @@
 
         mIsSyncable = shouldBeSyncable;
 
-        // Make account syncable if there is one.
-        if (shouldBeSyncable) {
-            mSyncContentResolverDelegate.setIsSyncable(mAccount, mContractAuthority, 1);
-            // This reduces unnecessary resource usage. See http://crbug.com/480688 for details.
-            mSyncContentResolverDelegate.removePeriodicSync(
-                    mAccount, mContractAuthority, Bundle.EMPTY);
-        } else if (mAccount != null) {
-            mSyncContentResolverDelegate.setIsSyncable(mAccount, mContractAuthority, 0);
+        try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+            // Make account syncable if there is one.
+            if (shouldBeSyncable) {
+                mSyncContentResolverDelegate.setIsSyncable(mAccount, mContractAuthority, 1);
+                // This reduces unnecessary resource usage. See http://crbug.com/480688 for details.
+                mSyncContentResolverDelegate.removePeriodicSync(
+                        mAccount, mContractAuthority, Bundle.EMPTY);
+            } else if (mAccount != null) {
+                mSyncContentResolverDelegate.setIsSyncable(mAccount, mContractAuthority, 0);
+            }
         }
 
         // Disable the syncability of Chrome for all other accounts.
         AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(accounts -> {
-            for (Account account : accounts) {
-                if (account.equals(mAccount)) continue;
-                if (mSyncContentResolverDelegate.getIsSyncable(account, mContractAuthority) <= 0) {
-                    continue;
+            try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+                for (Account account : accounts) {
+                    if (account.equals(mAccount)) continue;
+                    if (mSyncContentResolverDelegate.getIsSyncable(account, mContractAuthority)
+                            <= 0) {
+                        continue;
+                    }
+                    mSyncContentResolverDelegate.setIsSyncable(account, mContractAuthority, 0);
                 }
-                mSyncContentResolverDelegate.setIsSyncable(account, mContractAuthority, 0);
             }
         });
     }
@@ -275,16 +283,19 @@
         boolean oldChromeSyncEnabled = mChromeSyncEnabled;
         boolean oldMasterSyncEnabled = mMasterSyncEnabled;
 
-        if (mAccount != null) {
-            mIsSyncable =
-                    mSyncContentResolverDelegate.getIsSyncable(mAccount, mContractAuthority) > 0;
-            mChromeSyncEnabled =
-                    mSyncContentResolverDelegate.getSyncAutomatically(mAccount, mContractAuthority);
-        } else {
-            mIsSyncable = false;
-            mChromeSyncEnabled = false;
+        try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+            if (mAccount != null) {
+                mIsSyncable =
+                        mSyncContentResolverDelegate.getIsSyncable(mAccount, mContractAuthority)
+                        > 0;
+                mChromeSyncEnabled = mSyncContentResolverDelegate.getSyncAutomatically(
+                        mAccount, mContractAuthority);
+            } else {
+                mIsSyncable = false;
+                mChromeSyncEnabled = false;
+            }
+            mMasterSyncEnabled = mSyncContentResolverDelegate.getMasterSyncAutomatically();
         }
-        mMasterSyncEnabled = mSyncContentResolverDelegate.getMasterSyncAutomatically();
 
         if (mAccount != null && ProfileSyncService.get() != null
                 && ChromeFeatureList.isEnabled(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
index e1fc830..9d31183 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
@@ -211,11 +211,20 @@
                     SigninUtils.logEvent(
                             ProfileAccountManagementMetrics.TOGGLE_SIGNOUT, mGaiaServiceType);
 
-                    SignOutDialogFragment signOutFragment =
-                            SignOutDialogFragment.create(mGaiaServiceType);
-                    signOutFragment.setTargetFragment(AccountManagementFragment.this, 0);
-                    signOutFragment.show(getFragmentManager(), SIGN_OUT_DIALOG_TAG);
-
+                    if (IdentityServicesProvider.get()
+                                    .getIdentityManager(Profile.getLastUsedRegularProfile())
+                                    .getPrimaryAccountInfo(ConsentLevel.SYNC)
+                            != null) {
+                        // Only show the sign-out dialog if the user has given sync consent.
+                        SignOutDialogFragment signOutFragment =
+                                SignOutDialogFragment.create(mGaiaServiceType);
+                        signOutFragment.setTargetFragment(AccountManagementFragment.this, 0);
+                        signOutFragment.show(getFragmentManager(), SIGN_OUT_DIALOG_TAG);
+                    } else {
+                        IdentityServicesProvider.get()
+                                .getSigninManager(Profile.getLastUsedRegularProfile())
+                                .signOut(SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS, null, false);
+                    }
                     return true;
                 }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java
index 9e594d7..2838a12 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java
@@ -174,7 +174,10 @@
         mIsFromSigninScreen =
                 IntentUtils.safeGetBoolean(getArguments(), IS_FROM_SIGNIN_SCREEN, false);
 
-        getActivity().setTitle(R.string.manage_sync_title);
+        getActivity().setTitle(
+                ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
+                        ? R.string.sync_category_title
+                        : R.string.manage_sync_title);
         setHasOptionsMenu(true);
         // TODO(https://crbug.com/1063982): Change accessibility text for Advanced Sync Flow.
 
diff --git a/chrome/android/monochrome/scripts/monochrome_python_tests.py b/chrome/android/monochrome/scripts/monochrome_python_tests.py
index 13df49c..bce6563 100755
--- a/chrome/android/monochrome/scripts/monochrome_python_tests.py
+++ b/chrome/android/monochrome/scripts/monochrome_python_tests.py
@@ -40,6 +40,9 @@
   parser.add_argument(
       '--system-webview-pathmap',
       help='The system webview APK resources pathmap path.')
+  parser.add_argument(
+      '--avd-config',
+      help='Workaround for crbug.com/1137405, do not use.')
 
   return parser
 
@@ -49,6 +52,12 @@
 
   runner = typ.Runner()
   runner.parse_args(argument_parser, argv[1:])
+  # Disable all checks when --avd-config is provided because it is not supported
+  # by the typ.ArgumentParser(). This should happen only with tests running on
+  # Android emulator. TODO(crbug.com/1137405): Add support for --avd-config to
+  # typ.
+  if runner.args.avd_config:
+    return 0
   runner.args.top_level_dirs = [ os.path.dirname(__file__) ]
   runner.context = runner.args
 
diff --git a/chrome/android/webapk/strings/translations/android_webapk_strings_mn.xtb b/chrome/android/webapk/strings/translations/android_webapk_strings_mn.xtb
index 3dfad74..8f3ab7e8 100644
--- a/chrome/android/webapk/strings/translations/android_webapk_strings_mn.xtb
+++ b/chrome/android/webapk/strings/translations/android_webapk_strings_mn.xtb
@@ -2,13 +2,13 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mn">
 <translation id="1700971771753530690"><ph name="APP_NAME" />-д дараах апп шаардлагатай:</translation>
-<translation id="2697679025356221813"><ph name="APP_NAME" /> ажиллахын тулд вэб хөтөч шаардлагатай</translation>
+<translation id="2697679025356221813"><ph name="APP_NAME" /> ажиллахын тулд веб хөтөч шаардлагатай</translation>
 <translation id="3858759029325727987">Энэ аппыг дэмждэг хөтөч сонгоно уу:</translation>
 <translation id="4165986682804962316">Сайтын тохиргоо</translation>
 <translation id="6377677440246641805"><ph name="BROWSER_NAME" />\nДэмжигдээгүй</translation>
 <translation id="7671141431838911305">СУУЛГАХ</translation>
 <translation id="809358319115531236">Орон зайг удирдахыг дараах хөтөч дэмждэггүй: <ph name="BROWSER_PACKAGE" />.</translation>
 <translation id="8252328707312954493">ХААХ</translation>
-<translation id="9213932439211643363">Вэб сайтын тохиргоог удирдах</translation>
+<translation id="9213932439211643363">Веб сайтын тохиргоог удирдах</translation>
 <translation id="987264212798334818">Ерөнхий</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 5bb50d0..d7af6bf0 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7958,6 +7958,12 @@
         <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_BUTTON_LABEL" desc="Label of the cancel button in the web signin interception bubble">
           No thanks
         </message>
+        <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_SWITCH_BUTTON_LABEL" desc="Label of the cancel button in the web signin interception bubble (profile switch variant)">
+          Cancel
+        </message>
+        <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CONFIRM_SWITCH_BUTTON_LABEL" desc="Label of the profile switch button in the web signin interception bubble">
+          Switch
+        </message>
         <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_CONSUMER_BUBBLE_DESC" desc="Body of the web signin interception bubble">
           To keep your browsing separate, you can create a new profile for <ph name="NEW_USER">$1<ex>Bob</ex></ph>
         </message>
@@ -7973,6 +7979,12 @@
         <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_ENTERPRISE_PROFILE_NAME" desc="Default name for work profiles created after signin interception">
           Work
         </message>
+        <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_TITLE" desc="Title for the profile switch interception bubble">
+          Switch to another profile?
+        </message>
+        <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_DESC" desc="Description for the profile switch interception bubble">
+          <ph name="EXISTING_USER">$2<ex>Bob</ex></ph>'s profile is already signed in to <ph name="NEW_USER">$1<ex>bob@gmail.com</ex></ph>
+        </message>
       </if>
 
       <!-- Signin Error tab modal dialog -->
diff --git a/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_SWITCH_BUTTON_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_SWITCH_BUTTON_LABEL.png.sha1
new file mode 100644
index 0000000..150d9116
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_SWITCH_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@
+c76614ee7a694b28c9888e29efed8286c3677e5c
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CONFIRM_SWITCH_BUTTON_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CONFIRM_SWITCH_BUTTON_LABEL.png.sha1
new file mode 100644
index 0000000..150d9116
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CONFIRM_SWITCH_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@
+c76614ee7a694b28c9888e29efed8286c3677e5c
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_DESC.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_DESC.png.sha1
new file mode 100644
index 0000000..150d9116
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_DESC.png.sha1
@@ -0,0 +1 @@
+c76614ee7a694b28c9888e29efed8286c3677e5c
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_TITLE.png.sha1
new file mode 100644
index 0000000..150d9116
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_TITLE.png.sha1
@@ -0,0 +1 @@
+c76614ee7a694b28c9888e29efed8286c3677e5c
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 13d8ab53..6a97bfd 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -2308,9 +2308,18 @@
   <message name="IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_SECTION_TITLE" translateable="false" desc="The title of the Wifi Sync section on the settings page. Wi-Fi Sync V2 allows user to sync network configurations between Chrome OS devices and a connected Android phone.">
     Wi-Fi Sync
   </message>
-  <message name="IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_SUMMARY" translateable="false" desc="Description of for the 'Wifi Sync' setting. This feature lets the user sync wifi network configurations between Chrome OS devices and a connected Android phone">
+  <message name="IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_SUMMARY" translateable="false" desc="Description for the 'Wifi Sync' section on the settings page. This feature lets the user sync wifi network configurations between Chrome OS devices and a connected Android phone">
     Sync Wi-Fi networks with your phone <ph name="LINK_BEGIN">&lt;a target="_blank" href="$1<ex>https://google.com/</ex>"&gt;</ph>Learn more<ph name="LINK_END">&lt;/a&gt;</ph>
   </message>
+  <message name="IDS_SETTINGS_MULTIDEVICE_ENABLE_WIFI_SYNC_V1_SUMMARY" desc="Description for the 'Wifi Sync' section on the settings page when the prerequisite 'Chrome Sync' setting is not activated. This feature lets the user sync wifi network configurations between Chrome OS devices and a connected Android phone. The description contains a link that leads to the toggle where the prerequisite 'Chrome Sync' feature can be turned on and a 'Learn More' link to learn more about the 'Wifi Sync' feature.">
+    Turn on <ph name="LINK1_BEGIN">&lt;a id="chromeSyncLink"&gt;</ph>Chrome Sync<ph name="LINK1_END">&lt;/a&gt;</ph> to use Wi-Fi Sync. <ph name="LINK2_BEGIN">&lt;a id="learnMoreLink" target="_blank" href="$1<ex>https://google.com/</ex>"&gt;</ph>Learn more<ph name="LINK2_END">&lt;/a&gt;</ph>
+  </message>
+  <message name="IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_CHROME_SYNC_LABEL" desc="Accessibility label (used by screen readers, not shown in UI) for a link that leads to the Chrome Sync toggle that needs to be enabled as a prerequisite for the 'Wifi Sync' feature to be enabled. This feature lets the user sync wifi network configurations between Chrome OS devices and a connected Android phone.">
+    Turn on Chrome Sync to use Wi-Fi Sync
+  </message>
+  <message name="IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_LEARN_MORE_LABEL" desc="Accessibility label (used by screen readers, not shown in UI) for a link that leads to a page with more information about the 'Wifi Sync' feature. This feature lets the user sync wifi network configurations between Chrome OS devices and a connected Android phone.">
+    Wi-Fi Sync, Learn More
+  </message>
 
   <!-- Lock Screen Page (OS settings) -->
   <message name="IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_TITLE" desc="The title of options to change the behavior of notifications on the lock screen.">
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_ENABLE_WIFI_SYNC_V1_SUMMARY.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_ENABLE_WIFI_SYNC_V1_SUMMARY.png.sha1
new file mode 100644
index 0000000..d058295
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_ENABLE_WIFI_SYNC_V1_SUMMARY.png.sha1
@@ -0,0 +1 @@
+7e2cf70085c5e3c8beb50503dd887773738473db
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_CHROME_SYNC_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_CHROME_SYNC_LABEL.png.sha1
new file mode 100644
index 0000000..62a1285
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_CHROME_SYNC_LABEL.png.sha1
@@ -0,0 +1 @@
+765817fff5ca9b69cddc698f0ce50c351ba3e897
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_LEARN_MORE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_LEARN_MORE_LABEL.png.sha1
new file mode 100644
index 0000000..9344a64
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_LEARN_MORE_LABEL.png.sha1
@@ -0,0 +1 @@
+03774e15b69cc9b69693857c9d120cedc3a7aec6
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index 680d72c..9f25f18 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -46,6 +46,7 @@
 <translation id="2711502716910134313">Chromium Tab</translation>
 <translation id="2718390899429598676">For added security, Chromium will encrypt your data.</translation>
 <translation id="2770231113462710648">Change default browser to:</translation>
+<translation id="2774556997178638058"><ph name="BEGIN_LINK" />Your administrator<ph name="END_LINK" /> has disabled Chromium's check for harmful software</translation>
 <translation id="2799223571221894425">Relaunch</translation>
 <translation id="2847479871509788944">Remove from Chromium...</translation>
 <translation id="2853765747879685679">Ask when I open Chromium</translation>
@@ -53,6 +54,7 @@
 <translation id="2910007522516064972">About &amp;Chromium</translation>
 <translation id="2977470724722393594">Chromium is up to date</translation>
 <translation id="2983934633046890458">Chromium is trying to edit passwords.</translation>
+<translation id="3031887101543416445">{NUM_DAYS,plural, =1{Chromium didn't find known harmful software on your computer. Last checked: one day ago.}other{Chromium didn't find known harmful software on your computer. Last checked: {NUM_DAYS} days ago.}}</translation>
 <translation id="3032706164202344641">Chromium can't check your passwords. Try again later.</translation>
 <translation id="3032787606318309379">Adding to Chromium ...</translation>
 <translation id="3068515742935458733">Help make Chromium better by sending crash reports and <ph name="UMA_LINK" /> to Google</translation>
@@ -72,6 +74,7 @@
 <translation id="347328004046849135">Chromium will notify you when you sign in with a compromised password</translation>
 <translation id="3474745554856756813">This will delete <ph name="ITEMS_COUNT" /> items from this device. To retrieve your data later, sign in to Chromium as <ph name="USER_EMAIL" />.</translation>
 <translation id="3509308970982693815">Please close all Chromium windows and try again.</translation>
+<translation id="3527440529060401414">Chromium can check your computer for harmful software</translation>
 <translation id="3575459661164320785">There's harmful software on your computer. Chromium can remove it, restore your settings and disable extensions to make your browser work normally again.</translation>
 <translation id="3639635944603682591">This person's browsing data will be deleted from this device. To recover the data, sign in to Chromium as <ph name="USER_EMAIL" />.</translation>
 <translation id="364817392622123556">{COUNT,plural, =0{A new update for Chromium is available and will be applied as soon as you relaunch.}=1{A new update for Chromium is available and will be applied as soon as you relaunch. Your Incognito window won't reopen.}other{A new update for Chromium is available and will be applied as soon as you relaunch. Your # Incognito windows won't reopen.}}</translation>
@@ -87,18 +90,21 @@
 <translation id="3945058413678539331">Chromium is trying to copy passwords. Type your Windows password to allow this.</translation>
 <translation id="4036079820698952681">Help make Chromium better by reporting the <ph name="BEGIN_LINK" />current settings<ph name="END_LINK" /></translation>
 <translation id="4050175100176540509">Important security improvements and new features are available in the latest version.</translation>
+<translation id="4136604564421273381">Chromium is removing harmful software from your computer…</translation>
 <translation id="419998258129752635"><ph name="PAGE_TITLE" /> – Network sign-in – Chromium</translation>
 <translation id="421369550622382712">Discover great apps, games, extensions and themes for Chromium.</translation>
 <translation id="4216212958613226427">This language is used to display the Chromium UI</translation>
 <translation id="4230135487732243613">Link my Chromium data to this account</translation>
 <translation id="4271805377592243930">Get help with Chromium</translation>
 <translation id="4285930937574705105">Installation failed due to unspecified error. If Google Chrome is currently running, please close it and try again.</translation>
+<translation id="4352041330999353637">Chromium didn't find known harmful software on your computer. Last checked: yesterday.</translation>
 <translation id="4407044323746248786">Exit Chromium anyway?</translation>
 <translation id="4415566066719264597">Let Chromium Run in the Background</translation>
 <translation id="4423735387467980091">Customise and control Chromium</translation>
 <translation id="4544142686420020088">Chromium didn't update. Something went wrong. <ph name="BEGIN_LINK" />Fix Chromium update problems and failed updates.<ph name="END_LINK" /></translation>
 <translation id="4567424176335768812">You're signed in as <ph name="USER_EMAIL_ADDRESS" />. Now you can access your bookmarks, history and other settings on all your signed in devices.</translation>
 <translation id="459535195905078186">Chromium Apps</translation>
+<translation id="4595492485953540730">{NUM_MINS,plural, =1{Chromium didn't find known harmful software on your computer. Last checked: 1 minute ago.}other{Chromium didn't find known harmful software on your computer. Last checked: {NUM_MINS} minutes ago.}}</translation>
 <translation id="4677944499843243528">The profile appears to be in use by another Chromium process (<ph name="PROCESS_ID" />) on another computer (<ph name="HOST_NAME" />). Chromium has locked the profile so that it doesn't get corrupted. If you are sure that no other processes are using this profile, you can unlock the profile and relaunch Chromium.</translation>
 <translation id="469338717132742108">Get help with Chromium OS</translation>
 <translation id="4708774505295300557">Someone previously signed in to Chromium on this computer as <ph name="ACCOUNT_EMAIL_LAST" />. Please create a new Chromium user to keep your information separate.</translation>
@@ -107,6 +113,7 @@
 <translation id="4750035648288509542">Nearly up to date! Relaunch Chromium to finish updating. Incognito windows won't reopen.</translation>
 <translation id="4788777615168560705">Chromium can't check your passwords. Try again after 24 hours or <ph name="BEGIN_LINK" />check passwords in your Google Account<ph name="END_LINK" />.</translation>
 <translation id="479167709087336770">This uses the same spell checker that's used in Google search. Text that you type in the browser is sent to Google. You can always change this behaviour in settings.</translation>
+<translation id="487524289568229802">Chromium is checking your computer for harmful software…</translation>
 <translation id="4888717733111232871">Inbound rule for Chromium to allow mDNS traffic.</translation>
 <translation id="4893632094755846570">This will permanently delete your browsing data from this device. To recover the data, sign in to Chromium as</translation>
 <translation id="4943838377383847465">Chromium is in background mode.</translation>
@@ -171,6 +178,7 @@
 Some features may be unavailable. Please specify a different profile directory or use a newer version of Chromium.</translation>
 <translation id="6734080038664603509">Update &amp;Chromium</translation>
 <translation id="6734291798041940871">Chromium is already installed for all users on your computer.</translation>
+<translation id="6737557815519435616">Chromium didn't find known harmful software on your computer. Last checked: a moment ago.</translation>
 <translation id="6762551859069255163">Use different profiles in Chromium to separate work and personal browsing, or for different people who use this device</translation>
 <translation id="6774082503108938489">Your parent has turned off 'Permissions for sites, apps and extensions' for Chromium. Enabling this <ph name="EXTENSION_TYPE_PARAMETER" /> is not allowed.</translation>
 <translation id="6847869444787758381">Chromium lets you know if your passwords are ever compromised</translation>
@@ -180,6 +188,7 @@
 <translation id="6964305034639999644">Open link in Chromium inco&amp;gnito window</translation>
 <translation id="6990124437352146030">Chromium needs permission to access your microphone for this site</translation>
 <translation id="701244094609242530">Chromium can't check your extensions. Try again later.</translation>
+<translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium didn't find known harmful software on your computer. Last checked: 1 hour ago.}other{Chromium didn't find known harmful software on your computer. Last checked: {NUM_HOURS} hours ago.}}</translation>
 <translation id="705851970750939768">Update Chromium</translation>
 <translation id="7066436765290594559">Chromium OS could not sync your data. Please update your Sync passphrase.</translation>
 <translation id="7067091210845072982">If an image doesn’t have a useful description, Chromium will try to provide one for you. To create descriptions, images are sent to Google.</translation>
@@ -240,6 +249,7 @@
 <translation id="8621669128220841554">Installation failed due to unspecified error. Please download Chromium again.</translation>
 <translation id="8697124171261953979">It also controls what page is shown when you start Chromium or search from the Omnibox.</translation>
 <translation id="8704119203788522458">This is your Chromium</translation>
+<translation id="8733034664173984083">An error occurred while Chromium was checking your computer for harmful software</translation>
 <translation id="8796602469536043152">Chromium needs permission to access your camera and microphone for this site</translation>
 <translation id="8803635938069941624">Chromium OS terms</translation>
 <translation id="8821041990367117597">Chromium could not sync your data because your account sign-in details are out of date.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb
index 5d75478..0dc5caf 100644
--- a/chrome/app/resources/chromium_strings_mn.xtb
+++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -45,7 +45,7 @@
 <translation id="2648074677641340862">Суулгалтын явцад үйлдлийн системийн алдаа гарлаа. Chromium-ыг дахин татаж авна уу.</translation>
 <translation id="2711502716910134313">Chromium чихтэй хуудас</translation>
 <translation id="2718390899429598676">Таны аюулгүй байдлыг сайжруулахын тулд Chromium таны өгөгдлийг шифрлэх болно.</translation>
-<translation id="2770231113462710648">Стандарт вэб хөтчийг дараах руу өөрчил:</translation>
+<translation id="2770231113462710648">Стандарт веб хөтчийг дараах руу өөрчил:</translation>
 <translation id="2799223571221894425">Дахин эхлүүлэх</translation>
 <translation id="2847479871509788944">Chromium-аас устгах ...</translation>
 <translation id="2853765747879685679">Намайг Chromium-г нээх үед асуух</translation>
@@ -78,7 +78,7 @@
 <translation id="370962675267501463">{COUNT,plural, =0{Энэ шинэчлэлтийг хэрэгжүүлэхийн тулд Chromium-г дахин ачаалахыг таны администратор танаас хүсэж байна}=1{Энэ шинэчлэлтийг хэрэгжүүлэхийн тулд Chromium-г дахин ачаалахыг таны администратор танаас хүсэж байна. Таны нууцлалтай цонхыг дахин нээхгүй.}other{Энэ шинэчлэлтийг хэрэгжүүлэхийн тулд Chromium-г дахин ачаалахыг таны администратор танаас хүсэж байна. Таны # нууцлалтай цонхыг дахин нээхгүй.}}</translation>
 <translation id="3713809861844741608">Холбоосыг шинэ Chromium болон чихтэй хуудсанд нээх</translation>
 <translation id="3728336900324680424">Chromium хаяг оруулах хэсэгт зөвлөмж харуулахын тулд таны Драйвт хандах болно</translation>
-<translation id="378917192836375108">Chromium танд вэб сайтад байгаа дугаар дээр дараад Skype-тай дуудлага хийх боломжийг олгоно.</translation>
+<translation id="378917192836375108">Chromium танд веб сайтад байгаа дугаар дээр дараад Skype-тай дуудлага хийх боломжийг олгоно.</translation>
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation>
 <translation id="388648406173476553">Chromium-г өөрчилж, хянана уу. Та ямар нэг зүйлд анхаарлаа хандуулах шаардлагатай байна. Дэлгэрэнгүй мэдээлэл авахын тулд товшино уу.</translation>
 <translation id="3889543394854987837">Chromium-г нээх мөн хөтөчийг ашиглаж эхлэхийн тулд өөрийн нэр дээр дарна уу.</translation>
@@ -118,7 +118,7 @@
 <translation id="538767207339317086">Chromium-д нэвтрэхийг зөвшөөрөх</translation>
 <translation id="5398878173008909840">Ашиглах боломжтой Chromium-ийн шинэ хувилбар байна.</translation>
 <translation id="5416696090975899932">Суурилуулсан PDF харагч байхгүй тохиолдолд Chromium хэвлэх байдлаар урьдчилан харуулах боломжгүй.</translation>
-<translation id="5427571867875391349">Chromium-ыг өөрийн анхдагч вэб хөтөч болгон тохируулах</translation>
+<translation id="5427571867875391349">Chromium-ыг өөрийн анхдагч веб хөтөч болгон тохируулах</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Бета</translation>
 <translation id="5479196819031988440">Chromium үйлдлийн систем энэ хуудсыг нээх боломжгүй.</translation>
 <translation id="5480860683791598150">Таны байршлыг энэ сайттай хуваалцахын тулд Chromium-д таны байршилд хандах зөвшөөрөл шаардлагатай</translation>
@@ -148,7 +148,7 @@
 <translation id="6212496753309875659">Энэ компьютерт Chromium-ийн хамгийн сүүлийн үеийн хувилбар байна. Хэрэв программ ажиллахгүй байвал Chromium-ийг устгаад, дахин суурьлуулж үзнэ үү.</translation>
 <translation id="6219195342503754812">{0,plural, =0{Chromium-г одоо дахин ажиллуулна}=1{Chromium-г 1 секундийн дотор дахин ажиллуулна}other{Chromium-г # секундийн дотор дахин ажиллуулна}}</translation>
 <translation id="623836266260425961">Chromium үйлдлийн систем таны өгөгдлийг синк хийж чадсангүй.</translation>
-<translation id="6248213926982192922">Chromium-ыг анхдагч вэб хөтөч болгох</translation>
+<translation id="6248213926982192922">Chromium-ыг анхдагч веб хөтөч болгох</translation>
 <translation id="6266342355635466082">Chromium нь шинэчлэлтийг шалгах боломжгүй байна. Интернэт холболтоо шалгаж үзнэ үү.</translation>
 <translation id="6268381023930128611">Chromium-с гарах уу?</translation>
 <translation id="6295779123002464101"><ph name="FILE_NAME" /> аюултай байж болзошгүй тул үүнийг Chromium блок хийсэн.</translation>
@@ -156,7 +156,7 @@
 <translation id="6333502561965082103">Chromium-д өөр үйл ажиллагаа явагдаж байна. Дараа дахин оролдоно уу.</translation>
 <translation id="6334986366598267305">Одоо та Google хаягаа ашиглан мөн өөр бусад компьютер дээр Chromium-г ашиглахад хялбар боллоо.</translation>
 <translation id="6373523479360886564">Та Chromium-ыг устгахыг хүсэж байгаадаа итгэлтэй байна уу?</translation>
-<translation id="6403826409255603130">Chromium бол вэб хуудсууд болон аппликейшнуудыг цахилгааны хурдаар ажиллуулдаг вэб хөтөч юм. Энэ нь хурдан, найдвартай мөн хэрэглэхэд хялбар. Chromium-д бий болгосон хорт вирус болон фишингийн хамгаалалтыг ашиглан вэбээр илүү аюулгүй хайлт хийгээрэй.</translation>
+<translation id="6403826409255603130">Chromium бол веб хуудсууд болон аппликейшнуудыг цахилгааны хурдаар ажиллуулдаг веб хөтөч юм. Энэ нь хурдан, найдвартай мөн хэрэглэхэд хялбар. Chromium-д бий болгосон хорт вирус болон фишингийн хамгаалалтыг ашиглан вебээр илүү аюулгүй хайлт хийгээрэй.</translation>
 <translation id="6434250628340475518">Chromium OS Систем</translation>
 <translation id="6457450909262716557">{SECONDS,plural, =1{Chromium 1 секундийн дараа дахин эхэлнэ}other{Chromium # секундийн дараа дахин эхэлнэ}}</translation>
 <translation id="6475912303565314141">Энэ нь мөн таныг Chromium-ыг эхлүүлж байх үед гарч ирсэн хуудсыг хянадаг.</translation>
@@ -190,7 +190,7 @@
 <translation id="7318036098707714271">Таны тохиргоо файл алдаатай эсвэл хүчин төгөлдөр бус байна. Chromium таны тохиргоог сэргээх боломжгүй байна.</translation>
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7339898014177206373">Шинэ цонх</translation>
-<translation id="734373864078049451">Таны вэб хуудас, хавчуурга, болон бусад Chromium-ийн зүйлс энд байдаг.</translation>
+<translation id="734373864078049451">Таны веб хуудас, хавчуурга, болон бусад Chromium-ийн зүйлс энд байдаг.</translation>
 <translation id="7349591376906416160">Таны системийн админ Chromium-г<ph name="TARGET_URL_HOSTNAME" />-д хандахын тулд <ph name="ALTERNATIVE_BROWSER_NAME" />-г нээхээр тохируулсан байна.</translation>
 <translation id="7448255348454382571">Chromium OS-г дахин эхлүүлэх</translation>
 <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Дев</translation>
@@ -218,7 +218,7 @@
 <translation id="7937630085815544518">Та Chromium-д <ph name="USER_EMAIL_ADDRESS" />-аар нэвтэрсэн байна. Нэвтрэхийн тулд ижил данс хэрэглэнэ үү.</translation>
 <translation id="7975919845073681630">Энэ нь Chromium-н хоёр дахь суулгалт тул таны өгөгдмөл хөтчөөр сонгох боломжгүй.</translation>
 <translation id="7979877361127045932">Chromium цэсэнд нуух</translation>
-<translation id="8013436988911883588">Chromium-д хандалт олгосны дараа вэб сайтууд таны хандалтыг асуух боломжтой болно.</translation>
+<translation id="8013436988911883588">Chromium-д хандалт олгосны дараа веб сайтууд таны хандалтыг асуух боломжтой болно.</translation>
 <translation id="81770708095080097">Энэ файл аюултай тул Chromium блоклосон байна.</translation>
 <translation id="8248265253516264921">Хэрэв зурагт хэрэгтэй тайлбар байхгүй бол Chromium танд тайлбар өгөхөөр оролдох болно. Тайлбар үүсгэхийн тулд зургийг Google-д илгээнэ. Та үүнийг хүссэн үедээ тохиргоонд унтрааж болно.</translation>
 <translation id="8266560134891435528">Та нэвтрээгүй байгаа тул Chromium таны нууц үгсийг шалгах боломжгүй байна</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index b77e7c4..7ea90bb 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -278,6 +278,7 @@
 <translation id="1313705515580255288">Your bookmarks, history and other settings will be synced to your Google Account.</translation>
 <translation id="1314565355471455267">Android VPN</translation>
 <translation id="131461803491198646">Home network, not roaming</translation>
+<translation id="1315056510003830387">Not allowed to use Flash</translation>
 <translation id="1315144594965013365">Make sure that both devices are unlocked, close together and have Bluetooth turned on. If you’re sharing with a Chromebook, make sure that it has Nearby Sharing turned on (open the status area by selecting the time, then select Nearby Share).</translation>
 <translation id="1316136264406804862">Searching...</translation>
 <translation id="1316495628809031177">Sync is paused</translation>
@@ -337,6 +338,7 @@
 <translation id="1386791642444521222">Activate physical SIM</translation>
 <translation id="1387519831959169718">To keep your browsing separate, you can create a new profile for <ph name="NEW_USER" /></translation>
 <translation id="138784436342154190">Restore default start-up page?</translation>
+<translation id="1388253969141979417">Allowed to use your microphone</translation>
 <translation id="1388728792929436380"><ph name="DEVICE_TYPE" /> will restart when updates are complete.</translation>
 <translation id="1389342855416376185">Block protected content</translation>
 <translation id="1390548061267426325">Open as a Standard Tab</translation>
@@ -387,6 +389,7 @@
 <translation id="1433811987160647649">Ask before accessing</translation>
 <translation id="1434696352799406980">This will reset your startup page, new tab page, search engine and pinned tabs. It will also disable all extensions and clear temporary data like cookies. Your bookmarks, history and saved passwords will not be cleared.</translation>
 <translation id="1434886155212424586">Homepage is the New Tab page</translation>
+<translation id="1435515966666225466">Allowed to use a plug-in to access your computer</translation>
 <translation id="1436390408194692385">Valid for <ph name="TICKET_TIME_LEFT" /></translation>
 <translation id="1436671784520050284">Continue setup</translation>
 <translation id="1436784010935106834">Removed</translation>
@@ -472,6 +475,7 @@
 <translation id="1530838837447122178">Open mouse and touchpad device settings</translation>
 <translation id="1531004739673299060">Application Window</translation>
 <translation id="1531275250079031713">Show 'Add new Wi-Fi' dialogue</translation>
+<translation id="1535228823998016251">Loud</translation>
 <translation id="1536754031901697553">Disconnecting...</translation>
 <translation id="1537254971476575106">Full-screen magnifier</translation>
 <translation id="15373452373711364">Large mouse cursor</translation>
@@ -555,6 +559,7 @@
 <translation id="1627408615528139100">Already downloaded</translation>
 <translation id="1628948239858170093">Scan file before opening?</translation>
 <translation id="1629314197035607094">Password expired</translation>
+<translation id="163072119192489970">Allowed to finish sending and receiving data</translation>
 <translation id="1630768113285622200">Restart and continue</translation>
 <translation id="1632082166874334883">Password stored in your Google Account</translation>
 <translation id="1632803087685957583">Allows you to adjust your keyboard repeat rate, word prediction and more</translation>
@@ -752,6 +757,7 @@
 <translation id="1841705068325380214"><ph name="EXTENSION_NAME" /> is disabled</translation>
 <translation id="184273675144259287">Replace your Linux apps and files with a previous backup</translation>
 <translation id="1842766183094193446">Are you sure that you want to enable demo mode?</translation>
+<translation id="1845727111305721124">Allowed to play sound</translation>
 <translation id="1846308012215045257">Control-click to run <ph name="PLUGIN_NAME" /></translation>
 <translation id="1849186935225320012">This page has full control of MIDI devices.</translation>
 <translation id="1850508293116537636">Rotate &amp;clockwise</translation>
@@ -776,6 +782,7 @@
 <translation id="187145082678092583">Fewer apps</translation>
 <translation id="1871534214638631766">Show related info when you right-click or long press on content</translation>
 <translation id="1871615898038944731">Your <ph name="DEVICE_TYPE" /> is up to date</translation>
+<translation id="1874248162548993294">Allowed to show any ads</translation>
 <translation id="1874972853365565008">{NUM_TABS,plural, =1{Move tab to another window}other{Move tabs to another window}}</translation>
 <translation id="1875386316419689002">This tab is connected to a HID device.</translation>
 <translation id="1875387611427697908">This can only be added from the <ph name="CHROME_WEB_STORE" /></translation>
@@ -831,6 +838,7 @@
 <translation id="1931152874660185993">No components installed.</translation>
 <translation id="1932098463447129402">Not Before</translation>
 <translation id="1933809209549026293">Please connect a mouse or a keyboard. If you are using a Bluetooth device, make sure that it is ready to pair.</translation>
+<translation id="1935303383381416800">Allowed to see your location</translation>
 <translation id="1936931585862840749">Use a number to indicate how many copies to print (1 to <ph name="MAX_COPIES" />).</translation>
 <translation id="1937774647013465102">Cannot import container architecture type <ph name="ARCHITECTURE_CONTAINER" /> with this device which is <ph name="ARCHITECTURE_DEVICE" />. You can try restoring this container into a different device, or you can access the files inside this container image by opening in Files app.</translation>
 <translation id="1938351510777341717">External Command</translation>
@@ -948,6 +956,7 @@
 <translation id="2090165459409185032">To recover your account information, go to: google.com/accounts/recovery</translation>
 <translation id="2090876986345970080">System security setting</translation>
 <translation id="2091887806945687916">Sound</translation>
+<translation id="209539936453343974">To set up parental controls, a child must have a Google Account managed by a parent. <ph name="DEVICE_TYPE_PLURAL" /> allow parents to set up screen limits, approve or block websites and do more with the Family Link app. If the child needs to do schoolwork on sites like Google Classroom, a school account can be added later.</translation>
 <translation id="2096715839409389970">Clear third-party cookies</translation>
 <translation id="2097372108957554726">You need to sign in to Chrome to register new devices</translation>
 <translation id="2098805196501063469">Check remaining passwords</translation>
@@ -1098,6 +1107,7 @@
 <translation id="2261323523305321874">Your administrator has made a system-wide change that disables some old profiles.</translation>
 <translation id="2262332168014443534">Lite mode now makes browsing faster on all pages, including HTTPS.</translation>
 <translation id="2262477216570151239">Delay before repeat</translation>
+<translation id="2262888617381992508">Not allowed to play protected content</translation>
 <translation id="2263189956353037928">Sign out &amp; sign back in</translation>
 <translation id="2263371730707937087">Screen refresh rate</translation>
 <translation id="22665427234727190">Ask when a site wants to access HID devices (recommended)</translation>
@@ -1366,6 +1376,7 @@
 <translation id="2571655996835834626">Change your settings that control websites' access to features such as cookies, JavaScript, plugins, geolocation, microphone, camera, etc.</translation>
 <translation id="2572032849266859634">Read-only access to <ph name="VOLUME_NAME" /> has been granted.</translation>
 <translation id="2575247648642144396">This icon will be visible when the extension can act on the current page. Use this extension by clicking on the icon or by pressing <ph name="EXTENSION_SHORTCUT" />.</translation>
+<translation id="2575441894380764255">Not allowed to show intrusive or misleading ads</translation>
 <translation id="257779572837908839">Set up as Chromebox for meetings</translation>
 <translation id="2579232805407578790">Couldn’t connect with the server. Please check your network connection and try again. If the problem persists, restart your Chromebook. Error code: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Always allow <ph name="HOST" /> to download multiple files</translation>
@@ -1632,6 +1643,7 @@
 <translation id="2880660355386638022">Window placement</translation>
 <translation id="2881076733170862447">When you click the extension</translation>
 <translation id="2882943222317434580"><ph name="IDS_SHORT_PRODUCT_NAME" /> will restart and reset momentarily</translation>
+<translation id="288387288628762616">Allowed to use Flash</translation>
 <translation id="2885378588091291677">Task Manager</translation>
 <translation id="2885729872133513017">A problem occurred when decoding server response.</translation>
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
@@ -1666,6 +1678,7 @@
 <translation id="2923234477033317484">Remove this account</translation>
 <translation id="2926085873880284723">Restore default shortcuts</translation>
 <translation id="2927017729816812676">Cache Storage</translation>
+<translation id="2928795416630981206">Allowed to track your camera position</translation>
 <translation id="2931157624143513983">Fit to printable area</translation>
 <translation id="2932085390869194046">Suggest password...</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Account for kids)</translation>
@@ -1673,6 +1686,7 @@
 <translation id="2932883381142163287">Report abuse</translation>
 <translation id="2933632078076743449">Last update</translation>
 <translation id="2934999512438267372">Full control of MIDI devices allowed</translation>
+<translation id="2935654492420446828">Add a school account later</translation>
 <translation id="2936851848721175671">Backup &amp; restore</translation>
 <translation id="2938225289965773019">Open <ph name="PROTOCOL" /> links</translation>
 <translation id="2938845886082362843">View and delete sign-in data stored on your security key</translation>
@@ -1776,6 +1790,7 @@
 <translation id="3060379269883947824">Enable Select to Speak</translation>
 <translation id="3060952009917586498">Change device language. Current language is <ph name="LANGUAGE" />.</translation>
 <translation id="3065041951436100775">Tab killed feedback.</translation>
+<translation id="306535478112428611">Not allowed to edit files and folders on your device</translation>
 <translation id="3065522099314259755">Keyboard repeat latency</translation>
 <translation id="3067198179881736288">Install app?</translation>
 <translation id="3067198360141518313">Run this plug-in</translation>
@@ -1911,6 +1926,7 @@
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Network error</translation>
 <translation id="3248902735035392926">Safety matters. Take a moment and <ph name="BEGIN_LINK" />check your extensions now<ph name="END_LINK" /></translation>
 <translation id="3251759466064201842">&lt;Not Part Of Certificate&gt;</translation>
+<translation id="325238099842880997">Set digital ground rules to help children play, explore and do schoolwork at home</translation>
 <translation id="3253225298092156258">Not available</translation>
 <translation id="3253448572569133955">Unknown account</translation>
 <translation id="3254084468305910013">{COUNT,plural, =0{No security issues found}=1{Found {COUNT} security issue}other{Found {COUNT} security issues}}</translation>
@@ -2038,6 +2054,7 @@
 <translation id="3404249063913988450">Enable screensaver</translation>
 <translation id="3405664148539009465">Customise fonts</translation>
 <translation id="3405763860805964263">...</translation>
+<translation id="3406290648907941085">Allowed to use virtual reality devices and data</translation>
 <translation id="3406396172897554194">Search by language or input name</translation>
 <translation id="3406605057700382950">&amp;Show bookmarks bar</translation>
 <translation id="340671561090997290">{NUM_EXTENSIONS,plural, =1{This extension may be dangerous}other{These extensions may be dangerous}}</translation>
@@ -2202,6 +2219,7 @@
 <translation id="3586806079541226322">Can't open this file</translation>
 <translation id="3586931643579894722">Hide details</translation>
 <translation id="3587482841069643663">All</translation>
+<translation id="3588790464166520201">Allowed to install payment handlers</translation>
 <translation id="3589766037099229847">Insecure content blocked</translation>
 <translation id="3590194807845837023">Unlock Profile and Relaunch</translation>
 <translation id="3590295622232282437">Entering managed session.</translation>
@@ -2427,6 +2445,7 @@
 <translation id="3822559385185038546">This proxy is enforced by your administrator</translation>
 <translation id="3823310065043511710">At least <ph name="INSTALL_SIZE" /> of space is recommended for Linux.</translation>
 <translation id="3824621460022590830">Device enrolment token is invalid. Please contact your device owner or administrator. Error code: <ph name="ERROR_CODE" />.</translation>
+<translation id="3826071569074535339">Allowed to use motion sensors</translation>
 <translation id="3826440694796503677">Your administrator has disabled the addition of more Google accounts</translation>
 <translation id="3827306204503227641">Continue allowing unsandboxed plug-ins</translation>
 <translation id="3827774300009121996">&amp;Full Screen</translation>
@@ -2479,6 +2498,8 @@
 <translation id="3873423927483480833">Show PINs</translation>
 <translation id="3873915545594852654">A problem with ARC++ occurred.</translation>
 <translation id="3874164307099183178">Turn on Google Assistant</translation>
+<translation id="3877075909000773256">Nearby Share settings for <ph name="USER_NAME" />'s device, sharing under the account <ph name="USER_EMAIL" />.</translation>
+<translation id="387771067039689031">Not allowed to use a plug-in to access your computer</translation>
 <translation id="3879748587602334249">Download manager</translation>
 <translation id="3881478300875776315">Show fewer lines</translation>
 <translation id="3882165008614329320">Existing video from camera or file</translation>
@@ -2515,6 +2536,7 @@
 <translation id="3919145445993746351">To get your extensions on all your computers, turn on sync</translation>
 <translation id="3920504717067627103">Certificate Policies</translation>
 <translation id="392089482157167418">Enable ChromeVox (spoken feedback)</translation>
+<translation id="3920909973552939961">Not allowed to install payment handlers</translation>
 <translation id="3923184630988645767">Data usage</translation>
 <translation id="3923676227229836009">This page is allowed to view files</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -2639,6 +2661,7 @@
 <translation id="4058793769387728514">Check Document Now</translation>
 <translation id="406070391919917862">Background Apps</translation>
 <translation id="4061374428807229313">To share, right-click on a folder in the Files app, then select 'Share with Parallels Desktop'.</translation>
+<translation id="406213378265872299">Customised behaviours</translation>
 <translation id="4065876735068446555">The network you are using (<ph name="NETWORK_ID" />) may require you to visit its login page.</translation>
 <translation id="4066207411788646768">Please check your connection to see available printers in your network</translation>
 <translation id="4068776064906523561">Saved fingerprints</translation>
@@ -2786,6 +2809,7 @@
 <translation id="425573743389990240">Battery Discharge Rate in Watts (Negative value means battery is charging)</translation>
 <translation id="4256316378292851214">Sa&amp;ve Video As...</translation>
 <translation id="4258348331913189841">File System</translation>
+<translation id="4259388776256904261">This may take a while</translation>
 <translation id="4260182282978351200"><ph name="FILE_NAME" /> may be dangerous. Send to Google Advanced Protection for scanning? Press Shift + F6 to cycle to the downloads bar area.</translation>
 <translation id="4263223596040212967">Check your keyboard layout and try again.</translation>
 <translation id="4263757076580287579">Printer registration has been cancelled.</translation>
@@ -2892,6 +2916,7 @@
 <translation id="4400632832271803360">Hold the Launcher key to switch the behaviour of the top-row keys</translation>
 <translation id="4400963414856942668">You can click the star to bookmark a tab</translation>
 <translation id="4403775189117163360">Choose a different folder</translation>
+<translation id="440391631796167175">No weak passwords found</translation>
 <translation id="4404136731284211429">Scan again</translation>
 <translation id="4404843640767531781"><ph name="APP_NAME" /> is blocked by your parent. Ask your parent for permission to use this app.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
@@ -2936,6 +2961,7 @@
 <translation id="4450974146388585462">Diagnose</translation>
 <translation id="4451479197788154834">Your password is saved on this device and in your Google Account</translation>
 <translation id="4451757071857432900">Blocked on sites that show intrusive or misleading ads (recommended)</translation>
+<translation id="4453205916657964690">Subnet mask</translation>
 <translation id="4453946976636652378">Search <ph name="SEARCH_ENGINE_NAME" /> or type a URL</translation>
 <translation id="4459169140545916303">Active <ph name="DEVICE_LAST_ACTIVATED_TIME" /> days ago</translation>
 <translation id="4460014764210899310">Ungroup</translation>
@@ -2963,6 +2989,7 @@
 <translation id="4481530544597605423">Unpaired devices</translation>
 <translation id="4483049906298469269">Failed to ping the non-default network gateway</translation>
 <translation id="4487489714832036847">Chromebooks use apps instead of traditional software. Get apps for productivity, entertainment and more.</translation>
+<translation id="4488257340342212116">Allowed to use your camera</translation>
 <translation id="4488502501195719518">Clear all data?</translation>
 <translation id="449232563137139956">Sites usually show images to provide illustration, like photos for online stores or news articles</translation>
 <translation id="4493468155686877504">Recommended (<ph name="INSTALL_SIZE" />)</translation>
@@ -2995,6 +3022,7 @@
 <translation id="4524832533047962394">The supplied enrolment mode is not supported by this version of the operating system. Please make sure that you are running the newest version.</translation>
 <translation id="4527186207340858212">Create a new profile for work?</translation>
 <translation id="452750746583162491">Review your synced data</translation>
+<translation id="4527929807707405172">Enable reverse scrolling. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Translation suggestion</translation>
 <translation id="4530494379350999373">Origin</translation>
 <translation id="4531924570968473143">Who would you like to add to this <ph name="DEVICE_TYPE" />?</translation>
@@ -3015,6 +3043,7 @@
 <translation id="4545028762441890696">To re-enable it, accept the new permissions:</translation>
 <translation id="4545759655004063573">Cannot save due to insufficient permissions. Please save to another location.</translation>
 <translation id="4546308221697447294">Browse fast with Google Chrome</translation>
+<translation id="4546345569117159016">Right button</translation>
 <translation id="4546692474302123343">Google Assistant voice input</translation>
 <translation id="4547659257713117923">No tabs from other devices</translation>
 <translation id="4547672827276975204">Set automatically</translation>
@@ -3074,6 +3103,7 @@
 <translation id="4608500690299898628">&amp;Find...</translation>
 <translation id="4608520674724523647">Successful enrolment illustration</translation>
 <translation id="4608703838363792434"><ph name="FILE_NAME" /> has sensitive content</translation>
+<translation id="4609987916561367134">Allowed to use JavaScript</translation>
 <translation id="4610162781778310380"><ph name="PLUGIN_NAME" /> has encountered an error</translation>
 <translation id="4610637590575890427">Did you mean to go to <ph name="SITE" />?</translation>
 <translation id="4611114513649582138">Data connection available</translation>
@@ -3185,6 +3215,7 @@
 <translation id="473775607612524610">Update</translation>
 <translation id="473936925429402449">Selected; extra content <ph name="CURRENT_ELEMENT" /> out of <ph name="TOTAL_ELEMENTS" /></translation>
 <translation id="4739639199548674512">Tickets</translation>
+<translation id="4742334355511750246">Not allowed to show images</translation>
 <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Find out how to update applications<ph name="END_LINK" /></translation>
 <translation id="4744981231093950366">{NUM_TABS,plural, =1{Unmute site}other{Unmute sites}}</translation>
 <translation id="4746351372139058112">Messages</translation>
@@ -3320,6 +3351,7 @@
 <translation id="4908811072292128752">Open a new tab to browse two sites at once</translation>
 <translation id="4909038193460299775">Because this account is managed by <ph name="DOMAIN" />, your bookmarks, history, passwords and other settings will be cleared from this device. However, your data will remain stored in your Google Account and can be managed on <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation>
 <translation id="4912643508233590958">Idle Wake Ups</translation>
+<translation id="4915961947098019832">Allowed to show images</translation>
 <translation id="4916542008280060967">Let site edit <ph name="FILE_NAME" />?</translation>
 <translation id="491691592645955587">Switch to a secure browser</translation>
 <translation id="4917385247580444890">Strong</translation>
@@ -3407,6 +3439,7 @@
 <translation id="5027550639139316293">Email Certificate</translation>
 <translation id="5027562294707732951">Add extension</translation>
 <translation id="5029568752722684782">Clear copy</translation>
+<translation id="5033137252639132982">Not allowed to use motion sensors</translation>
 <translation id="5033266061063942743">Geometric shapes</translation>
 <translation id="5036662165765606524">Do not allow any site to download multiple files automatically</translation>
 <translation id="5037676449506322593">Select All</translation>
@@ -3456,6 +3489,7 @@
 <translation id="5088172560898466307">Server hostname</translation>
 <translation id="5088534251099454936">PKCS #1 SHA-512 With RSA Encryption</translation>
 <translation id="5089810972385038852">State</translation>
+<translation id="5090637338841444533">Not allowed to track your camera position</translation>
 <translation id="5094721898978802975">Communicate with cooperating native applications</translation>
 <translation id="5097002363526479830">Failed to connect to the network '<ph name="NAME" />': <ph name="DETAILS" /></translation>
 <translation id="5097649414558628673">Tool: <ph name="PRINT_NAME" /></translation>
@@ -3764,6 +3798,7 @@
 <translation id="5471768120198416576">Hi there! I'm your text-to-speech voice.</translation>
 <translation id="5472627187093107397">Save passwords for this site</translation>
 <translation id="5473333559083690127">Re-enter new PIN</translation>
+<translation id="5481273127572794904">Not allowed to automatically download multiple files</translation>
 <translation id="5481941284378890518">Add Nearby Printers</translation>
 <translation id="5483785310822538350">Revoke file and device access</translation>
 <translation id="5485080380723335835">Your <ph name="DEVICE_TYPE" /> is locked for security. Manually enter your password to continue.</translation>
@@ -3785,6 +3820,7 @@
 <translation id="5495466433285976480">This will remove all local users, files, data and other settings after your next restart. All users will need to sign in again.</translation>
 <translation id="5495597166260341369">Keep display on</translation>
 <translation id="5496587651328244253">Organise</translation>
+<translation id="5496730470963166430">Not allowed to send pop-ups or use redirects</translation>
 <translation id="5497251278400702716">This file</translation>
 <translation id="5498967291577176373">Write faster with inline suggestions for your name, address or phone number</translation>
 <translation id="5499313591153584299">This file may be harmful for your computer.</translation>
@@ -3792,6 +3828,7 @@
 <translation id="5500709606820808700">Safety check ran today</translation>
 <translation id="5501809658163361512">{COUNT,plural, =1{Failed to receive <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}other{Failed to receive <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}}</translation>
 <translation id="5502500733115278303">Imported From Firefox</translation>
+<translation id="5502915260472117187">A child</translation>
 <translation id="5503982651688210506">Continue allowing <ph name="HOST" /> to use and move your camera, and use your microphone</translation>
 <translation id="5505264765875738116">Sites can't ask to send notifications</translation>
 <translation id="5505307013568720083">Out of ink</translation>
@@ -3879,6 +3916,7 @@
 <translation id="5596627076506792578">More options</translation>
 <translation id="5600706100022181951">Update will be downloaded using <ph name="UPDATE_SIZE_MB" /> MB of mobile data. Would you like to continue?</translation>
 <translation id="5601503069213153581">PIN</translation>
+<translation id="5601823921345337195">Not allowed to connect to MIDI devices</translation>
 <translation id="5602765853043467355">Clear bookmarks, history, passwords and more from this device</translation>
 <translation id="5605623530403479164">Other search engines</translation>
 <translation id="5605758115928394442">A notification was sent to your phone to confirm that it's you.</translation>
@@ -3999,6 +4037,7 @@
 <translation id="5747552184818312860">Expires</translation>
 <translation id="5747785204778348146">Developer - unstable</translation>
 <translation id="5747809636523347288">Paste and go to <ph name="URL" /></translation>
+<translation id="5754152670305761216">Allowed to play protected content</translation>
 <translation id="5756163054456765343">Help centre</translation>
 <translation id="5759728514498647443">Documents that you send to print via <ph name="APP_NAME" /> can be read by <ph name="APP_NAME" />.</translation>
 <translation id="5763751966069581670">No USB devices found</translation>
@@ -4468,6 +4507,7 @@
 <translation id="6295158916970320988">All sites</translation>
 <translation id="6295855836753816081">Saving...</translation>
 <translation id="6298962879096096191">Use Google Play to install Android apps</translation>
+<translation id="6300177430812514606">Not allowed to finish sending or receiving data</translation>
 <translation id="630065524203833229">E&amp;xit</translation>
 <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> could not be configured automatically. Please specify advanced printer details. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="6301076166764763868">To separate personal and <ph name="EXISTING_USER" /> browsing, create a new profile for <ph name="NEW_USER" /></translation>
@@ -4545,6 +4585,7 @@
 <translation id="6390020764191254941">Move tab to new window</translation>
 <translation id="6390799748543157332">Pages that you view in this window won’t appear in the browser history and they won’t leave other traces, like cookies, on the computer after you close all open Guest windows. Any files that you download, however, will be preserved.</translation>
 <translation id="6393156038355142111">Suggest strong password</translation>
+<translation id="6393550101331051049">Allowed to show insecure content</translation>
 <translation id="6395423953133416962">Send <ph name="BEGIN_LINK1" />system information<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />metrics<ph name="END_LINK2" /></translation>
 <translation id="6396988158856674517">Block sites from using motion sensors</translation>
 <translation id="6398715114293939307">Remove Google Play Store</translation>
@@ -4577,6 +4618,7 @@
 <translation id="6425556984042222041">Text-to-speech rate</translation>
 <translation id="6426200009596957090">Open ChromeVox settings</translation>
 <translation id="642654727595919401"><ph name="DOMAIN" /> requires you to back up your data and return this <ph name="DEVICE_TYPE" /> within 1 week.<ph name="LINK_BEGIN" />See details<ph name="LINK_END" /></translation>
+<translation id="642729974267661262">Not allowed to play sound</translation>
 <translation id="6428982734197629783">Processing image</translation>
 <translation id="6429384232893414837">Update error</translation>
 <translation id="6430814529589430811">Base64-encoded ASCII, single certificate</translation>
@@ -4605,6 +4647,7 @@
 <translation id="6458701200018867744">Upload failed (<ph name="WEBRTC_LOG_UPLOAD_TIME" />).</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
 <translation id="6459799433792303855">Active window moved to another display.</translation>
+<translation id="6460566145397380451">Allowed to connect to MIDI devices</translation>
 <translation id="6460601847208524483">Find Next</translation>
 <translation id="6461170143930046705">Searching for networks...</translation>
 <translation id="6463795194797719782">&amp;Edit</translation>
@@ -4636,6 +4679,7 @@
 <translation id="6499681088828539489">Disallow proxies for shared networks</translation>
 <translation id="650266656685499220">To create albums, go to Google Photos</translation>
 <translation id="6503077044568424649">Most visited</translation>
+<translation id="650457560773015827">Left button</translation>
 <translation id="6504611359718185067">Connect to the Internet to add a printer</translation>
 <translation id="6506374932220792071">X9.62 ECDSA Signature with SHA-256</translation>
 <translation id="6508248480704296122">Related to <ph name="NAME_PH" /></translation>
@@ -4837,6 +4881,7 @@
 <translation id="676560328519657314">Your payment methods in Google Pay</translation>
 <translation id="6767566652486411142">Choose another language…</translation>
 <translation id="6767639283522617719">Can’t join the domain. Make sure that the settings are correct for the organisational unit.</translation>
+<translation id="6768034047581882264">Not allowed to show insecure content</translation>
 <translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> recommends that you update this device.</translation>
 <translation id="6769712124046837540">Adding printer...</translation>
 <translation id="6770602306803890733">Improves security for you and everyone on the web</translation>
@@ -4928,6 +4973,7 @@
 <translation id="6865313869410766144">Auto-fill form data</translation>
 <translation id="6865598234501509159">Page Is not in <ph name="LANGUAGE" /></translation>
 <translation id="6865708901122695652">WebRTC event logs (<ph name="WEBRTC_EVENT_LOG_COUNT" />)</translation>
+<translation id="686609795364435700">Quiet</translation>
 <translation id="686664946474413495">Colour temperature</translation>
 <translation id="6868934826811377550">See details.</translation>
 <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation>
@@ -4977,6 +5023,7 @@
 <translation id="6922745772873733498">Enter a pin to print</translation>
 <translation id="6923132443355966645">Scroll/Click</translation>
 <translation id="6923633482430812883">Error mounting share. Please check that the file server that you are connecting to supports SMBv2 or later.</translation>
+<translation id="6929126689972602640">Parental controls are not supported for school accounts. To add a school account to access Google Classroom and other websites for schoolwork at home, sign in with the child's personal account first. You can add the school account later in setup.</translation>
 <translation id="6929760895658557216">Ok Google</translation>
 <translation id="6930036377490597025">External security key or built-in sensor</translation>
 <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{An extension has been rejected}other{# extensions have been rejected}}</translation>
@@ -5017,6 +5064,7 @@
 <translation id="6972629891077993081">HID devices</translation>
 <translation id="6972754398087986839">Get Started</translation>
 <translation id="6972887130317925583">Successfully changed the compromised password. Check your passwords at any time in <ph name="SETTINGS" />.</translation>
+<translation id="697312151395002334">Allowed to send pop-ups and use redirects</translation>
 <translation id="6973611239564315524">An upgrade to Debian 10 (Buster) is available</translation>
 <translation id="6974609594866392343">Offline demo mode</translation>
 <translation id="6977381486153291903">Firmware revision</translation>
@@ -5039,6 +5087,7 @@
 <translation id="6995899638241819463">Warn you if passwords are exposed in a data breach</translation>
 <translation id="6997642619627518301"><ph name="NAME_PH" /> – Activity Log</translation>
 <translation id="6997707937646349884">On your devices:</translation>
+<translation id="6998093258894828179">Hide cards</translation>
 <translation id="6998793565256476099">Enrol device for video conferencing</translation>
 <translation id="6999956497249459195">New group</translation>
 <translation id="7000206553895739324"><ph name="PRINTER_NAME" /> is connected but needs configuration</translation>
@@ -5055,6 +5104,7 @@
 <translation id="7005848115657603926">Invalid page range, use <ph name="EXAMPLE_PAGE_RANGE" /></translation>
 <translation id="7006634003215061422">Bottom margin</translation>
 <translation id="7007648447224463482">Open all in new window</translation>
+<translation id="7009709314043432820"><ph name="APP_NAME" /> is using your camera</translation>
 <translation id="701080569351381435">View Source</translation>
 <translation id="7014174261166285193">Installation failed.</translation>
 <translation id="7017004637493394352">Say 'OK Google' again</translation>
@@ -5074,6 +5124,7 @@
 <translation id="7038632520572155338">Switch access</translation>
 <translation id="7039326228527141150">Access USB devices from <ph name="VENDOR_NAME" /></translation>
 <translation id="7039912931802252762">Microsoft Smart Card Logon</translation>
+<translation id="7039951224110875196">Create a Google Account for a child</translation>
 <translation id="7040230719604914234">Operator</translation>
 <translation id="7043108582968290193">Finished! No incompatible applications found.</translation>
 <translation id="7044124535091449260">Learn more about site access</translation>
@@ -5145,6 +5196,7 @@
 <translation id="7121362699166175603">Clears history and auto-completions in the address bar. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7121438501124788993">Developer mode</translation>
 <translation id="7121728544325372695">Smart Dashes</translation>
+<translation id="7123030151043029868">Allowed to automatically download multiple files</translation>
 <translation id="7123360114020465152">No longer supported</translation>
 <translation id="7125148293026877011">Delete Crostini</translation>
 <translation id="7127980134843952133">Download history</translation>
@@ -5159,6 +5211,7 @@
 <translation id="7136984461011502314">Welcome to <ph name="PRODUCT_NAME" /></translation>
 <translation id="7136993520339022828">There's an error. Please try again by choosing other images.</translation>
 <translation id="713888829801648570">Sorry, your password could not be verified because you are offline.</translation>
+<translation id="7139627972753429585"><ph name="APP_NAME" /> is using your microphone</translation>
 <translation id="7140928199327930795">No other available devices.</translation>
 <translation id="7141105143012495934">Sign-in failed because your account details could not be retrieved. Please contact your administrator or try again.</translation>
 <translation id="7143207342074048698">Connecting</translation>
@@ -5298,6 +5351,7 @@
 <translation id="7324297612904500502">Beta forum</translation>
 <translation id="7325209047678309347">Paper is jammed</translation>
 <translation id="7325437708553334317">High Contrast Extension</translation>
+<translation id="7326004502692201767">Set up this <ph name="DEVICE_TYPE" /> for a child</translation>
 <translation id="7328699668338161242">Your Assistant can already recognise your voice</translation>
 <translation id="7328867076235380839">Invalid combination</translation>
 <translation id="7329154610228416156">Sign-in failed because it was configured to use a non-secure URL (<ph name="BLOCKED_URL" />). Please contact your administrator.</translation>
@@ -5422,6 +5476,7 @@
 <translation id="7465635034594602553">Something went wrong. Please wait a few minutes and run <ph name="APP_NAME" /> again.</translation>
 <translation id="7465778193084373987">Netscape Certificate Revocation URL</translation>
 <translation id="7469894403370665791">Automatically connect to this network</translation>
+<translation id="7470424110735398630">Allowed to see your clipboard</translation>
 <translation id="747114903913869239">Error: Unable to decode extension</translation>
 <translation id="7473891865547856676">No, thanks</translation>
 <translation id="747459581954555080">Restore all</translation>
@@ -5531,6 +5586,7 @@
 <translation id="7607002721634913082">Paused</translation>
 <translation id="7608810328871051088">Android preferences</translation>
 <translation id="7609148976235050828">Please connect to the Internet and try again.</translation>
+<translation id="7612655942094160088">Connected phone features enable.</translation>
 <translation id="7614260613810441905">Ask when a site wants to edit files or folders on your device (recommended)</translation>
 <translation id="761530003705945209">Back up to Google Drive. Easily restore your data or switch device at any time. Your backup includes app data. Your backups are uploaded to Google and encrypted using your Google Account password.</translation>
 <translation id="7615365294369022248">There was an error adding an account</translation>
@@ -5649,6 +5705,7 @@
 <translation id="7732111077498238432">Network is policy controlled</translation>
 <translation id="7737115349420013392">Pairing with "<ph name="DEVICE_NAME" />" ...</translation>
 <translation id="7737238973539693982">Delete Linux (Beta)</translation>
+<translation id="7737948071472253612">Not allowed to use your camera</translation>
 <translation id="7740996059027112821">Standard</translation>
 <translation id="7742706086992565332">You can set how much you zoom in or out on certain websites</translation>
 <translation id="774377079771918250">Choose where to save</translation>
@@ -5657,6 +5714,7 @@
 <translation id="7750228210027921155">Picture-in-picture</translation>
 <translation id="7751260505918304024">Show all</translation>
 <translation id="7753735457098489144">Installation failed due to lack of storage space. To free up space, delete files from device storage.</translation>
+<translation id="7754347746598978109">Not allowed to use JavaScript</translation>
 <translation id="7754704193130578113">Ask where to save each file before downloading</translation>
 <translation id="7755287808199759310">Your parent can unblock it for you</translation>
 <translation id="7757592200364144203">Change device name</translation>
@@ -5709,6 +5767,7 @@
 <translation id="7798844538707273832">Automatically blocked <ph name="PERMISSION" /></translation>
 <translation id="7799299114731150374">Wallpaper set successfully</translation>
 <translation id="7800518121066352902">Rotate A&amp;nti-clockwise</translation>
+<translation id="7802539296536804623">Don't show cards on this page</translation>
 <translation id="780301667611848630">No, thanks</translation>
 <translation id="7804072833593604762">Tab closed</translation>
 <translation id="7805768142964895445">Status</translation>
@@ -6139,6 +6198,7 @@
 <translation id="826905130698769948">Invalid client certificate</translation>
 <translation id="8270242299912238708">PDF documents</translation>
 <translation id="827097179112817503">Show Home button</translation>
+<translation id="8271379370373330993">Parents, the next few steps are for you. You can hand the <ph name="DEVICE_TYPE" /> back to the child after account setup.</translation>
 <translation id="8272443605911821513">Manage your extensions by clicking Extensions in the "More tools" menu.</translation>
 <translation id="8274332263553132018">Cast file</translation>
 <translation id="8274924778568117936">Don’t turn off or close your <ph name="DEVICE_TYPE" /> until the update finishes. Your <ph name="DEVICE_TYPE" /> will restart after installation completes.</translation>
@@ -6162,6 +6222,7 @@
 <translation id="8300011035382349091">Edit bookmark for this tab</translation>
 <translation id="8300374739238450534">Midnight blue</translation>
 <translation id="8300849813060516376">OTASP failed</translation>
+<translation id="8304383784961451596">You are not authorised to use this device. Please contact the administrator for sign-in permission or sign in with a Google Account supervised by Family Link.</translation>
 <translation id="8308179586020895837">Ask if <ph name="HOST" /> wants to access your camera</translation>
 <translation id="830868413617744215">Beta</translation>
 <translation id="8309458809024885768">Certificate already exists</translation>
@@ -6175,6 +6236,7 @@
 <translation id="8322814362483282060">This page has been blocked from accessing your microphone.</translation>
 <translation id="8323167517179506834">Type URL</translation>
 <translation id="8324784016256120271">Sites can use cookies to see your browsing activity across different sites, for example, to personalise ads</translation>
+<translation id="8325413836429495820">Not allowed to see your clipboard</translation>
 <translation id="8326478304147373412">PKCS #7, certificate chain</translation>
 <translation id="8327039559959785305">Error mounting Linux files. Please try again.</translation>
 <translation id="8327676037044516220">Permissions and content settings</translation>
@@ -6224,6 +6286,7 @@
 <translation id="8382913212082956454">Copy &amp;email address</translation>
 <translation id="8386091599636877289">Policy not found.</translation>
 <translation id="8386903983509584791">Scan completed</translation>
+<translation id="8387361103813440603">Not allowed to see your location</translation>
 <translation id="8389416080014625855">Create QR code for this page</translation>
 <translation id="8389492867173948260">Allow this extension to read and change all your data on websites that you visit:</translation>
 <translation id="8390449457866780408">Server unavailable.</translation>
@@ -6410,6 +6473,7 @@
 <translation id="8621866727807194849">There's harmful software on your computer. Chrome is removing it, restoring your settings and disabling extensions. This will make your browser work normally again.</translation>
 <translation id="8621979332865976405">Share your entire screen</translation>
 <translation id="862542460444371744">&amp;Extensions</translation>
+<translation id="8625663000550647058">Not allowed to use your microphone</translation>
 <translation id="862727964348362408">Suspended</translation>
 <translation id="862750493060684461">CSS cache</translation>
 <translation id="8627706565932943526">Sync error</translation>
@@ -6490,6 +6554,7 @@
 <translation id="8714838604780058252">Background graphics</translation>
 <translation id="8715480913140015283">Background tab is using your camera</translation>
 <translation id="8716931980467311658">Delete all Linux applications and data in your Linux files folder from this <ph name="DEVICE_TYPE" />?</translation>
+<translation id="8717145295869185525">Not allowed to use virtual reality devices and data</translation>
 <translation id="8717864919010420084">Copy link</translation>
 <translation id="8719472795285728850">Listening for extension activities...</translation>
 <translation id="8719653885894320876"><ph name="PLUGIN_NAME" /> download failed</translation>
@@ -6911,6 +6976,7 @@
 <translation id="9179734824669616955">Set up Linux (Beta) on your <ph name="DEVICE_TYPE" /></translation>
 <translation id="9180281769944411366">This process may take a few minutes. Starting the Linux container.</translation>
 <translation id="9180380851667544951">Site can share your screen</translation>
+<translation id="9186963452600581158">Sign in with a child's Google Account</translation>
 <translation id="9188732951356337132">Send usage and diagnostic data. This device is currently automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &amp; App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK2" />Find out more<ph name="END_LINK2" /></translation>
 <translation id="9190063653747922532">L2TP/IPSec + Preshared key</translation>
 <translation id="9198090666959937775">Use your Android phone as a security key</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 67ab808..7376ab7 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -105,7 +105,7 @@
 <translation id="1116779635164066733">L'extension « <ph name="NAME" /> » impose la valeur attribuée à ce paramètre.</translation>
 <translation id="1118738876271697201">Le système n'a pas réussi à déterminer le modèle de l'appareil ni son numéro de série.</translation>
 <translation id="1119447706177454957">Erreur interne</translation>
-<translation id="1122068467107743258">Bureau</translation>
+<translation id="1122068467107743258">Professionnel</translation>
 <translation id="1122198203221319518">Ou&amp;tils</translation>
 <translation id="1122242684574577509">L’authentification a échoué. Cliquez pour accéder à la page de connexion au réseau Wi-Fi que vous utilisez (<ph name="NETWORK_ID" />).</translation>
 <translation id="1122960773616686544">Nom du favori</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 9659aef..2a890755 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4497,7 +4497,7 @@
 <translation id="6324916366299863871">עריכת קיצור דרך</translation>
 <translation id="6325191661371220117">השבת הפעלה אוטומטית</translation>
 <translation id="6325525973963619867">נכשל</translation>
-<translation id="6326175484149238433">‏הסר מ-Chrome</translation>
+<translation id="6326175484149238433">‏הסרה מ-Chrome</translation>
 <translation id="6326855256003666642">‏ספירת Keepalive</translation>
 <translation id="632707535499064463">בהתאם לבקשה של <ph name="ORGANIZATION_NAME" />, יש לעדכן את המכשיר הזה לפני התאריך האחרון.</translation>
 <translation id="6327785803543103246">‏גילוי אוטומטי של שרת proxy באינטרנט</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 6912fc4c..a4a2c2d4 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -112,7 +112,7 @@
 <translation id="1123753900084781868">Шууд тайлбар яг одоо боломжгүй байна</translation>
 <translation id="1124772482545689468">Хэрэглэгч</translation>
 <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> юм шиг харагдаж байна (Үндсэн)</translation>
-<translation id="1126809382673880764">Таныг аюултай вэб сайт, таталт болон өргөтгөлөөс хамгаалахгүй. Гэхдээ та Аюулгүй үзэх хамгаалалтыг Gmail, Хайлт зэрэг Google-н боломжтой бусад үйлчилгээнд авсан хэвээр байна.</translation>
+<translation id="1126809382673880764">Таныг аюултай вебсайт, таталт болон өргөтгөлөөс хамгаалахгүй. Гэхдээ та Аюулгүй үзэх хамгаалалтыг Gmail, Хайлт зэрэг Google-н боломжтой бусад үйлчилгээнд авсан хэвээр байна.</translation>
 <translation id="112752777279960360">Энэ компьютерын аюулгүй байдлын түлхүүрээр ашиглах Android утсыг анх удаа тохируулахын тулд Chrome-г утсан дээрээ нээгээд "Тохиргоо &gt; Нууц үг &gt; Утсыг аюулгүй байдлын түлхүүрээр ашиглах" руу очно уу. Дараа нь "Шинэ төхөөрөмж холбох" сонголтыг товшиж, энэ QR кодыг скан хийнэ үү.</translation>
 <translation id="1128109161498068552">Системийн тусгай мессеж ашиглан MIDI төхөөрөмжинд хандах үйлдлийг аль ч сайтад үл зөвшөөрөх</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
@@ -184,10 +184,10 @@
 <translation id="1204296502688602597">DNS-н хоцролт</translation>
 <translation id="1206407435587370571">Chromebook-ээ судална уу</translation>
 <translation id="1209796539517632982">Автомат нэрийн серверүүд</translation>
-<translation id="1211364473545090084">Хайлтын түүхээ хадгалалгүйгээр нууцлалтай цонхоор вэб ашиглах</translation>
+<translation id="1211364473545090084">Хайлтын түүхээ хадгалалгүйгээр нууцлалтай цонхоор веб ашиглах</translation>
 <translation id="1211769675100312947">Товчлолыг та сонгосон болно</translation>
 <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> хурууны хээ тохируулсан</translation>
-<translation id="1213254615020057352">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг эзэмшигч өөрөө сонгож болно. Хэрэв таны хүүхдийн Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="1213254615020057352">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг эзэмшигч өөрөө сонгож болно. Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="121384500095351701">Энэ файлыг аюулгүй татах боломжгүй</translation>
 <translation id="1215411991991485844">Дэвсгэрийн шинэ апп нэмэгдлээ</translation>
 <translation id="1216542092748365687">Хурууны хээг арилгах</translation>
@@ -216,7 +216,7 @@
 <translation id="1239594683407221485">Файлc апп дээр төхөөрөмжийн агуулгыг судлах</translation>
 <translation id="124116460088058876">Бусад хэл</translation>
 <translation id="1241639418100230264">Дата төлбөр гарч болзошгүй</translation>
-<translation id="1241753985463165747">Одоогийн вэбсайтыг ажиллуулж байх үед бүх өгөгдлөө унших, өөрчлөх</translation>
+<translation id="1241753985463165747">Одоогийн вебсайтыг ажиллуулж байх үед бүх өгөгдлөө унших, өөрчлөх</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> таны тохиргоог шинэчлэхийг хүсэж байна.</translation>
 <translation id="1243314992276662751">Байршуул</translation>
 <translation id="1243436884219965846">Нууц үгсээ шалгах</translation>
@@ -394,7 +394,7 @@
 <translation id="1442851588227551435">Идэвхтэй Kerberos тасалбарыг тохируулах</translation>
 <translation id="1444628761356461360">Энэ тохиргоог төхөөрөмжийн эзэмшигч удирддаг, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Энэ загварт зориулан <ph name="IMAGE_PATH" />-г татах үйлдэл амжилтгүй болсон байна.</translation>
-<translation id="1451375123200651445">Вэб хуудас, Нэг файл</translation>
+<translation id="1451375123200651445">Веб хуудас, Нэг файл</translation>
 <translation id="1451917004835509682">Хяналттай хэрэглэгч нэмэх</translation>
 <translation id="1454223536435069390">Дэлгэцийн зураг авах</translation>
 <translation id="145432137617179457">Зөв бичгийн алдаа шалгах хэлнүүд</translation>
@@ -490,7 +490,7 @@
 <translation id="155865706765934889">Мэдрэгч самбар</translation>
 <translation id="1562119309884184621">Энэ харилцагчийг нэмснээр түүнийг дараагийн удаа хуваалцахад нь санах болно</translation>
 <translation id="1563702743503072935">Таныг нэвтэрсэн үед таны Google Бүртгэл дээрх нууц үгс энэ төхөөрөмж дээр мөн боломжтой байх болно</translation>
-<translation id="1566049601598938765">Вэб хуудас</translation>
+<translation id="1566049601598938765">Веб хуудас</translation>
 <translation id="15662109988763471">Сонгосон хэвлэгч боломжгүй эсвэл буруу суулгагдсан байна. Хэвлэгчээ шалгах эсвэл өөр хэвлэгч сонгож үзнэ үү.</translation>
 <translation id="1567387640189251553">Таныг хамгийн сүүлд нууц үгээ оруулснаас хойш өөр гар холбосон байна. Энэ нь таны түлхүүрийн цуглуулгыг хулгайлахаар оролдож байж болзошгүй.</translation>
 <translation id="1567993339577891801">JavaScript консол</translation>
@@ -667,7 +667,7 @@
 <translation id="1757301747492736405">Устгалт хүлээгдэж байна</translation>
 <translation id="175772926354468439">Загварыг идэвхжүүлэх</translation>
 <translation id="1758018619400202187">EAP-TLS</translation>
-<translation id="17584710573359123">Chrome Вэб Дэлгүүрт харах</translation>
+<translation id="17584710573359123">Chrome Веб Дэлгүүрт харах</translation>
 <translation id="176193854664720708">Асаах товчид хурууны хээ мэдрэгч байна. Үүнд дурын хуруугаар зөөлөн хүрнэ үү.</translation>
 <translation id="1763046204212875858">Програмын богино холбоосыг үүсгэ</translation>
 <translation id="1763108912552529023">Хайлтаа үргэлжлүүлэн хий</translation>
@@ -814,7 +814,7 @@
 <translation id="1921584744613111023"><ph name="DPI" /> нэг инчид ноогдох цэгийн тоо</translation>
 <translation id="192494336144674234">Дараахаар нээх</translation>
 <translation id="1925017091976104802">Буулгахын тулд <ph name="MODIFIER_KEY_DESCRIPTION" />-г дарна уу</translation>
-<translation id="1925021887439448749">Тохируулсан вэб хаяг оруулах</translation>
+<translation id="1925021887439448749">Тохируулсан веб хаяг оруулах</translation>
 <translation id="1925124445985510535">Аюулгүй байдлын шалгалтыг <ph name="TIME" />-д хийсэн</translation>
 <translation id="1926339101652878330">Байгууллагын журмаар энэ тохиргоог хянадаг. Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу.</translation>
 <translation id="1927632033341042996"><ph name="NEW_FINGER_NUMBER" /> хурууны хээ</translation>
@@ -1076,7 +1076,7 @@
 <translation id="2235344399760031203">Гуравдагч талын күүкиг блоклосон</translation>
 <translation id="2238379619048995541">Хадгалагдсан мэдээллийн давтамж</translation>
 <translation id="2239921694246509981">Хяналттай хэрэглэгч нэмэх</translation>
-<translation id="2241053333139545397">Хэд хэдэн вэб хуудсанд байгаа мэдээллээ унших, өөрчлөх</translation>
+<translation id="2241053333139545397">Хэд хэдэн веб хуудсанд байгаа мэдээллээ унших, өөрчлөх</translation>
 <translation id="2241634353105152135">Ганц удаа</translation>
 <translation id="2242687258748107519">Файлын мэдээлэл</translation>
 <translation id="2246549592927364792">Google-с зургийн тайлбар авах уу?</translation>
@@ -1090,7 +1090,7 @@
 <translation id="2256115617011615191">Одоо дахин эхлүүлнэ үү</translation>
 <translation id="225614027745146050">Тавтай морилно уу</translation>
 <translation id="225692081236532131">Идэвхжүүлэх статус</translation>
-<translation id="2257053455312861282">Сургуулийн бүртгэл нэмснээр вэб сайт, өргөтгөл, аппуудад сурагчийн хувиар хялбар нэвтрэх боломжтой болох бөгөөд аливаа үйлдэл нь эцэг эхийн хяналтад хэвээр байх болно.</translation>
+<translation id="2257053455312861282">Сургуулийн бүртгэл нэмснээр вебсайт, өргөтгөл, аппуудад сурагчийн хувиар хялбар нэвтрэх боломжтой болох бөгөөд аливаа үйлдэл нь эцэг эхийн хяналтад хэвээр байх болно.</translation>
 <translation id="2261323523305321874">Таны админ зарим хуучин профайлыг идэвхгүй болгох системийн өөрчлөлт хийсэн.</translation>
 <translation id="2262332168014443534">Lite горим нь одоо HTTPS зэрэг бүх хуудасны хөтчийн ашиглалтыг хурдасгадаг боллоо.</translation>
 <translation id="2262477216570151239">Давтахаас өмнөх хоцролт</translation>
@@ -1163,7 +1163,7 @@
 <translation id="2348176352564285430">Апп: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="234889437187286781">Өгөгдлийг ачаалахад алдаа гарлаа</translation>
 <translation id="2349610121459545414">Байршилд тань хандахыг энэ сайтад үргэлжлүүлэн зөвшөөрөх</translation>
-<translation id="2349896577940037438">Хэрэв таны Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. Та account.google.com дээр өгөгдлөө харах, устгах болон бүртгэлийн тохиргоогоо өөрчлөх боломжтой.</translation>
+<translation id="2349896577940037438">Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. Та account.google.com дээр өгөгдлөө харах, устгах болон бүртгэлийн тохиргоогоо өөрчлөх боломжтой.</translation>
 <translation id="2350133097354918058">Дахин ачаалсан</translation>
 <translation id="2350182423316644347">Програмыг эхлүүлж байна...</translation>
 <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" />-ний оронд <ph name="HANDLER_HOSTNAME" />-д бүх <ph name="PROTOCOL" /> холбоосыг нээх зөвшөөрөл олгох?</translation>
@@ -1358,7 +1358,7 @@
 <translation id="2564653188463346023">Зөв бичгийн алдаа шалгах сайжруулсан онцлог</translation>
 <translation id="2566124945717127842">Powerwash нь таны <ph name="IDS_SHORT_PRODUCT_NAME" /> төхөөрөмжийг шинэ мэт тохируулна.</translation>
 <translation id="2568774940984945469">Мэдээллийн цонх агуулагч</translation>
-<translation id="2571655996835834626">Таны вэб сайтын күүки, JavaScript, залгаас, геолокаци, микрофон, камер зэрэг онцлогийн хандалтыг хянадаг тохиргоог өөрчилдөг.</translation>
+<translation id="2571655996835834626">Таны веб сайтын күүки, JavaScript, залгаас, геолокаци, микрофон, камер зэрэг онцлогийн хандалтыг хянадаг тохиргоог өөрчилдөг.</translation>
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> руу зөвхөн унших горимоор нэвтрэх зөвшөөрлийг олгосон байна.</translation>
 <translation id="2575247648642144396">Өргөтгөл нь тухайн хуудсанд ажиллахад тэмдэглэгээ харагдана. Энэхүү тэмдэглэгээн дээр дарж эсвэл <ph name="EXTENSION_SHORTCUT" /> дээр дарснаар өргөлтгөлийг ашиглах боломжтой.</translation>
 <translation id="257779572837908839">Уулзалтад зориулсан Chromebox-р тохируулах</translation>
@@ -1419,7 +1419,7 @@
 <translation id="264810637653812429">Тохирох төхөөрөмж олдсонгүй.</translation>
 <translation id="2649045351178520408">Base64-шифрлэгдсэн ASCII, гэрчилгээний хэлхээ</translation>
 <translation id="2653033005692233957">Хайлт амжилтгүй боллоо</translation>
-<translation id="2653266418988778031">Хэрэв та Certification Authority (CA) сертификатыг устгавал, таны вэб хөтөч CA-аас гаргасан ямар ч сертификатыг хүлээн зөвшөөрөхгүй.</translation>
+<translation id="2653266418988778031">Хэрэв та Certification Authority (CA) сертификатыг устгавал, таны веб хөтөч CA-аас гаргасан ямар ч сертификатыг хүлээн зөвшөөрөхгүй.</translation>
 <translation id="2653275834716714682">Текст орлуулах</translation>
 <translation id="2653659639078652383">Илгээх</translation>
 <translation id="265390580714150011">Талбарын утга</translation>
@@ -1430,7 +1430,7 @@
 <translation id="2660779039299703961">Үйл явдал</translation>
 <translation id="266079277508604648">Хэвлэгчийг холбох боломжгүй байна. Хэвлэгчийг асаасан болон таны Chromebook-д Wi-Fi эсвэл USB-р холбогдсон эсэхийг шалгана уу.</translation>
 <translation id="2661714428027871023">Lite горимоор хөтчийг илүү хурдан ашиглаж, бага дата зарцуулаарай. Нэмэлт мэдээлэл авахын тулд товшино уу.</translation>
-<translation id="2662876636500006917">Chrome вэб дэлгүүр</translation>
+<translation id="2662876636500006917">Chrome веб дэлгүүр</translation>
 <translation id="2663302507110284145">Хэл</translation>
 <translation id="2665394472441560184">Шинэ үг нэмэх</translation>
 <translation id="2665647207431876759">Хугацаа дууссан</translation>
@@ -1632,7 +1632,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">Холбоосыг ...-аар нээх</translation>
 <translation id="2889925978073739256">Хамгаалалтгүй нэмэлт өргөтгөлүүдийг блоклох үйлдлийг үргэлжлүүлэх</translation>
-<translation id="2893168226686371498">Стандарт вэб хөтөч</translation>
+<translation id="2893168226686371498">Стандарт веб хөтөч</translation>
 <translation id="2893917546370257247">{COUNT,plural, =1{1 текст}other{# текст}}</translation>
 <translation id="2894757982205307093">Бүлэг доторх шинэ таб</translation>
 <translation id="289644616180464099">SIM карт түгжигдсэн</translation>
@@ -1655,7 +1655,7 @@
 <translation id="2913331724188855103">Cookie data-г хадгалах мөн унших боломжийг сайтуудад олгох (зөвлөж байна)</translation>
 <translation id="2915102088417824677">Үйл ажиллагааны логийг харах</translation>
 <translation id="2915873080513663243">Автомат скан</translation>
-<translation id="2916073183900451334">Вэб хуудсан дээрх  цонхон дээр дарснаар холбоосууд тодрохоос гадна талбарууд үүсч бий болдог.</translation>
+<translation id="2916073183900451334">Веб хуудсан дээрх  цонхон дээр дарснаар холбоосууд тодрохоос гадна талбарууд үүсч бий болдог.</translation>
 <translation id="2916745397441987255">Өргөтгөл хайх</translation>
 <translation id="2921081876747860777">Дотоод өгөгдлөө хамгаалахын тулд нууц үг үүсгэнэ үү.</translation>
 <translation id="2923234477033317484">Энэ бүртгэлийг устгах</translation>
@@ -1676,12 +1676,12 @@
 <translation id="2942279350258725020">Андройд мессеж</translation>
 <translation id="2942560570858569904">Хүлээж байна...</translation>
 <translation id="2942581856830209953">Энэ хуудсыг тохируулах</translation>
-<translation id="2944060181911631861">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, Android-н хэрэглээгээ сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK1" />Нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation>
+<translation id="2944060181911631861">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, Android-н хэрэглээгээ сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK1" />Нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation>
 <translation id="2946119680249604491">Холболт нэмэх</translation>
 <translation id="2946640296642327832">Bluetooth-г идэвхжүүлнэ үү</translation>
-<translation id="2947605845283690091">Вэб хөтөч хурдан байх ёстой. Одоо <ph name="BEGIN_LINK" />өргөтгөлүүдээ шалгахын<ph name="END_LINK" /> тулд хэсэг хором зарцуулаарай.</translation>
+<translation id="2947605845283690091">Веб хөтөч хурдан байх ёстой. Одоо <ph name="BEGIN_LINK" />өргөтгөлүүдээ шалгахын<ph name="END_LINK" /> тулд хэсэг хором зарцуулаарай.</translation>
 <translation id="2948300991547862301"><ph name="PAGE_TITLE" /> руу очно уу</translation>
-<translation id="29488703364906173">Орчин үеийн вэб-д зориулан бүтээгдсэн хурдан, энгийн, аюулгүй вэб хөтөч.</translation>
+<translation id="29488703364906173">Орчин үеийн веб-д зориулан бүтээгдсэн хурдан, энгийн, аюулгүй веб хөтөч.</translation>
 <translation id="2949289451367477459">Байршлыг ашиглана уу. Байршлын зөвшөөрөлтэй аппууд болон үйлчилгээнүүдэд энэ төхөөрөмжийн байршлыг ашиглахыг зөвшөөрнө үү. Google байршлын нарийвчлал болон байршилд суурилсан үйлчилгээнүүдийг сайжруулах зорилгоор байршлын өгөгдлийг үе үе цуглуулж, энэ өгөгдлийг нэргүй байдлаар ашиглаж болзошгүй. <ph name="BEGIN_LINK1" />Нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation>
 <translation id="2950666755714083615">Намайг бүртгэнэ үү</translation>
 <translation id="2956070239128776395">Хэсэг нь бүлэг дотор байрлана: <ph name="ERROR_LINE" /></translation>
@@ -1760,7 +1760,7 @@
 <translation id="3039491566278747710">Офлайн удирдамжийг төхөөрөмж дээр суулгаж чадсангүй.</translation>
 <translation id="3043581297103810752"><ph name="ORIGIN" />-с</translation>
 <translation id="3045447014237878114">Энэ сайт олон тооны файлыг автоматаар татсан байна</translation>
-<translation id="3046910703532196514">Вэб хуудас, дууссан</translation>
+<translation id="3046910703532196514">Веб хуудас, дууссан</translation>
 <translation id="304747341537320566">Ярианы хөдөлгүүр</translation>
 <translation id="3047644958362961983">Энэ мэдээлэл нь бидэнд таны Туслахын асуудлыг илүү сайн ойлгоход тусалдаг. Үүнийг 90 хоног хүртэлх хугацаанд хадгалдаг бөгөөд үүнд зөвхөн инженерчлэл болон санал хүсэлтийн зохих багийнхан хандах боломжтой.</translation>
 <translation id="3051250416341590778">Дэлгэцийн хэмжээ</translation>
@@ -1786,7 +1786,7 @@
 <translation id="3082780749197361769">Энэ нь цонх нь таны камер эсвэл микрофоныг хэрэглэж байна.</translation>
 <translation id="3083193146044397360">Таны нууцлалыг хамгаалахын тулд түр блоклосон</translation>
 <translation id="3084548735795614657">Суулгахаар хадгалах</translation>
-<translation id="3084771660770137092">Chrome-ын санах ой дууссанаас гадна вэб хуудасны үйл ажиллагаа зарим шалтгааны улмаас зогссон байна. Үргэлжлүүлэхийн тулд дахин ачаалж эсвэл өөр хуудас руу очно уу.</translation>
+<translation id="3084771660770137092">Chrome-ын санах ой дууссанаас гадна веб хуудасны үйл ажиллагаа зарим шалтгааны улмаас зогссон байна. Үргэлжлүүлэхийн тулд дахин ачаалж эсвэл өөр хуудас руу очно уу.</translation>
 <translation id="3084958266922136097">Дэлгэц амраагчийг идэвхгүй болгох</translation>
 <translation id="3085412380278336437">Сайт таны камерыг ашиглах боломжтой</translation>
 <translation id="3085752524577180175">SOCKS Хост</translation>
@@ -1989,7 +1989,7 @@
 <translation id="3342361181740736773">"<ph name="TRIGGERING_EXTENSION_NAME" />" энэ өргөтгөлийг устгах хүсэлтэй байна.</translation>
 <translation id="3345135638360864351">Таны энэхүү сайтад нэвтрэх хүсэлтийг <ph name="NAME" />-д илгээх боломжгүй байна. Та дараа дахин хандана уу.</translation>
 <translation id="3345634917232014253">Аюулгүй байдлын шалгалтыг хэдэн хормын өмнө хийсэн</translation>
-<translation id="3345886924813989455">Ямар ч дэмжигдэх вэб хөтөч олдсонгүй</translation>
+<translation id="3345886924813989455">Ямар ч дэмжигдэх веб хөтөч олдсонгүй</translation>
 <translation id="3347086966102161372">Зургийн хаягийг хуулах</translation>
 <translation id="3348038390189153836">Зөөврийн төхөөрөмж илэрсэн байна</translation>
 <translation id="3348131053948466246">Санал болгож буй эможи. Дээш эсвэл доош дарж шилжээд, enter дарж оруулна.</translation>
@@ -2060,7 +2060,7 @@
 <translation id="3432762828853624962">Хуваалцсан ажилчид</translation>
 <translation id="3433621910545056227">Анхаарна уу! Систем төхөөрөмжийг суурьлуулж чадахгүй байна.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
-<translation id="3434272557872943250">Хэрэв таны хүүхдийн Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй. Эдгээр тохиргооны талаар болон тэднийг хэрхэн тохируулах тухай нэмэлт мэдээллийг families.google.com дээрээс авна уу.</translation>
+<translation id="3434272557872943250">Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй. Эдгээр тохиргооны талаар болон тэднийг хэрхэн тохируулах тухай нэмэлт мэдээллийг families.google.com дээрээс авна уу.</translation>
 <translation id="3435541101098866721">Шинэ утас нэмэх</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" таны <ph name="CODE_TYPE" />-г хүсэж байна</translation>
 <translation id="3435738964857648380">Нууцлал</translation>
@@ -2076,7 +2076,7 @@
 <translation id="3445047461171030979">Google Туслахын шуурхай хариултууд</translation>
 <translation id="3445925074670675829">USB-C төхөөрөмж</translation>
 <translation id="3446274660183028131">Windows-г суулгахын тулд Parallels Desktop-г эхлүүлнэ үү.</translation>
-<translation id="344630545793878684">Олон тооны вэб хуудсууд дээр байгаа өөрийнхөө мэдээллийг уншина уу</translation>
+<translation id="344630545793878684">Олон тооны веб хуудсууд дээр байгаа өөрийнхөө мэдээллийг уншина уу</translation>
 <translation id="3446650212859500694">Энэ файл эмзэг контенттой байна</translation>
 <translation id="3448086340637592206">Google Chrome болон Chrome үйлдлийн системийн нэмэлт нөхцөл</translation>
 <translation id="3448492834076427715">Бүртгэл шинэчлэх</translation>
@@ -2104,7 +2104,7 @@
 <translation id="347394413229268704">Дараа унших</translation>
 <translation id="3474218480460386727">Шинэ үгэнд 99 эсвэл үүнээс цөөн үсэг ашиглана уу</translation>
 <translation id="3475843873335999118">Уучлаарай, таны хурууны хээг танихгүй байна. Нууц үгээ оруулна уу.</translation>
-<translation id="3476303763173086583">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг хэрэглэгч өөрөө сонгож болно. Хэрэв таны хүүхдийн Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
+<translation id="3476303763173086583">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг хэрэглэгч өөрөө сонгож болно. Хэрэв таны хүүхдийн Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Уучлаарай!  Систем таны төхөөрөмжийн удирдамжийг татаж чадсангүй.</translation>
 <translation id="347785443197175480"><ph name="HOST" />-д таны камер болон  микрофон руу нэвтрэхийг үргэлжлүүлэн зөвшөөр</translation>
 <translation id="3478685642445675458">Хүн устгахаасаа өмнө профайлынхаа түгжээг тайлна уу.</translation>
@@ -2170,7 +2170,7 @@
 <translation id="3555812735919707620">Өргөтгөл арилгах</translation>
 <translation id="3556000484321257665">Таны хайлтын хөдөлгүүрийг <ph name="URL" /> болгож өөрчилсөн.</translation>
 <translation id="3556433843310711081">Таны менежер үүнийг блокоос гаргах боломжтой</translation>
-<translation id="3557101512409028104">Family Link-р вэб сайтын хязгаарлалт, дэлгэцийн цагийн хязгаар тогтоох</translation>
+<translation id="3557101512409028104">Family Link-р веб сайтын хязгаарлалт, дэлгэцийн цагийн хязгаар тогтоох</translation>
 <translation id="3559262020195162408">Удирдамжийг төхөөрөмж дээр суулгаж чадсангүй.</translation>
 <translation id="3559533181353831840">Ойролцоогоор <ph name="TIME_LEFT" /> үлдсэн</translation>
 <translation id="3560034655160545939">&amp;Зөв бичгийн алдаа шалгагч</translation>
@@ -2208,7 +2208,7 @@
 <translation id="3596414637720633074">Нууцлалтай горимд гуравдагч талын күүкиг блоклох</translation>
 <translation id="3599221874935822507">Томруулсан</translation>
 <translation id="3599863153486145794">Бүх нэвтэрсэн төхөөрөмжийн түүхийг устгана. Таны Google бүртгэл <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-д хайлтын түүхийн өөр хэлбэртэй байж болзошгүй.</translation>
-<translation id="3600051066689725006">Вэбийн хүсэлтийн мэдээлэл</translation>
+<translation id="3600051066689725006">Вебийн хүсэлтийн мэдээлэл</translation>
 <translation id="3600792891314830896">Дуу тоглуулдаг сайтуудын дууг хаах</translation>
 <translation id="360180734785106144">Шинэ онцлогуудыг боломжтой болмогц санал болгох</translation>
 <translation id="3602198818276948261">Таны контейнерыг дискийн хэмжээг өөрчлөхийг дэмжихэд тохируулаагүй. Linux (Бэта)-д нөөцөлсөн зайн хэмжээг тохируулахын тулд хуулбарлаад, шинэ контейнер луу сэргээнэ үү.</translation>
@@ -2280,7 +2280,7 @@
 <translation id="367645871420407123">Хэрэв та тест зургийн өгөгдөлд үндсэн нууц үг тохируулахыг хүсвэл хоосон үлдээнэ үү</translation>
 <translation id="3677106374019847299">Захиалгат нийлүүлэгчийг оруулах</translation>
 <translation id="3677911431265050325">Мобайл сайтын хүсэлт тавих</translation>
-<translation id="3677959414150797585">Апп, вэб хуудас болон бусад зүйлийг багтаадаг. Та ашиглалтын өгөгдлийг хуваалцахыг сонгосон тохиолдолд л зөвлөмжүүдийг сайжруулахын тулд статистик илгээдэг.</translation>
+<translation id="3677959414150797585">Апп, веб хуудас болон бусад зүйлийг багтаадаг. Та ашиглалтын өгөгдлийг хуваалцахыг сонгосон тохиолдолд л зөвлөмжүүдийг сайжруулахын тулд статистик илгээдэг.</translation>
 <translation id="3678156199662914018">Өргөтгөл: <ph name="EXTENSION_NAME" /></translation>
 <translation id="3680683624079082902">Текстийг-яриа-болгох дуу хоолой</translation>
 <translation id="3681311097828166361">Санал хүсэлт илгээсэнд баярлалаа. Та одоогоор офлайн байгаа тул таны тайланг дараа нь илгээх болно.</translation>
@@ -2312,7 +2312,7 @@
 <translation id="3706463572498736864">Хүснэгт тутмын хуудас</translation>
 <translation id="370649949373421643">Утасгүй интернетийг идэвхжүүл</translation>
 <translation id="370665806235115550">Уншиж байна...</translation>
-<translation id="3709244229496787112">Файлыг татаж дуусахаас өмнө вэб хөтөч хаагдсан.</translation>
+<translation id="3709244229496787112">Файлыг татаж дуусахаас өмнө веб хөтөч хаагдсан.</translation>
 <translation id="3711931198657368127"><ph name="URL" />-г буулгаад, очих</translation>
 <translation id="3711945201266135623">Хэвлэх серверээс <ph name="NUM_PRINTERS" /> хэвлэгч олдлоо</translation>
 <translation id="3712050472459130149">Бүртгэлийг шинэчлэх шаардлагатай</translation>
@@ -2321,7 +2321,7 @@
 <translation id="371300529209814631">Буцах/Урагшлах</translation>
 <translation id="3713047097299026954">Энэ аюулгүй байдлын түлхүүрт ямар нэгэн нэвтрэх өгөгдөл алга байна</translation>
 <translation id="3714195043138862580">Энэ демо төхөөрөмжийн нэвтрэх эрхийг хүчингүй болгосон байна.</translation>
-<translation id="3714633008798122362">вэб хуанли</translation>
+<translation id="3714633008798122362">веб хуанли</translation>
 <translation id="3719826155360621982">Нүүр хуудас</translation>
 <translation id="372062398998492895">CUPS</translation>
 <translation id="3721119614952978349">Та болон Google</translation>
@@ -2358,7 +2358,7 @@
 <translation id="3757733214359997190">Сайт олдсонгүй</translation>
 <translation id="375841316537350618">Прокси бичвэрийг татаж авч байна...</translation>
 <translation id="3758842566811519622">Күүкийг тохируулсан</translation>
-<translation id="3759933321830434300">Вэб хуудсуудын зарим хэсгийг блокло</translation>
+<translation id="3759933321830434300">Веб хуудсуудын зарим хэсгийг блокло</translation>
 <translation id="3760460896538743390">Арын дэвсгэр хуудсыг шалгах</translation>
 <translation id="37613671848467444">Нууцлагдсан цонхонд нээх &amp;</translation>
 <translation id="3761556954875533505">Сайтад файл засахыг зөвшөөрөх үү?</translation>
@@ -2382,7 +2382,7 @@
 <translation id="3781742599892759500">Linux-н микрофоны хандалт</translation>
 <translation id="378312418865624974">Энэ компьютерийн тусгай танигчийг уншуул</translation>
 <translation id="3784372983762739446">Bluetooth төхөөрөмжүүд</translation>
-<translation id="3784472333786002075">Күүки нь вэб сайтуудын үүсгэдэг файл юм. Хоёр төрлийн күүки байдаг: Анхдагч талын күүкиг таны зочилдог сайт үүсгэдэг. Сайтыг хаяг оруулах хэсэгт харуулдаг. Гуравдагч талын күүкиг бусад сайт үүсгэдэг. Эдгээр сайт нь таны зочилдог вэб сайт дээрээ хардаг зар эсвэл зураг зэрэг контентын заримыг нь эзэмшдэг.</translation>
+<translation id="3784472333786002075">Күүки нь вебсайтуудын үүсгэдэг файл юм. Хоёр төрлийн күүки байдаг: Анхдагч талын күүкиг таны зочилдог сайт үүсгэдэг. Сайтыг хаяг оруулах хэсэгт харуулдаг. Гуравдагч талын күүкиг бусад сайт үүсгэдэг. Эдгээр сайт нь таны зочилдог вебсайт дээрээ хардаг зар эсвэл зураг зэрэг контентын заримыг нь эзэмшдэг.</translation>
 <translation id="3785308913036335955">Аппликейшнуудын богино холболтыг харуулах</translation>
 <translation id="3785727820640310185">Энэ сайтад хадгалсан нууц үг</translation>
 <translation id="3788301286821743879">Киоск аппликэйшнийг эхлүүлж чадсангүй.</translation>
@@ -2444,13 +2444,13 @@
 <translation id="3842552989725514455">Шовх үзүүртэй үгсийн фонт</translation>
 <translation id="3843464315703645664">Дотооддоо зөвшөөрсөн жагсаалт</translation>
 <translation id="3844888638014364087">Эможиг оруулсан</translation>
-<translation id="3846116211488856547">Вэб сайт, Android апп болон бусад зүйлийг хөгжүүлэхэд зориулсан хэрэгслийг аваарай. Linux-г суулгаснаар <ph name="DOWNLOAD_SIZE" /> өгөгдөл татаж авах болно.</translation>
-<translation id="3847319713229060696">Хүн бүрийн төлөө вэбийн аюулгүй байдлыг сайжруулахад туслах</translation>
+<translation id="3846116211488856547">Вебсайт, Android апп болон бусад зүйлийг хөгжүүлэхэд зориулсан хэрэгслийг аваарай. Linux-г суулгаснаар <ph name="DOWNLOAD_SIZE" /> өгөгдөл татаж авах болно.</translation>
+<translation id="3847319713229060696">Хүн бүрийн төлөө вебийн аюулгүй байдлыг сайжруулахад туслах</translation>
 <translation id="385051799172605136">Буцах</translation>
 <translation id="3850914401008572843">Энэ фолдер нь системийн файл агуулдаг тул <ph name="ORIGIN" /> түүнийг нээх боломжгүй байна</translation>
 <translation id="3851428669031642514">Аюултай скриптүүдийг ачаалла</translation>
 <translation id="3854599674806204102">Оруулах төрлийг сонгох</translation>
-<translation id="3854967233147778866">Вэб сайтуудыг бусад хэлээр орчуулахыг санал болгоно</translation>
+<translation id="3854967233147778866">Веб сайтуудыг бусад хэлээр орчуулахыг санал болгоно</translation>
 <translation id="3854976556788175030">Гарах цаасны тэвш дүүрсэн байна</translation>
 <translation id="3855441664322950881">Өргөтгөлийг багцлах</translation>
 <translation id="3855676282923585394">Хавчуургууд ба тохиргоонуудыг импортло...</translation>
@@ -2458,7 +2458,7 @@
 <translation id="3856800405688283469">Цагийн бүс сонгох</translation>
 <translation id="3857807444929313943">Дээшлүүлээд дахин хүрэх</translation>
 <translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Синкийг түр зогссон</translation>
-<translation id="3861386850461794863">Аппууд болон вэб сайтуудын хэл</translation>
+<translation id="3861386850461794863">Аппууд болон веб сайтуудын хэл</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" хэрэглэгчийн нэр боломжгүй байна</translation>
 <translation id="3862693525629180217">Built-in мэдрэгчээр баталгаажуулах</translation>
 <translation id="3862788408946266506">"Kiosk_only" тодорхойлогч файлын шинжтэй аппыг Chrome-н үйлдлийн системийн киоск горимд суулгах шаардлагатай</translation>
@@ -2678,7 +2678,7 @@
 <translation id="411031910327788420">Энэ тохиргоог дэмждэг аппуудад зориулж хадмалын хэмжээ болон загварыг тохируулах</translation>
 <translation id="4110490973560452005">Татаж дууссан: <ph name="FILE_NAME" />. Татаж авсан файл хадгалах эсвэл нээх хэсэгт гүйлгэхийн тулд Shift+F6-г дарна уу.</translation>
 <translation id="4110686435123617899"><ph name="TITLE" /> цомгийг <ph name="DESC" /> сонгох</translation>
-<translation id="4110895898888439383">Вэбийг өндөр нягтшилтай горимд хөтлөх</translation>
+<translation id="4110895898888439383">Вебийг өндөр нягтшилтай горимд хөтлөх</translation>
 <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (офлайн)</translation>
 <translation id="4115002065223188701">Сүлжээний хүрээнээс гарсан</translation>
 <translation id="4115080753528843955">Зарим агуулгын үйлчилгээ нь хамгаалалттай агуулгад хандах зорилгоор онцгой тодорхойлогчийг ашигладаг</translation>
@@ -2716,7 +2716,7 @@
 <translation id="4157869833395312646">Microsoft Server Gated Cryptography</translation>
 <translation id="4159681666905192102">Энэхүү хүүхдэд зориулсан хаягийг <ph name="CUSTODIAN_EMAIL" /> болон <ph name="SECOND_CUSTODIAN_EMAIL" /> удирдан ажиллаж байна.</translation>
 <translation id="4163560723127662357">Үл мэдэгдэх гар</translation>
-<translation id="4167686856635546851">Сайтууд ихэвчлэн видео тоглоом эсвэл вэбийн маягт зэрэг интерактив онцлогуудыг үзүүлэхийн тулд JavaScript-г ашигладаг</translation>
+<translation id="4167686856635546851">Сайтууд ихэвчлэн видео тоглоом эсвэл вебийн маягт зэрэг интерактив онцлогуудыг үзүүлэхийн тулд JavaScript-г ашигладаг</translation>
 <translation id="4168015872538332605"><ph name="PRIMARY_EMAIL" />-тэй холбоотой зарим тохиргоог танд үзүүлэх боломжтой болгосон байна. Энэхүү тохиргоо нь зөвхөн олон нэрээр зэрэг хандалт хийж байх үед таны хаягт нөлөөлөх болно.</translation>
 <translation id="4170256733935344210">Төхөөрөмжийн камерыг ашиглан QR кодыг скан хийнэ үү, эсвэл оператор компаниас олгосон идэвхжүүлэх кодыг оруулна уу</translation>
 <translation id="4170314459383239649">Гарахад устгах</translation>
@@ -2745,7 +2745,7 @@
 <translation id="4209464433672152343">Документийг хэвлэхэд бэлэн болгохын тулд <ph name="BEGIN_LINK_HELP" />Google-д илгээсэн<ph name="END_LINK_HELP" />. <ph name="BEGIN_LINK_DASHBOARD" />Google Cloud Хэвлэгчийн хяналтын самбар<ph name="END_LINK_DASHBOARD" /> хэсэгт хэвлэгч болон хэвлэгчийн түүхээ харж, засаж эсвэл удирдана уу.</translation>
 <translation id="4210048056321123003">Виртуал машиныг татаж байна</translation>
 <translation id="421182450098841253">&amp;Хадгалагдсан хуудсуудын цонхыг харуулах</translation>
-<translation id="4211851069413100178">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, Android-н хэрэглээгээ сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг хэрэглэгч өөрөө сонгож болно. Хэрэв таны Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
+<translation id="4211851069413100178">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, Android-н хэрэглээгээ сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг хэрэглэгч өөрөө сонгож болно. Хэрэв таны Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="42126664696688958">Экспортлох</translation>
 <translation id="42137655013211669">Энэ нөөцөд хандалт хийхийг серверээс хориглосон байна.</translation>
 <translation id="4217571870635786043">Заавар</translation>
@@ -2772,7 +2772,7 @@
 <translation id="424963718355121712">Аппыг нөлөөлдөг толгой компьютероос нь ажиллуулах шаардлагатай</translation>
 <translation id="4250229828105606438">Дэлгэцийн агшин</translation>
 <translation id="4250680216510889253">Үгүй</translation>
-<translation id="4252035718262427477">Вэб хуудас, дан файл (Вэб багц)</translation>
+<translation id="4252035718262427477">Веб хуудас, дан файл (Веб багц)</translation>
 <translation id="4252852543720145436">Хамгаалагдсан агуулгын таниулбар</translation>
 <translation id="4252899949534773101">Bluetooth-г идэвхгүй болгох</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - Чихтэй хуудасны агуулгыг хуваалцсан</translation>
@@ -2805,7 +2805,7 @@
 <translation id="4289372044984810120">Бүртгэлүүдээ энд удирдана уу. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">Тойм</translation>
 <translation id="4295072614469448764">Апп таны терминалд боломжтой боллоо. Түүнчлэн, таны Эхлүүлэгчид дүрс тэмдэг харагдаж болзошгүй.</translation>
-<translation id="4295979599050707005">Chrome болон Google Play-н вэб сайт, апп болон өргөтгөл дээр таны <ph name="USER_EMAIL" /> бүртгэлийг ашиглах боломжтой болохыг баталгаажуулахын тулд дахин нэвтэрнэ үү. Мөн та энэ бүртгэлийг устгаж болно. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
+<translation id="4295979599050707005">Chrome болон Google Play-н вебсайт, апп болон өргөтгөл дээр таны <ph name="USER_EMAIL" /> бүртгэлийг ашиглах боломжтой болохыг баталгаажуулахын тулд дахин нэвтэрнэ үү. Мөн та энэ бүртгэлийг устгаж болно. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="4296575653627536209">Хяналттай хэрэглэгч нэмэх</translation>
 <translation id="4297219207642690536">Дахин эхлүүлэх болон шинэчлэх</translation>
 <translation id="4297813521149011456">Дэлгэц эргүүлэлт</translation>
@@ -2820,7 +2820,7 @@
 <translation id="431076611119798497">Дэлгэрэнгүй мэдээлэл</translation>
 <translation id="4312866146174492540">Блоклох (өгөгдмөл)</translation>
 <translation id="4314815835985389558">Синк хийхийг удирдах</translation>
-<translation id="4316850752623536204">Хөгжүүлэгчийн вэбсайт</translation>
+<translation id="4316850752623536204">Хөгжүүлэгчийн вебсайт</translation>
 <translation id="4317820549299924617">Баталгаажуулалт амжилтгүй боллоо</translation>
 <translation id="4320177379694898372">Интернетийн холболтгүй байна</translation>
 <translation id="4322394346347055525">Бусад цонхуудаг хаах</translation>
@@ -3043,7 +3043,7 @@
 <translation id="4573515936045019911">Linux-г дэвшүүлэхэд сүлжээний холболт шаардлагатай. Интернэтэд холбогдоод дахин оролдоно уу.</translation>
 <translation id="457386861538956877">Илүү ихийг ...</translation>
 <translation id="4574741712540401491">•  <ph name="LIST_ITEM_TEXT" /></translation>
-<translation id="457564749856982089">Сургуулийн бүртгэлийг профайлд нэмснээр вэб сайт, өргөтгөл, аппуудад сурагчийн хувиар хялбар нэвтрэх боломжтой болох бөгөөд аливаа үйлдэл нь эцэг эхийн хяналтад хэвээр байх болно. Энэ нь хавчуурга, нууц үг эсвэл сургуулийн бүртгэлтэй синк хийсэн, интернэтээр үзсэн бусад өгөгдөлд хандах эрхийг хүүхдэд өгөхгүй.&lt;br&gt;&lt;br&gt;
+<translation id="457564749856982089">Сургуулийн бүртгэлийг профайлд нэмснээр вебсайт, өргөтгөл, аппуудад сурагчийн хувиар хялбар нэвтрэх боломжтой болох бөгөөд аливаа үйлдэл нь эцэг эхийн хяналтад хэвээр байх болно. Энэ нь хавчуурга, нууц үг эсвэл сургуулийн бүртгэлтэй синк хийсэн, интернэтээр үзсэн бусад өгөгдөлд хандах эрхийг хүүхдэд өгөхгүй.&lt;br&gt;&lt;br&gt;
     Хэрэв танай хүүхэд сургууль дээрээ Chromebook ашигладаг бөгөөд та хүүхдээ шаардлагатай бүх хичээлдээ хандах эрхтэй эсэхийг баталгаажуулах зорилгоор сургуулийн туршлагыг гэртээ тусгахыг хүсэж байвал энэ Family Link-н бүртгэлээс гарч, Chrome үйлдлийн системийн бүртгэлийн хуудаснаас сургуулийн бүртгэлд нэвтэрнэ үү (санамж: Family Link-н эцэг эхийн хяналт хэрэгжихгүй).&lt;br&gt;&lt;br&gt;
     Хэрэв танай хүүхэд сургууль дээрээ Chromebook ашигладаггүй буюу эсхүл та Family Link ашиглан хүүхдийнхээ туршлагыг гэрээсээ удирдахыг илүүд үзвэл сургуулийн бүртгэлийг энэ профайлд нэмэхийн тулд доор байгаа "Дараах" гэсэн товчлуурыг товшино уу.</translation>
 <translation id="4576541033847873020">Bluetooth төхөөрөмж холбох</translation>
@@ -3202,7 +3202,7 @@
 <translation id="4779083564647765204">Томруулж харах</translation>
 <translation id="4779136857077979611">Онигири</translation>
 <translation id="4780321648949301421">Хуудсыг... хэлбэрээр хадгалах</translation>
-<translation id="4785719467058219317">Та энэ вэб сайтад бүртгүүлээгүй аюулгүй байдлын түлхүүрийг ашиглаж байна</translation>
+<translation id="4785719467058219317">Та энэ веб сайтад бүртгүүлээгүй аюулгүй байдлын түлхүүрийг ашиглаж байна</translation>
 <translation id="4788092183367008521">Сүлжээний холболтоо шалгаад дахин оролдоно уу.</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> зураг</translation>
 <translation id="4791037424585594169">(UDP)</translation>
@@ -3355,7 +3355,7 @@
 <translation id="4965808351167763748">Hangouts Meet-г ажиллуулахын тулд энэ төхөөрөмжийг тохируулах уу?</translation>
 <translation id="496888482094675990">Файлууд апп нь таны Google Drive, гадаад хадгалалтын сан болон Chrome OS төхөөрөмж дээр хадгалсан файлууд руу хурдан нэвтрэх боломжийг олгодог.</translation>
 <translation id="4971412780836297815">Дууссаны дараа нээх</translation>
-<translation id="4971735654804503942">Аюултай вэб сайт, таталт болон өргөтгөлийн эсрэг илүү хурдан, идэвхтэй хамгаалалт. Танд нууц үгний зөрчлийн тухай анхааруулга өгдөг. Хайлтын өгөгдлийг Google-д илгээхийг шаарддаг.</translation>
+<translation id="4971735654804503942">Аюултай вебсайт, таталт болон өргөтгөлийн эсрэг илүү хурдан, идэвхтэй хамгаалалт. Танд нууц үгний зөрчлийн тухай анхааруулга өгдөг. Хайлтын өгөгдлийг Google-д илгээхийг шаарддаг.</translation>
 <translation id="4972129977812092092">Хэвлэгчийг засах</translation>
 <translation id="4972164225939028131">Нууц үг буруу байна</translation>
 <translation id="4972737347717125191">Сайтууд виртуал бодит байдлын төхөөрөмжүүд болон өгөгдлийг ашиглахыг хүсэх боломжтой</translation>
@@ -3392,8 +3392,8 @@
 <translation id="5017633213534173756">Санах</translation>
 <translation id="5017643436812738274">Та текстийн курсор ашиглан хуудас хооронд шилжих боломжтой. Ctrl+Search+7 дарж унтраана уу.</translation>
 <translation id="5017828934289857214">Надад дараа сануулна уу</translation>
-<translation id="5018207570537526145">Өргөтгөлийн вэбсайтыг нээх</translation>
-<translation id="5018526990965779848">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, таны Android-н хэрэглээг сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="5018207570537526145">Өргөтгөлийн вебсайтыг нээх</translation>
+<translation id="5018526990965779848">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, таны Android-н хэрэглээг сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="5019392775062123007">Ойролцоох төхөөрөмжүүдэд <ph name="DEVICE_NAME" /> нэрээр харагдана</translation>
 <translation id="5021750053540820849">Хараахан шинэчлэгдээгүй</translation>
 <translation id="5026806129670917316">Wi-Fi асаах</translation>
@@ -3418,7 +3418,7 @@
 <translation id="5051836348807686060">Таны сонгосон хэл дээр зөв бичгийн дүрмийн алдаа шалгагч нь дэмжигдээгүй байна</translation>
 <translation id="5052499409147950210">Сайтыг засах</translation>
 <translation id="5057110919553308744">Та өргөтгөл гэснийг товших үед</translation>
-<translation id="5057403786441168405">Нэвтэрсэн бүртгэлүүдээ удирдана уу. Chrome болон Google Play-н вэб сайт, апп болон өргөтгөл нь зөвшөөрлөөс хамаарч, таны хэрэглээг өөрчлөхийн тулд эдгээр бүртгэлийг ашиглаж болзошгүй. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
+<translation id="5057403786441168405">Нэвтэрсэн бүртгэлүүдээ удирдана уу. Chrome болон Google Play-н вебсайт, апп болон өргөтгөл нь зөвшөөрлөөс хамаарч, таны хэрэглээг өөрчлөхийн тулд эдгээр бүртгэлийг ашиглаж болзошгүй. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="5059241099014281248">Нэвтрэхийг хязгаарлах</translation>
 <translation id="5060332552815861872">Хадгалах боломжтой 1 хэвлэгч байна.</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Энэ фолдер хавчуурга агуулдаг. Та үүнийг устгахдаа итгэлтэй байна уу?}other{Энэ фолдерт # хавчуурга байна. Та үүнийг устгахдаа итгэлтэй байна уу?}}</translation>
@@ -3531,7 +3531,7 @@
 <translation id="5192062846343383368">Хяналтынхаа тохиргоог харахын тулд Family Link аппыг нээнэ үү</translation>
 <translation id="5193988420012215838">Түр санах ой руу хуулсан</translation>
 <translation id="5197255632782567636">Интернэт</translation>
-<translation id="5198430103906431024">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="5198430103906431024">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="5203920255089865054">{NUM_EXTENSIONS,plural, =1{Өргөтгөлийг харахын тулд товшино уу}other{Эдгээр өргөтгөлийг харахын тулд товшино уу}}</translation>
 <translation id="5204673965307125349">Төхөөрөмжийг үйлдвэрийн тохиргоонд нь буцааж оруулаад дахин оролдоно уу.</translation>
 <translation id="5204967432542742771">Нууц үгээ оруулна уу</translation>
@@ -3563,14 +3563,14 @@
 <translation id="523505283826916779">Нэвтрэх боломжит байдлын тохиргоо</translation>
 <translation id="5235750401727657667">Шинэ чихтэй хуудас нээхдээ харж буй хуудсаар орлуулах</translation>
 <translation id="5238278114306905396">"<ph name="EXTENSION_NAME" />" аппликейшнийг автоматаар устгасан байна.</translation>
-<translation id="5241128660650683457">Өөрийн ордог вэб сайт дээрх бүх мэдээллийг уншина уу</translation>
+<translation id="5241128660650683457">Өөрийн ордог вебсайт дээрх бүх мэдээллийг уншина уу</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />-ыг идэвхжүүлэх үү"?</translation>
 <translation id="5243522832766285132">Хэдэн хормын дараа дахин оролдоно уу</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />-д синк хийж байна</translation>
 <translation id="5245610266855777041">Сургуулийн бүртгэл ашиглаж эхлэх</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> эвдэрсэн байна. Энэ аппликйешнийг дахин эхлүүлэхийн тулд энэ заагч суман дээр дарна уу.</translation>
 <translation id="5247051749037287028">Дэлгэцийн нэр (заавал биш)</translation>
-<translation id="5249624017678798539">Татаж дуусахаас өмнө вэб хөтөч ажиллагаагүй болсон.</translation>
+<translation id="5249624017678798539">Татаж дуусахаас өмнө веб хөтөч ажиллагаагүй болсон.</translation>
 <translation id="5250372599208556903"><ph name="SEARCH_ENGINE_NAME" /> танд дотоод агуулга харуулахын тулд таны байршлыг ашигладаг. Та үүнийг <ph name="SETTINGS_LINK" />-д өөрчлөх боломжтой.</translation>
 <translation id="5252456968953390977">Роуминг</translation>
 <translation id="5252496130205799136">Нууц үгийг хадгалж, бөглөхдөө Google Бүртгэлээ ашиглах уу?</translation>
@@ -3582,7 +3582,7 @@
 <translation id="5258992782919386492">Энэ төхөөрөмж дээр суулгах</translation>
 <translation id="5260334392110301220">Ухаалаг эшлэл</translation>
 <translation id="5260508466980570042">Уучлаарай, таны и-мэйл болон нууц үгийг баталгаажуулж чадахгүй байна. Дахин оролдоно уу.</translation>
-<translation id="5261683757250193089">Вэб дэлгүүрт нээх</translation>
+<translation id="5261683757250193089">Веб дэлгүүрт нээх</translation>
 <translation id="5262178194499261222">Нууц үгийг хасах</translation>
 <translation id="5262784498883614021">Сүлжээнд автоматаар холбогдох</translation>
 <translation id="5264148714798105376">Үүнд нэг эсвэл хоёр минут шаардлагатай.</translation>
@@ -3600,7 +3600,7 @@
 <translation id="5280243692621919988">Таныг бүх цонхыг хаахад күүки болон сайтын өгөгдлийг устгах</translation>
 <translation id="5280426389926346830">Товчлол үүсгэх үү?</translation>
 <translation id="528208740344463258">Та Андройд аппыг татаж авах болон ашиглахын тулд эхлээд энэ шаардлагатай шинэчлэлтийг суулгах хэрэгтэй. Таны <ph name="DEVICE_TYPE" />-г шинэчилж байх үед та үүнийг ашиглах боломжгүй. Суулгалт дууссаны дараа таны <ph name="DEVICE_TYPE" />-г дахин эхлүүлнэ.</translation>
-<translation id="5282733140964383898">"Бүү дага" тохиргоог идэвхжүүлэх гэдэг нь аливаа хүсэлт таны хайлтад хамрагдана гэсэн үг юм. Вэб хуудас хүсэлтэд хариу илгээж байгаа эсэх мөн хүсэлтэд хэрхэн хариу өгч байгаагаас шалтгаалан ямар нэг үр нөлөө гарч болно. Жишээ нь, зарим вэб хуудас таны орсон бусад вэб хуудастай хамааралгүй сурталчилгаа харуулах замаар энэхүү хүсэлтэд хариу өгч болох юм. Олон вэб хуудас - жишээлбэл аюулгүй байдлыг сайжруулах, вэб хуудаст агуулга, үйлчилгээ, сурталчилгаа болон зөвлөмж гаргах мөн тайлангийн статистик мэдээллийг бий болгох зорилгоор таны хайлтын мэдээллийг цуглуулж, ашигладаг. <ph name="BEGIN_LINK" />Дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation>
+<translation id="5282733140964383898">"Бүү дага" тохиргоог идэвхжүүлэх гэдэг нь аливаа хүсэлт таны хайлтад хамрагдана гэсэн үг юм. Веб хуудас хүсэлтэд хариу илгээж байгаа эсэх мөн хүсэлтэд хэрхэн хариу өгч байгаагаас шалтгаалан ямар нэг үр нөлөө гарч болно. Жишээ нь, зарим веб хуудас таны орсон бусад веб хуудастай хамааралгүй сурталчилгаа харуулах замаар энэхүү хүсэлтэд хариу өгч болох юм. Олон веб хуудас - жишээлбэл аюулгүй байдлыг сайжруулах, веб хуудаст агуулга, үйлчилгээ, сурталчилгаа болон зөвлөмж гаргах мөн тайлангийн статистик мэдээллийг бий болгох зорилгоор таны хайлтын мэдээллийг цуглуулж, ашигладаг. <ph name="BEGIN_LINK" />Дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation>
 <translation id="5283677936944177147">Уучлаарай! Систем төхөөрөмжийн загвар, эсвэл серийн дугаарыг илрүүлж чадсангүй.</translation>
 <translation id="5284445933715251131">Үргэлжлүүлэн татах</translation>
 <translation id="5285635972691565180">Дэлгэц <ph name="DISPLAY_ID" /></translation>
@@ -3858,7 +3858,7 @@
 <translation id="5584915726528712820"><ph name="BEGIN_PARAGRAPH1" />Энэ нь таны төхөөрөмж болон үүнийг хэрхэн ашигладаг (батарейны түвшин, систем болон аппын үйл ажиллагаа, алдаа гэх мэт) талаарх ерөнхий мэдээлэл юм. Өгөгдлийг Android-г сайжруулах зорилгоор ашиглах бөгөөд зарим хуримтлуулсан мэдээллийг Android хөгжүүлэгч зэрэг Google аппууд болон түншүүдийн апп, бүтээгдэхүүнийг сайжруулахад мөн адил ашиглана.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Энэ онцлогийг унтрааснаар таны төхөөрөмжийн системийн шинэчлэлт болон аюулгүй байдал зэрэг зайлшгүй шаардлагатай үйлчилгээнд мэдээлэл илгээх чадамжид нөлөөлөхгүй.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Эзэмшигч нь энэ онцлогийг Тохиргоо &gt; Дэвшилтэт &gt; Оношилгоо болон ашиглалтын өгөгдлийг Google-д автоматаар илгээх хэсэгт хянаж болно.<ph name="END_PARAGRAPH3" />
-    <ph name="BEGIN_PARAGRAPH4" />Хэрэв таны Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. Та accounts.google.com-д өгөгдлөө харах, устгах болон бүртгэлийнхээ тохиргоог өөрчилж болно.<ph name="END_PARAGRAPH4" /></translation>
+    <ph name="BEGIN_PARAGRAPH4" />Хэрэв таны Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. Та accounts.google.com-д өгөгдлөө харах, устгах болон бүртгэлийнхээ тохиргоог өөрчилж болно.<ph name="END_PARAGRAPH4" /></translation>
 <translation id="5585019845078534178">Карт</translation>
 <translation id="5585118885427931890">Хайлтын жагсаалтын хавтас үүсгэж чадсангүй.</translation>
 <translation id="558563010977877295">Тодорхой нэг хуудас, эсвэл бүлэг хуудас нээх</translation>
@@ -3906,7 +3906,7 @@
 <translation id="563535393368633106">Хандалт хийхээс өмнө асуух (зөвлөж байна)</translation>
 <translation id="5636996382092289526"><ph name="NETWORK_ID" />-ыг ашиглахын тулд та эхлээд <ph name="LINK_START" /> сүлжээний нэвтрэх хуудас <ph name="LINK_END" />  руу орох хэрэгтэй бөгөөд  энэ нь хэдхэн секундын дотор автоматаар нээгдэнэ. Хэрвээ энэ ажиллахгүй байвал сүлжээг ашиглах боломжгүй.</translation>
 <translation id="5637476008227280525">Мобайл датаг идэвхжүүлэх</translation>
-<translation id="5638309510554459422"><ph name="BEGIN_LINK" />Chrome Вэб Дэлгүүрээс<ph name="END_LINK" /> өргөтгөл, загвар олох</translation>
+<translation id="5638309510554459422"><ph name="BEGIN_LINK" />Chrome Веб Дэлгүүрээс<ph name="END_LINK" /> өргөтгөл, загвар олох</translation>
 <translation id="5639549361331209298">Энэ хуудсыг дахин ачаална уу. Түр хүлээн нэмэлт сонголтуудыг харна уу.</translation>
 <translation id="5640133431808313291">Аюулгүй байдлын түлхүүрийг удирдах</translation>
 <translation id="5642508497713047">CRL гарын үсэг зурагч</translation>
@@ -4079,7 +4079,7 @@
 <translation id="5855643921295613558">0.6 секунд</translation>
 <translation id="5856721540245522153">Вирусны эсрэг программыг идэвхжүүлэх</translation>
 <translation id="5857090052475505287">Шинэ хавтас</translation>
-<translation id="5857171483910641802">Таны байнга зочилдог вэб сайтад тулгуурлан товчлолыг санал болгодог</translation>
+<translation id="5857171483910641802">Таны байнга зочилдог веб сайтад тулгуурлан товчлолыг санал болгодог</translation>
 <translation id="5858490737742085133">Терминал</translation>
 <translation id="5859603669299126575">Уран зургийн галерейн цомог</translation>
 <translation id="585979798156957858">Гадаад мета</translation>
@@ -4096,7 +4096,7 @@
 <translation id="586567932979200359">Та <ph name="PRODUCT_NAME" />-ийг дискний дүрснээс нь ажилуулж байна. Үүнийг компьютер дээрээ суулгаснаар та үүн дээр дискний дүрсгүйгээр ажиллах боломжтой болох бөгөөд үргэлж шинэчлэгдэж байх болно.</translation>
 <translation id="5865733239029070421">Хэрэглээний статистик мэдээ болон алдааны тайланг Google-д автоматаар илгээдэг</translation>
 <translation id="5866840822086176774">Маш хүчтэй</translation>
-<translation id="5867841422488265304">Хайх эсвэл вэб хаяг бичих</translation>
+<translation id="5867841422488265304">Хайх эсвэл веб хаяг бичих</translation>
 <translation id="5869029295770560994">OK, ойлголоо.</translation>
 <translation id="5869522115854928033">Хадгалагдсан нууц үг</translation>
 <translation id="5870086504539785141">Нэвтрэх боломжтой цэсийг хаах</translation>
@@ -4143,7 +4143,7 @@
     Энэ зураг Chromebook-н нэвтрэх дэлгэц болон түгжигдсэн дэлгэцэд харагдах болно.</translation>
 <translation id="5925147183566400388">Certification Practice Statement Pointer</translation>
 <translation id="592880897588170157">PDF файлыг автоматаар Chrome-д нээхийн оронд татна уу</translation>
-<translation id="5931146425219109062">Өөрийн ордог вэб сайтууд дээрх бүх мэдээллийг уншуулж, өөрчлөх</translation>
+<translation id="5931146425219109062">Өөрийн ордог веб сайтууд дээрх бүх мэдээллийг уншуулж, өөрчлөх</translation>
 <translation id="5932124097031739492">Linux-г амжилттай дэвшүүллээ.</translation>
 <translation id="5932224571077948991">Сайт төвөгтэй эсвэл хуурамч зар харуулдаг</translation>
 <translation id="59324397759951282"><ph name="MANUFACTURER_NAME" />-н USB төхөөрөмж</translation>
@@ -4164,7 +4164,7 @@
 <translation id="5951624318208955736">Монитор</translation>
 <translation id="5955282598396714173">Таны нууц үг хүчингүй боллоо. Нууц үгээ өөрчлөхийн тулд бүртгэлээсээ гараад буцаж нэвтэрнэ үү.</translation>
 <translation id="5955304353782037793">аппликейшн</translation>
-<translation id="5955721306465922729">Вэб сайт энэ хэрэглээний программыг нээх хүсэлтэй байна.</translation>
+<translation id="5955721306465922729">Вебсайт энэ хэрэглээний программыг нээх хүсэлтэй байна.</translation>
 <translation id="5955809630138889698">Энэ төхөөрөмж зөвхөн онлайн демо горимд боломжтой байж болзошгүй. Дэлгэрэнгүй мэдээлэл авахын тулд дэмжлэгийн төлөөлөгчтэйгээ холбогдоно уу.</translation>
 <translation id="5956585768868398362">Энэ таны хайж байсан хайлтын хуудас мөн байна уу?</translation>
 <translation id="5957613098218939406">Бусад сонголт</translation>
@@ -4197,7 +4197,7 @@
 <translation id="5985458664595100876">URL формат буруу байна. Дэмждэг формат нь \\server\share ба smb://server/share юм.</translation>
 <translation id="5990266201903445068">Зөвхөн Wi-Fi-р</translation>
 <translation id="5990386583461751448">Орчуулсан</translation>
-<translation id="599131315899248751">{NUM_APPLICATIONS,plural, =1{Та вэбийг үргэлжлүүлэн үзэх боломжтой байхын тулд админаасаа энэ аппыг устгахыг хүснэ үү.}other{Та вэбийг үргэлжлүүлэн үзэх боломжтой байхын тулд админаасаа эдгээр аппыг устгахыг хүснэ үү.}}</translation>
+<translation id="599131315899248751">{NUM_APPLICATIONS,plural, =1{Та вебийг үргэлжлүүлэн үзэх боломжтой байхын тулд админаасаа энэ аппыг устгахыг хүснэ үү.}other{Та вебийг үргэлжлүүлэн үзэх боломжтой байхын тулд админаасаа эдгээр аппыг устгахыг хүснэ үү.}}</translation>
 <translation id="5997337190805127100">Сайтын хандалтын талаар нэмэлт мэдээлэл авах</translation>
 <translation id="6000758707621254961">'<ph name="SEARCH_TEXT" />'-н <ph name="RESULT_COUNT" /> илэрц</translation>
 <translation id="6002210667729577411">Бүлгийг шинэ цонх руу зөөх</translation>
@@ -4277,7 +4277,7 @@
 <translation id="6080689532560039067">Системийн цагаа шалгана уу</translation>
 <translation id="6082651258230788217">Хэрэгслийн мөрд харуулах</translation>
 <translation id="608531959444400877"><ph name="WINDOW_TITLE" /> - Нэргүй бүлгийн хэсэг</translation>
-<translation id="6085886413119427067">Вэб сайтуудтай аюулгүй холболтоор хэрхэн холбогдохыг шийддэг</translation>
+<translation id="6085886413119427067">Веб сайтуудтай аюулгүй холболтоор хэрхэн холбогдохыг шийддэг</translation>
 <translation id="6086846494333236931">Таны админ суулгасан</translation>
 <translation id="6087960857463881712">Гайхалтай нүүр</translation>
 <translation id="6091761513005122595">Хуваалцлыг амжилттай салгасан.</translation>
@@ -4347,7 +4347,7 @@
 <translation id="6163363155248589649">&amp;Хэвийн</translation>
 <translation id="6163376401832887457">Kerberos-н тохиргоо</translation>
 <translation id="6163522313638838258">Бүгдийг өргөтгөх...</translation>
-<translation id="6164005077879661055">Хэрэв энэ хяналттай хэрэглэгчийг устгавал түүнтэй холбоотой бүх файлууд болон суурин өгөгдлүүд бүрмөсөн устах болно. Энэ хяналттай хэрэглэгчийн орж байсан вэб сайтууд болон тохиргоонуудыг <ph name="MANAGEMENT_URL" /> дэх менежер харах боломжтой байна.</translation>
+<translation id="6164005077879661055">Хэрэв энэ хяналттай хэрэглэгчийг устгавал түүнтэй холбоотой бүх файлууд болон суурин өгөгдлүүд бүрмөсөн устах болно. Энэ хяналттай хэрэглэгчийн орж байсан веб сайтууд болон тохиргоонуудыг <ph name="MANAGEMENT_URL" /> дэх менежер харах боломжтой байна.</translation>
 <translation id="6165508094623778733">Нэмэлт мэдээлэл авах</translation>
 <translation id="6166185671393271715">Нууц үгийг Chrome-д импортлох</translation>
 <translation id="616831107264507309">Дараа унших</translation>
@@ -4455,7 +4455,7 @@
 <translation id="628352644014831790">4 секунд</translation>
 <translation id="6285120108426285413"><ph name="FILE_NAME" />-г тогтмол татдаггүй бөгөөд аюултай байж болзошгүй.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Таны сүлжээнд шинэ хэвлэгч байна}other{ Таны сүлжээнд хэд хэдэн шинэ хэвлэгч байна}}</translation>
-<translation id="6289626062715012577">Олон хэлийг дэмждэг аппууд болон вэб сайтууд энэ жагсаалтын эхний дэмжигдсэн хэлийг ашиглана. Хэлний сонголтыг Chrome хөтөч рүү синк хийдэг. <ph name="BEGIN_LINK_LEARN_MORE" />Нэмэлт мэдээлэл авах<ph name="END_LINK_LEARN_MORE" /></translation>
+<translation id="6289626062715012577">Олон хэлийг дэмждэг аппууд болон веб сайтууд энэ жагсаалтын эхний дэмжигдсэн хэлийг ашиглана. Хэлний сонголтыг Chrome хөтөч рүү синк хийдэг. <ph name="BEGIN_LINK_LEARN_MORE" />Нэмэлт мэдээлэл авах<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="6291163159361301370">Linux-г эхлүүлэхийн тулд <ph name="ORGANIZATION_NAME" /> нь танаас өгөгдлөө хуулбарлаж, энэ Chromebook-г үйлдвэрийн тохиргоонд шинэчлэхийг шаардаж байна.</translation>
 <translation id="6291949900244949761">Сайт USB төхөөрөмжүүдэд хандах хүсэлтэй үед асуух (санал болгосон)</translation>
 <translation id="6291953229176937411">&amp; Хайгч дотор харуулах</translation>
@@ -4481,7 +4481,7 @@
 <translation id="6313950457058510656">Шуурхай модем болгохыг унтраах</translation>
 <translation id="6314819609899340042">Та <ph name="IDS_SHORT_PRODUCT_NAME" /> төхөөрөмжинд алдаа засах тохиргоог амжилттай тохируулсан байна.</translation>
 <translation id="6315493146179903667">Бүгдийг урд талд гаргах</translation>
-<translation id="6316806695097060329">Энэ <ph name="SHORT_PRODUCT_NAME" /> төхөөрөмж нь танд вэбийн хамгийн шилдэг ажиллагааг илгээхээр загварчлагдсан байна.</translation>
+<translation id="6316806695097060329">Энэ <ph name="SHORT_PRODUCT_NAME" /> төхөөрөмж нь танд вебийн хамгийн шилдэг ажиллагааг илгээхээр загварчлагдсан байна.</translation>
 <translation id="6317318380444133405">Дэмжихээ больсон байна.</translation>
 <translation id="6317369057005134371">Аппликейшний цонхыг хүлээж байна...</translation>
 <translation id="6317608858038767920">Захиалгат нэрийн сервер <ph name="INPUT_INDEX" /></translation>
@@ -4496,7 +4496,7 @@
 <translation id="6326175484149238433">Chrome-оос устга</translation>
 <translation id="6326855256003666642">Сэрүүн байх үеийн тоолуур</translation>
 <translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> нь танаас энэ төхөөрөмжийг хугацаанаас нь өмнө шинэчлэхийг шаардаж байна.</translation>
-<translation id="6327785803543103246">Вэб прокси автоматаар илрүүлэх</translation>
+<translation id="6327785803543103246">Веб прокси автоматаар илрүүлэх</translation>
 <translation id="6331566915566907158">Chrome үйлдлийн системийн онцлогууд болон гүйцэтгэлийг сайжруулахад туслах</translation>
 <translation id="6331818708794917058">Сайтууд MIDI төхөөрөмжүүдэд холбогдохыг хүсэх боломжтой</translation>
 <translation id="6333064448949140209">Файлыг дебаг хийхээр Google-д илгээж байна</translation>
@@ -4537,7 +4537,7 @@
 <translation id="6387674443318562538">Босоо чиглэлд хуваах</translation>
 <translation id="6388429472088318283">Хэл хайх</translation>
 <translation id="6390020764191254941">Табыг шинэ цонх руу зөөх</translation>
-<translation id="6390799748543157332">Таныг одоо нээллтэй байгаа бүх Зочин цонхнуудыг хаасны дараагаар таны энэ цонхонд үзэж буй хуудаснууд нь үүсмэл мэдээллийн нэгэн адил вэб хөтөчийн түүхэнд гарч ирэхгүй бөгөөд ямар ч ул мөр үлдэхгүй. Гэхдээ таны татаж авсан файлууд хадгалагдаж үлдэнэ.</translation>
+<translation id="6390799748543157332">Таныг одоо нээллтэй байгаа бүх Зочин цонхнуудыг хаасны дараагаар таны энэ цонхонд үзэж буй хуудаснууд нь үүсмэл мэдээллийн нэгэн адил веб хөтөчийн түүхэнд гарч ирэхгүй бөгөөд ямар ч ул мөр үлдэхгүй. Гэхдээ таны татаж авсан файлууд хадгалагдаж үлдэнэ.</translation>
 <translation id="6393156038355142111">Сайн нууц үг санал болгох</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" /> системийн мэдээллийг илгээх <ph name="END_LINK1" /> ба<ph name="BEGIN_LINK2" /> хэмжигдэхүүн <ph name="END_LINK2" /></translation>
 <translation id="6396988158856674517">Сайтуудыг хөдөлгөөн мэдрэгч ашиглахыг хориглох</translation>
@@ -4545,7 +4545,7 @@
 <translation id="6398765197997659313">Дэлгэц дүүрэн харах горимоос гарах</translation>
 <translation id="6399774419735315745">Тагнуулч</translation>
 <translation id="6404511346730675251">Хадгалагдсан хуудсыг засах</translation>
-<translation id="6406303162637086258">Вэб хөтөчийг дахин эхлүүлэх</translation>
+<translation id="6406303162637086258">Веб хөтөчийг дахин эхлүүлэх</translation>
 <translation id="6406506848690869874">Sync</translation>
 <translation id="6406708970972405507">Тохиргоо - <ph name="SECTION_TITLE" /></translation>
 <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> дахь мэдээллээ унших, өөрчлөх</translation>
@@ -4577,7 +4577,7 @@
 <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> нь компьютерийн бүх хэрэглэгчдэд зориулан автомат шинэчлэлтийг суулгаж өгнө.</translation>
 <translation id="6434309073475700221">Хэрэгсэхгүй байх</translation>
 <translation id="6434325376267409267">Та <ph name="APP_NAME" />-г ашиглах боломжтой болохоос өмнө таны төхөөрөмжийг шинэчлэх хэрэгтэй.</translation>
-<translation id="6436164536244065364">Вэб Дэлгүүрт харах</translation>
+<translation id="6436164536244065364">Веб Дэлгүүрт харах</translation>
 <translation id="6438992844451964465"><ph name="WINDOW_TITLE" /> - Аудио тоглуулж байна</translation>
 <translation id="6442187272350399447">Гайхалтай</translation>
 <translation id="6444070574980481588">Огноо ба цагийг тохируулах</translation>
@@ -4745,7 +4745,7 @@
 <translation id="6649563841575838401">Архивын форматыг дэмжээгүй эсвэл тус файл гэмтсэн байна.</translation>
 <translation id="6650234781371031356">Таны <ph name="WEBSITE" />-н нууц үгийг энэ төхөөрөмж болон таны Google Бүртгэлд хадгалсан. Та алийг нь устгахыг хүсэж байна вэ?</translation>
 <translation id="665061930738760572">Шинэ цонхонд нээх &amp;</translation>
-<translation id="6651237644330755633">Вэб хуудсыг тодорхойлохдоо энэ сертификатыг итгэмжилнэ үү</translation>
+<translation id="6651237644330755633">Веб хуудсыг тодорхойлохдоо энэ сертификатыг итгэмжилнэ үү</translation>
 <translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" /> интеграцийг зөвхөн x86_64 платформд дэмждэг. ARM эсвэл x86 платформ дээр суурилсан Chromebook энэ функцийг дэмждэггүй.</translation>
 <translation id="6654509035557065241">Сүлжээ сонгох</translation>
 <translation id="6655190889273724601">Хөгжүүлэгч горим</translation>
@@ -4777,7 +4777,7 @@
 <translation id="6697492270171225480">Хуудас олдоогүй үед төстэй хуудсын зөвлөмжийг харуулах</translation>
 <translation id="6697690052557311665">Хуваалцахын тулд Файлс аппын фолдерын баруун талыг товшоод, дараа нь "Linux-тэй хуваалцах" гэснийг сонгоно уу.</translation>
 <translation id="6698810901424468597"><ph name="WEBSITE_1" /> болон <ph name="WEBSITE_2" /> дахь мэдээллээ уших, өөрчлөх</translation>
-<translation id="6699883973579689168">Та одоо Google бүртгэлүүдээ нэг дор удирдах боломжтой. Таны Chrome болон Google Play-н Вэб сайт, апп болон өргөтгөлд олгосон хандалт ба зөвшөөрлийг одоо таны нэвтэрсэн бүх бүртгэлд хэрэгжүүлж болзошгүй. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
+<translation id="6699883973579689168">Та одоо Google бүртгэлүүдээ нэг дор удирдах боломжтой. Таны Chrome болон Google Play-н Веб сайт, апп болон өргөтгөлд олгосон хандалт ба зөвшөөрлийг одоо таны нэвтэрсэн бүх бүртгэлд хэрэгжүүлж болзошгүй. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="6700093763382332031">Үүрэн холбооны СИМ-н түгжээ</translation>
 <translation id="6700480081846086223">Каст хийх <ph name="HOST_NAME" /></translation>
 <translation id="6701535245008341853">Хувийн мэдээллийг олж авч чадсангүй.</translation>
@@ -4801,7 +4801,7 @@
 <translation id="6725073593266469338">UI үйлчилгээ</translation>
 <translation id="6725206449694821596">Интернэт Хэвлэх Протокол (IPP)</translation>
 <translation id="672609503628871915">Шинэ зүйл юу байна?</translation>
-<translation id="67269783048918309">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Хэрэв таны хүүхдийн Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
+<translation id="67269783048918309">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Хэрэв таны хүүхдийн Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="6727969043791803658">Холбогдсон, батарей <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="6731877319426971768">Яриа таних файлуудыг татаж авсан</translation>
 <translation id="6732801395666424405">Гэрчилгээнүүдийг ачаалласангүй</translation>
@@ -4833,7 +4833,7 @@
 <translation id="6767639283522617719">Домайнд нэгдэх боломжгүй байна. Байгууллагын нэгжийн тохиргоог зөв эсэхийг шалгана уу.</translation>
 <translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> нь танд энэ төхөөрөмжийг шинэчлэхийг зөвлөж байна.</translation>
 <translation id="6769712124046837540">Принтерийг нэмж байна...</translation>
-<translation id="6770602306803890733">Таны болон вэб дэх хүн бүрийн аюулгүй байдлыг сайжруулдаг</translation>
+<translation id="6770602306803890733">Таны болон веб дэх хүн бүрийн аюулгүй байдлыг сайжруулдаг</translation>
 <translation id="6770664076092644100">NFC-р баталгаажуулах</translation>
 <translation id="6771503742377376720">Гэрчилгээжүүлэх Алба</translation>
 <translation id="6772339735733515807">Өргөтгөлүүдээ удирдах</translation>
@@ -4868,7 +4868,7 @@
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME" />-д мөрдөх RLZ-ийг идэвхжүүлэх.</translation>
 <translation id="6808039367995747522">Үргэлжлүүлэхийн тулд аюулгүй байдлын түлхүүрээ залгаад дээр нь хүрнэ үү</translation>
 <translation id="6808193438228982088">Үнэг</translation>
-<translation id="6810613314571580006">Хадгалагдсан итгэмжлэлийг ашиглан вэбсайтад автоматаар нэвтэрнэ үү. Энэ онцлогийг идэвхжүүлээгүй тохиолдолд таныг вэб сайтад хандах бүрд баталгаажуулалт шаардах болно.</translation>
+<translation id="6810613314571580006">Хадгалагдсан итгэмжлэлийг ашиглан вебсайтад автоматаар нэвтэрнэ үү. Энэ онцлогийг идэвхжүүлээгүй тохиолдолд таныг веб сайтад хандах бүрд баталгаажуулалт шаардах болно.</translation>
 <translation id="6810768462515084623">Уучлаарай, таны нууц үгийн хугацаа дууссан байна. Үүнийг өөр төхөөрөмжид шинэчлээд дахин оролдоно уу.</translation>
 <translation id="6811034713472274749">Хуудсыг харахад бэлэн байна</translation>
 <translation id="6811332638216701903">DHCP хостны нэр</translation>
@@ -4908,7 +4908,7 @@
 <translation id="6847125920277401289">Үргэлжлүүлэхийн тулд сул зай гаргана уу</translation>
 <translation id="6848388270925200958">Танд одоогоор зөвхөн энэ төхөөрөмж дээр ашиглах боломжтой зарим карт байна.</translation>
 <translation id="6850286078059909152">Текстийн өнгө</translation>
-<translation id="6851181413209322061">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Хэрэв таны хүүхдийн Вэб, аппын нэмэлт үйл ажиллагаа асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="6851181413209322061">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагаа асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="6851497530878285708">Аппыг идэвхжүүлсэн</translation>
 <translation id="6853388645642883916">Шинэчлэгч амарч байна.</translation>
 <translation id="68541483639528434">Бусад tab-г хаах</translation>
@@ -4930,7 +4930,7 @@
 <translation id="6876469544038980967">Хэрэггүй</translation>
 <translation id="6878422606530379992">Мэдрэгчийнг зөвшөөрсөн</translation>
 <translation id="6880587130513028875">Энэ хуудсанд зураг гаргахыг блоклосон байна.</translation>
-<translation id="6882836635272038266">Аюултай гэж мэдэгдсэн вэб сайт, таталт болон өргөтгөлийн эсрэг стандарт хамгаалалт.</translation>
+<translation id="6882836635272038266">Аюултай гэж мэдэгдсэн веб сайт, таталт болон өргөтгөлийн эсрэг стандарт хамгаалалт.</translation>
 <translation id="6883319974225028188">Систем төхөөрөмжийн тохиргоог хадгалж чадсангүй.</translation>
 <translation id="6885771755599377173">Системийн мэдээллийг урьдчилан үзэх</translation>
 <translation id="6886476658664859389">NFC-н аюулгүй байдлын түлхүүр</translation>
@@ -5039,7 +5039,7 @@
 <translation id="7000347579424117903">Ctrl, Alt эсвэл Хайлтыг оруулах</translation>
 <translation id="7001036685275644873">Linux аппууд болон файлуудыг нөөцөлж байна</translation>
 <translation id="7002055706763150362">Chromebook-д зориулсан Smart Lock-ийг тохируулахын тулд Google та мөн гэдгийг батлах хэрэгтэй. Эхлэхийн тулд нууц үгээ бичнэ үү.</translation>
-<translation id="7003339318920871147">Вэб өгөгдлийн сан</translation>
+<translation id="7003339318920871147">Веб өгөгдлийн сан</translation>
 <translation id="7003723821785740825">Төхөөрөмжийнхөө түгжээг илүү хурдан тайлах арга тохируулах</translation>
 <translation id="7003844668372540529"><ph name="VENDOR_NAME" />-ын тодорхойгүй бүтээгдэхүүн <ph name="PRODUCT_ID" /></translation>
 <translation id="7004402701596653846">Сайт MIDI ашиглах боломжтой</translation>
@@ -5201,7 +5201,7 @@
 <translation id="7203150201908454328">Өргөтгөсөн</translation>
 <translation id="7206693748120342859"><ph name="PLUGIN_NAME" />-ийг татаж авч байна...</translation>
 <translation id="720715819012336933">{NUM_PAGES,plural, =1{Хуудаснаас гарах}other{Хуудаснуудаас гарах}}</translation>
-<translation id="7207457272187520234">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Хэрэв таны Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="7207457272187520234">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="7207631048330366454">Аппууд хайх</translation>
 <translation id="7210499381659830293">Өргөтгөлийн хэвлэгч</translation>
 <translation id="7211890396916697230">eSIM-г тохируулах</translation>
@@ -5217,7 +5217,7 @@
 <translation id="7222232353993864120">И-мэйл хаяг</translation>
 <translation id="7225179976675429563">Сүлжээний төрөл алга байна</translation>
 <translation id="7227028316978186866"><ph name="DEVICE_NAME" /> (Нийлүүлэгч: <ph name="VENDOR_ID" />, Бүтээгдэхүүн: <ph name="PRODUCT_ID" />)</translation>
-<translation id="7228479291753472782">Гео байршил, микрофон, камер зэрэг онцлог ашиглах боломжтой вэб хуудасны тохиргоог тодорхойлдог.</translation>
+<translation id="7228479291753472782">Гео байршил, микрофон, камер зэрэг онцлог ашиглах боломжтой веб хуудасны тохиргоог тодорхойлдог.</translation>
 <translation id="7228523857728654909">Дэлгэцийн түгжээ болон нэвтрэлт</translation>
 <translation id="7229570126336867161">EVDO хэрэгтэй байна</translation>
 <translation id="7230787553283372882">Текстийн хэмжээгээ өөрчлөх</translation>
@@ -5338,7 +5338,7 @@
 <translation id="7375235221357833624">{0,plural, =1{Төхөөрөмжийг нэг цагийн дотор шинэчилнэ үү}other{Төхөөрөмжийг # цагийн дотор шинэчилнэ үү}}</translation>
 <translation id="7376553024552204454">Хулганы курсорыг хөдлөх явцад нь тодруулна уу</translation>
 <translation id="7377451353532943397">Мэдрэгчийн хандалтыг үргэлжлүүлэн хориглох</translation>
-<translation id="73786666777299047">Chrome Вэб Дэлгүүр нээх</translation>
+<translation id="73786666777299047">Chrome Веб Дэлгүүр нээх</translation>
 <translation id="7378812711085314936">Дата холболт авах</translation>
 <translation id="7380622428988553498">Төхөөрөмжийн нэр буруу тэмдэгт агуулж байна</translation>
 <translation id="7380768571499464492"><ph name="PRINTER_NAME" />-г шинэчилсэн</translation>
@@ -5364,7 +5364,7 @@
 <translation id="7407504355934009739">Ихэнх хүн энэ сайтын мэдэгдлийг хориглодог</translation>
 <translation id="740810853557944681">Хэвлэх сервер нэмэх</translation>
 <translation id="7409549334477097887">Маш том</translation>
-<translation id="7409735910987429903">Сайтууд зар харуулахын тулд үзэгдэх зүйл илгээх буюу эсхүл таныг зочлохыг хүсээгүй вэб сайтууд руу тань хөтлөхийн тулд дахин чиглүүлэлтийг ашиглаж болзошгүй</translation>
+<translation id="7409735910987429903">Сайтууд зар харуулахын тулд үзэгдэх зүйл илгээх буюу эсхүл таныг зочлохыг хүсээгүй веб сайтууд руу тань хөтлөхийн тулд дахин чиглүүлэлтийг ашиглаж болзошгүй</translation>
 <translation id="7410344089573941623"><ph name="HOST" />-аас таны камер болон микрофонд нэвтрэхийг хүсч байгаа эсэхийг асуу</translation>
 <translation id="741204030948306876">Тийм, би зөвшөөрч байна</translation>
 <translation id="7412226954991670867">GPU санах ой</translation>
@@ -5451,7 +5451,7 @@
 <translation id="7506541170099744506">Таны <ph name="DEVICE_TYPE" />-г байгууллагын удирдлагад амжилттай бүртгэлээ.</translation>
 <translation id="7507207699631365376">Энэ хангагчийн <ph name="BEGIN_LINK" />нууцлалын бодлогыг<ph name="END_LINK" /> харах</translation>
 <translation id="7507930499305566459">Статусд хариулагч сертификат</translation>
-<translation id="7513029293694390567">Хадгалсан мандат үнэмлэхийг ашиглан вэб хуудаст автоматаар нэвтэрнэ үү. Энэ онцлогийг идэвхжүүлээгүй тохиолдолд таныг вэб хуудаст хандах бүрт баталгаажуулалт шаардана.</translation>
+<translation id="7513029293694390567">Хадгалсан мандат үнэмлэхийг ашиглан веб хуудаст автоматаар нэвтэрнэ үү. Энэ онцлогийг идэвхжүүлээгүй тохиолдолд таныг веб хуудаст хандах бүрт баталгаажуулалт шаардана.</translation>
 <translation id="7514239104543605883">Төхөөрөмж рүүгээ хуулах</translation>
 <translation id="7514365320538308">Татаж авах</translation>
 <translation id="751523031290522286">Админ <ph name="APP_NAME" />-г блоклосон. Энэ аппыг ашиглах зөвшөөрлийг админаас хүснэ үү.</translation>
@@ -5563,7 +5563,7 @@
 <translation id="7650511557061837441">"<ph name="TRIGGERING_EXTENSION_NAME" />" нь "<ph name="EXTENSION_NAME" />"-ыг устгахыг хүсч байна.</translation>
 <translation id="7650677314924139716">Дата ашиглах одоогийн тохиргоо нь Зөвхөн Wi-Fi дээр байна</translation>
 <translation id="7652808307838961528">Хүнийг өөрчлөх, <ph name="PROFILE_NAME" /></translation>
-<translation id="765293928828334535">Энэ вэбсайтаас апп, өргөтгөлүүд болон хэрэглэгчийн скриптийг нэмэх боломжгүй</translation>
+<translation id="765293928828334535">Энэ вебсайтаас апп, өргөтгөлүүд болон хэрэглэгчийн скриптийг нэмэх боломжгүй</translation>
 <translation id="7652954539215530680">ПИН үүсгэх</translation>
 <translation id="7654941827281939388">Энэ бүртгэлийг энэ компьютер дээр аль хэдийн ашиглаж байна.</translation>
 <translation id="7658239707568436148">Болих</translation>
@@ -5587,7 +5587,7 @@
 <translation id="7674542105240814168">Байршилд хандахыг зөвшөөрөөгүй</translation>
 <translation id="7676119992609591770">'<ph name="SEARCH_TEXT" />'-н <ph name="NUM" /> таб оллоо</translation>
 <translation id="7676867886086876795">Диктафоныг текстийн дурын талбарт зөвшөөрөхийн тулд дуу хоолойгоо Google-д илгээнэ үү.</translation>
-<translation id="7678280409648629969">Таныг Нууцлалын горимоос гарсны дараа нэвтрэх өгөгдлийг Chrome-д хадгална. Ингэснээр та энэ вэб сайтад дараагийн удаа зочлохдоо Хүрэх ID-г ашиглах боломжтой болно.</translation>
+<translation id="7678280409648629969">Таныг Нууцлалын горимоос гарсны дараа нэвтрэх өгөгдлийг Chrome-д хадгална. Ингэснээр та энэ веб сайтад дараагийн удаа зочлохдоо Хүрэх ID-г ашиглах боломжтой болно.</translation>
 <translation id="7680416688940118410">Мэдрэмтгий дэлгэцийн тохируулга</translation>
 <translation id="7681095912841365527">Сайт bluetooth-г ашиглах боломжтой</translation>
 <translation id="7682634383739326341">Сайтуудыг USB төхөөрөмжүүдэд холбогдохыг нь блоклоно</translation>
@@ -5644,7 +5644,7 @@
 <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />"-тай хослуулж байна ...</translation>
 <translation id="7737238973539693982">Linux (Бэта)-г устгах</translation>
 <translation id="7740996059027112821">Стандарт</translation>
-<translation id="7742706086992565332">Та тодорхой вэб сайтууд дээр хэр томруулах эсвэл жижгэрүүлэхээ тохируулах боломжтой</translation>
+<translation id="7742706086992565332">Та тодорхой веб сайтууд дээр хэр томруулах эсвэл жижгэрүүлэхээ тохируулах боломжтой</translation>
 <translation id="774377079771918250">Хаана хадгалахаа сонгоно уу</translation>
 <translation id="7744047395460924128">Хэвлэлтийн түүхээ харах</translation>
 <translation id="7744192722284567281">Өгөгдлийн зөрчилд олдсон</translation>
@@ -5911,7 +5911,7 @@
 <translation id="8016266267177410919">Түр хадгалах сан</translation>
 <translation id="8017176852978888182">Linux-н хуваалцсан лавлахууд</translation>
 <translation id="8017679124341497925">Товчлолыг зассан</translation>
-<translation id="8018313076035239964">Вэбсайтын ашиглах боломжтой мэдээлэл болон танд харуулах агуулгыг удирдах</translation>
+<translation id="8018313076035239964">Вебсайтын ашиглах боломжтой мэдээлэл болон танд харуулах агуулгыг удирдах</translation>
 <translation id="8023801379949507775">Өргөтгөлийг одоо шинэчил</translation>
 <translation id="8026334261755873520">Хайлтын өгөгдлийг цэвэрлэх</translation>
 <translation id="8028060951694135607">Microsoft-ын түлхүүр сэргээгч</translation>
@@ -5928,7 +5928,7 @@
 <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> хариу өгөхгүй байна.</translation>
 <translation id="8044899503464538266">Удаан</translation>
 <translation id="8045253504249021590">Google Хяналтын самбар синкийг зогсоосон байна.</translation>
-<translation id="8045923671629973368">Аппын ID эсвэл вэб дэлгүүрийн URL-г оруулах</translation>
+<translation id="8045923671629973368">Аппын ID эсвэл веб дэлгүүрийн URL-г оруулах</translation>
 <translation id="8047242494569930800">Google Бүртгэл рүү зөөх</translation>
 <translation id="804786196054284061">Эцсийн хэрэглэгчийн лицензийн гэрээ</translation>
 <translation id="8049705080247101012">Google "<ph name="EXTENSION_NAME" />"-г хортой гэж тэмдэглэсэн бөгөөд суулгахаас сэргийлсэн болно</translation>
@@ -5971,7 +5971,7 @@
 <translation id="8086550884324762001">Жишээ нь: Ажлын, Хувийн, Хүүхдийн, эсвэл нэр</translation>
 <translation id="80866457114322936">{NUM_FILES,plural, =1{Энэ файлыг шифрлэсэн байна. Өмчлөгчөөс нь үүний кодыг тайлахыг хүснэ үү.}other{Эдгээр файлын заримыг нь шифрлэсэн байна. Өмчлөгчөөс нь эдгээрийн кодыг тайлахыг хүснэ үү.}}</translation>
 <translation id="808894953321890993">Нууц үгийг солих</translation>
-<translation id="8090234456044969073">Хамгийн их зочилсон вэб сайтуудынхаа жагсаалтыг харах</translation>
+<translation id="8090234456044969073">Хамгийн их зочилсон веб сайтуудынхаа жагсаалтыг харах</translation>
 <translation id="8092681102116274204">"*" төлөөлөх тэмдэгтэй тохиргоог дэмжихээ больсон. <ph name="BEGIN_LINK" />Эдгээр тохиргоог өөрчлөх<ph name="END_LINK" />-ийн тулд өргөтгөлийн хөгжүүлэгчтэй эсвэл администратортайгаа холбогдоно уу.</translation>
 <translation id="8093359998839330381"><ph name="PLUGIN_NAME" /> хариу өгөхгүй байна</translation>
 <translation id="8095105960962832018"><ph name="BEGIN_PARAGRAPH1" />Google Драйвт нөөцлөх. Өгөгдлөө хялбархнаар сэргээж эсвэл төхөөрөмжийг хүссэн үедээ сэлгээрэй. Таны нөөцлөлтөд аппын өгөгдөл багтдаг.<ph name="END_PARAGRAPH1" />
@@ -6036,7 +6036,7 @@
 <translation id="8158117992543756526">Энэ төхөөрөмж <ph name="MONTH_AND_YEAR" />-д программ хангамж болон аюулгүй байдлын автомат шинэчлэлт авахаа зогсоосон байна. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">Гэрчилгээ баталгаажуулалтын тохиргоо алдаатай байна</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /> , <ph name="TIME_REMAINING" /></translation>
-<translation id="8161293209665121583">Вэб хуудсанд зориулсан уншигчийн горим</translation>
+<translation id="8161293209665121583">Веб хуудсанд зориулсан уншигчийн горим</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Табыг шинэ цонх руу зөөх}other{Табуудыг шинэ цонх руу зөөх}}</translation>
 <translation id="8165997195302308593">Crostini-н порт дамжуулах</translation>
 <translation id="8168435359814927499">Агуулга</translation>
@@ -6125,7 +6125,7 @@
 <translation id="8267961145111171918"><ph name="BEGIN_PARAGRAPH1" />Энэ нь энэ төхөөрөмж болон үүнийг хэрхэн ашигладаг (батарейны түвшин, систем болон аппын үйл ажиллагаа, алдаа гэх мэт) талаарх ерөнхий мэдээлэл юм. Өгөгдлийг Android-г сайжруулах зорилгоор ашиглах бөгөөд зарим хуримтлуулсан мэдээллийг Android хөгжүүлэгч зэрэг Google аппууд болон түншүүдийн апп, бүтээгдэхүүнийг сайжруулахад мөн адил ашиглана.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Энэ онцлогийг унтрааснаар энэ төхөөрөмжийн системийн шинэчлэлт болон аюулгүй байдал зэрэг зайлшгүй шаардлагатай үйлчилгээнд мэдээлэл илгээх чадамжид нөлөөлөхгүй.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Энэ онцлогийг эзэмшигч нь Тохиргоо &gt; Дэвшилтэт &gt; Оношилгоо болон ашиглалтын өгөгдлийг Google-д автоматаар илгээх хэсэгт хянаж болно.<ph name="END_PARAGRAPH3" />
-    <ph name="BEGIN_PARAGRAPH4" />Хэрэв таны хүүхдийн Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google Бүртгэлд хадгалж болзошгүй. Та эдгээр тохиргооны талаар болон эдгээрийг хэрхэн тохируулах талаарх нэмэлт мэдээллийг families.google.com-с авна уу.<ph name="END_PARAGRAPH4" /></translation>
+    <ph name="BEGIN_PARAGRAPH4" />Хэрэв таны хүүхдийн Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google Бүртгэлд хадгалж болзошгүй. Та эдгээр тохиргооны талаар болон эдгээрийг хэрхэн тохируулах талаарх нэмэлт мэдээллийг families.google.com-с авна уу.<ph name="END_PARAGRAPH4" /></translation>
 <translation id="826905130698769948">Хүчингүй клиентийн гэрчилгээ</translation>
 <translation id="8270242299912238708">PDF документ</translation>
 <translation id="827097179112817503">Нүүр хуудас хэсгийн товчлуурыг харуулах</translation>
@@ -6174,7 +6174,7 @@
 <translation id="8336721153892716270">Системийн текстийг <ph name="LANGUAGE" /> дээр харуулахын тулд төхөөрөмжийг дахин эхлүүлэх</translation>
 <translation id="8336739000755212683">Төхөөрөмжийн бүртгэлийн зургийг өөрчлөх</translation>
 <translation id="8337047789441383384">Та энэ аюулгүй байдлын түлхүүрийг аль хэдийн бүртгүүлсэн байна. Та үүнийг дахин бүртгүүлэх шаардлагагүй.</translation>
-<translation id="8338952601723052325">Хөгжүүлэгч вэб сайт</translation>
+<translation id="8338952601723052325">Хөгжүүлэгч вебсайт</translation>
 <translation id="8339059274628563283"><ph name="SITE" /> дотоодод хадгалсан өгөгдөл</translation>
 <translation id="833986336429795709">Энэ холбоосыг нээхийн тулд апп сонгоно уу</translation>
 <translation id="8342861492835240085">Цуглуулга сонгох</translation>
@@ -6207,7 +6207,7 @@
 <translation id="8373652277231415614">Crostini-н хуваалцсан лавлахууд</translation>
 <translation id="8376384591331888629">Энэ сайт дээрх гуравдагч талын күүкитэй цуг</translation>
 <translation id="8378714024927312812">Танай байгууллагаас удирддаг</translation>
-<translation id="8379878387931047019">Энэ төхөөрөмж энэ вэб сайтаас хүссэн аюулгүй байдлын түлхүүрийн төрлийг дэмждэггүй</translation>
+<translation id="8379878387931047019">Энэ төхөөрөмж энэ веб сайтаас хүссэн аюулгүй байдлын түлхүүрийн төрлийг дэмждэггүй</translation>
 <translation id="8379991678458444070">Энэ табыг тэмдэглэснээр дараа олоход хялбар болно</translation>
 <translation id="8380266723152870797">Цонхны нэр</translation>
 <translation id="8382384117483909115">{NUM_TABS,plural, =1{Табыг дараа унших}other{Табуудыг дараа унших}}</translation>
@@ -6215,7 +6215,7 @@
 <translation id="8386091599636877289">Удирдамж олдсонгүй.</translation>
 <translation id="8386903983509584791">Шалгаж дууслаа</translation>
 <translation id="8389416080014625855">Энэ хуудсанд QR код үүсгэх</translation>
-<translation id="8389492867173948260">Энэ өргөтгөлд таны зочилдог вэб сайтын бүх өгөгдлийг унших болон өөрчлөхийг зөвшөөрнө үү:</translation>
+<translation id="8389492867173948260">Энэ өргөтгөлд таны зочилдог веб сайтын бүх өгөгдлийг унших болон өөрчлөхийг зөвшөөрнө үү:</translation>
 <translation id="8390449457866780408">Серверүүд ажиллах боломжгүй байна.</translation>
 <translation id="8391218455464584335">Пянз</translation>
 <translation id="8392364544846746346">Сайт таны төхөөрөмжийн файл эсвэл фолдерыг засах хүсэлтэй үед асуух</translation>
@@ -6339,7 +6339,7 @@
 <translation id="8545575359873600875">Уучлаарай, таны нууц үгийг баталгаажуулж чадсангүй. Энэ хяналттай хэрэглэгчийн менежер нь нууц үгийг өөрчилсөн байж болох юм. Хэрэв тийм бол таныг дараагийн удаа нэвтрэхэд шинэ нууц үгийг шаардана. Хуучин нууц үгээрээ дахиад оролдоод үзнэ үү.</translation>
 <translation id="8546186510985480118">Төхөөрөмжийн багтаамж бага байна</translation>
 <translation id="8546306075665861288">Зургийн кэш</translation>
-<translation id="854655314928502177">Вэб прокси автоматаар илрүүлэх URL:</translation>
+<translation id="854655314928502177">Веб прокси автоматаар илрүүлэх URL:</translation>
 <translation id="8546930481464505581">Хүрэх мөрийг өөрчлөх</translation>
 <translation id="8547013269961688403">Бүтэн дэлгэцийн томруулагчийг идэвхжүүлэх</translation>
 <translation id="85486688517848470">Дээд мөрний түлхүүрийн функцийг сэлгэхийн тулд Хайлтын түлхүүрийг дарна уу</translation>
@@ -6374,7 +6374,7 @@
 <translation id="8591783563402255548">1 секунд</translation>
 <translation id="8592141010104017453">Мэдэгдлийг огт харуулахгүй</translation>
 <translation id="859246725979739260">Байршилд тань хандахыг энэ сайтад хориглосон.</translation>
-<translation id="8593121833493516339">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны хүүхдийн Вэб, Аппын нэмэлт үйл ажиллагаа асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK1" />Нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation>
+<translation id="8593121833493516339">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны хүүхдийн Веб, Аппын нэмэлт үйл ажиллагаа асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK1" />Нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation>
 <translation id="8593735906501637689"><ph name="MODULE_TITLE" />-г хассан</translation>
 <translation id="8594908476761052472">Видео хийх</translation>
 <translation id="8596540852772265699">Энгийн файлууд</translation>
@@ -6414,7 +6414,7 @@
 <translation id="8637688295594795546">Системийг шинэчлэх боломжтой. Татаж авахаар бэлдэж байна...</translation>
 <translation id="8639047128869322042">Хортой программ хангамжийг шалгаж байна...</translation>
 <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Порт</translation>
-<translation id="8639635302972078117">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны хүүхдийн Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="8639635302972078117">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж нь одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="8642900771896232685">2 секунд</translation>
 <translation id="8642947597466641025">Текстийг илүү томруулах</translation>
 <translation id="8643443571868262066"><ph name="FILE_NAME" /> нь аюултай байж болзошгүй. Скан хийлгэхээр Google-н Дэвшилтэт хамгаалалт руу илгээх үү?</translation>
@@ -6422,7 +6422,7 @@
 <translation id="8645354835496065562">Мэдрэгчийн хандалтыг үргэлжлүүлэн зөвшөөрөх</translation>
 <translation id="8645920082661222035">Аюултай үйл явдлын тухай урьдчилан таамаглаж, тохиолдохоос нь өмнө танд анхааруулга өгдөг</translation>
 <translation id="8646209145740351125">Синкийг идэвхгүй болгох</translation>
-<translation id="8647834505253004544">Хүчингүй вэб хаяг байна</translation>
+<translation id="8647834505253004544">Хүчингүй веб хаяг байна</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> эсвэл <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">Шөнийн гэрлийн өнгөний хэм</translation>
 <translation id="8648544143274677280"><ph name="SITE_NAME" /> дараах зөвшөөрлүүдийг хүсэж байна: <ph name="FIRST_PERMISSION" />, <ph name="SECOND_PERMISSION" /> болон бусад</translation>
@@ -6449,7 +6449,7 @@
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> нь бүрэн дэлгэцийн горимд шилжсэн бөгөөд таны хулганын курсорыг идэвхгүй болгосон.</translation>
 <translation id="8669284339312441707">Дулаан</translation>
 <translation id="867085395664725367">Серверийн түр хугацааны алдаа гарлаа.</translation>
-<translation id="8673026256276578048">Вэб хайх ...</translation>
+<translation id="8673026256276578048">Веб хайх ...</translation>
 <translation id="8673383193459449849">Серверийн асуудал</translation>
 <translation id="8675354002693747642">Урьдчилан хуваалцсан түлхүүр</translation>
 <translation id="8676374126336081632">Оролтыг цэвэрлэх</translation>
@@ -6485,7 +6485,7 @@
 <translation id="8719653885894320876"><ph name="PLUGIN_NAME" /> таталт амжилтгүй боллоо</translation>
 <translation id="8720200012906404956">Мобайл сүлжээг хайж байна. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation>
 <translation id="8720816553731218127">Суулгалтын хугацааны атрибутын анхны утгыг олох хугацаа дууслаа.</translation>
-<translation id="8722912030556880711">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
+<translation id="8722912030556880711">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="8723108084122415655">Өгөгдмөл бус сүлжээ хоцролтын хязгаараас дээш байна</translation>
 <translation id="8724405322205516354">Та энэ дүрс тэмдгийг харсан үедээ өөрийгөө мөн болохыг баталгаажуулах эсвэл худалдан авалтыг зөвшөөрөхийн тулд хурууны хээгээ ашиглана уу.</translation>
 <translation id="8724409975248965964">Хурууны хээ нэмсэн</translation>
@@ -6657,7 +6657,7 @@
 <translation id="8895454554629927345">Хавчуургын жагсаалт</translation>
 <translation id="8896022254727357590">ПИН хамгийн багадаа 4 тэмдэгттэй байх ёстой</translation>
 <translation id="8898786835233784856">Дараагийн tab-г сонгоно уу</translation>
-<translation id="8898822736010347272">Шинэ аюул заналыг олж илрүүлэх болон вэб дээрх бүх хүнийг хамгаалахад туслахын тулд таны зочилдог зарим хуудасны URL, системийн хязгаарлагдмал мэдээлэл болон хуудасны зарим контентыг Google рүү илгээдэг.</translation>
+<translation id="8898822736010347272">Шинэ аюул заналыг олж илрүүлэх болон веб дээрх бүх хүнийг хамгаалахад туслахын тулд таны зочилдог зарим хуудасны URL, системийн хязгаарлагдмал мэдээлэл болон хуудасны зарим контентыг Google рүү илгээдэг.</translation>
 <translation id="8898840733695078011">Дохионы хүч</translation>
 <translation id="8899851313684471736">Шинэ цонхонд нээлттэй байгаа холбоос</translation>
 <translation id="8900413463156971200">Үүрэн холбоог идэвхжүүлэх</translation>
@@ -6682,7 +6682,7 @@
 <translation id="892706138619340876">Зарим тохиргоог шинэчилсэн</translation>
 <translation id="8930351635855238750">Хуудсыг дахин ачаалласны дараагаар күүкигийн шинэ тохиргоо хүчинтэй болно</translation>
 <translation id="8930622219860340959">Утасгүй</translation>
-<translation id="8931076093143205651">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, таны Android-н хэрэглээг сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг эзэмшигч өөрөө сонгож болно. Хэрэв таны Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="8931076093143205651">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, таны Android-н хэрэглээг сайжруулахад тусална уу. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Энэ тохиргоог эзэмшигчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг эзэмшигч өөрөө сонгож болно. Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="8931394284949551895">Шинэ төхөөрөмжүүд</translation>
 <translation id="8931475688782629595">Юуг синк хийхээ удирдах</translation>
 <translation id="8932654652795262306">Шуурхай модем болгох онцлогийн дэлгэрэнгүй</translation>
@@ -6741,7 +6741,7 @@
 <translation id="899676909165543803">Таны гарын баруун гар талын доод товчлуур нь хурууны хээ мэдрэгч. Үүнд дурын хуруугаар зөөлөн хүрнэ үү.</translation>
 <translation id="8999560016882908256">Хэсгийн дүрмийн алдаа: <ph name="ERROR_LINE" /></translation>
 <translation id="9002878223019487115"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /></translation>
-<translation id="9003647077635673607">Бүх вэб сайт дээр зөвшөөрөх</translation>
+<translation id="9003647077635673607">Бүх вебсайт дээр зөвшөөрөх</translation>
 <translation id="9003677638446136377">Дахин шалгах</translation>
 <translation id="9003704114456258138">Давтамж</translation>
 <translation id="9003940392834790328">Сүлжээ: <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />%, таны администратор удирддаг, дэлгэрэнгүй мэдээлэл</translation>
@@ -6786,7 +6786,7 @@
 <translation id="9042893549633094279">Нууцлал, аюулгүй байдал</translation>
 <translation id="904451693890288097">"<ph name="DEVICE_NAME" />"-д нэвтрэх түлхүүрийг оруулна уу. Үүнд:</translation>
 <translation id="9044646465488564462">Сүлжээнд холбогдож чадсангүй: <ph name="DETAILS" /></translation>
-<translation id="9045430190527754450">Таны хандахыг хүсэж буй хуудасны вэб хаягийг Google-д илгээдэг</translation>
+<translation id="9045430190527754450">Таны хандахыг хүсэж буй хуудасны веб хаягийг Google-д илгээдэг</translation>
 <translation id="9046895021617826162">Холболт амжилтгүй боллоо</translation>
 <translation id="9050666287014529139">Нэвтрэх хэллэг</translation>
 <translation id="9052208328806230490">Та <ph name="EMAIL" /> бүртгэлийг ашиглан принтерийг <ph name="CLOUD_PRINT_NAME" /> руу бүртгүүлсэн байна.</translation>
@@ -6891,15 +6891,15 @@
 <translation id="917350715406657904">Та <ph name="APP_NAME" /> дээр таны эцэг эхийн тохируулсан цагийн хязгаарт хүрсэн байна. Та түүнийг маргааш <ph name="TIME_LIMIT" />-н турш ашиглах боломжтой.</translation>
 <translation id="9173787391779732995">Сайтууд зураг харуулах боломжтой (санал болгосон)</translation>
 <translation id="9173995187295789444">Bluetooth төхөөрөмжүүдийг хайж байна...</translation>
-<translation id="9174401638287877180">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны хүүхдийн Вэб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="9174401638287877180">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
 <translation id="917510707618656279">Сайт Bluetooth төхөөрөмжүүдэд хандах хүсэлтэй үед асуух</translation>
-<translation id="9176476835295860688">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Хэрэв таны Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
+<translation id="9176476835295860688">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Хэрэв таны Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Bluetooth төхөөрөмжийг холбосон</translation>
 <translation id="9179524979050048593">Нэвтрэх дэлгэцийн хэрэглэгчийн нэр</translation>
 <translation id="9179734824669616955">Linux (Бэта)-г <ph name="DEVICE_TYPE" />-д тохируулаарай</translation>
 <translation id="9180281769944411366">Энэ үйл явцад хэдэн минут шаардлагатай. Linux контейнерыг эхлүүлж байна.</translation>
 <translation id="9180380851667544951">Сайт таны дэлгэцийг хуваалцах боломжтой</translation>
-<translation id="9188732951356337132">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны хүүхдийн Вэб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google Бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
+<translation id="9188732951356337132">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Энэ төхөөрөмж одоогоор оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж байна. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Хэрэв таны хүүхдийн Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google Бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="9190063653747922532">L2TP/IPsec + урьдчилан хуваалцсан түлхүүр</translation>
 <translation id="9198090666959937775">Android утсаа аюулгүй байдлын түлхүүрээр ашиглана уу</translation>
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> хайх</translation>
@@ -6911,7 +6911,7 @@
 <translation id="9203962528777363226">Энэ төхөөрөмжийн администратор нь шинэ хэрэглэгч нэмэхийг хориглосон байна</translation>
 <translation id="9206889157914079472">Түгжигдсэн дэлгэцээс мэдрэгч үзгээр тэмдэглэл хөтлөх</translation>
 <translation id="9209563766569767417">Linux контейнерын тохируулгыг шалгаж байна</translation>
-<translation id="9209689095351280025">Сайтууд нь таныг вэб дээр хянадаг күүкиг ашиглах боломжгүй байна</translation>
+<translation id="9209689095351280025">Сайтууд нь таныг веб дээр хянадаг күүкиг ашиглах боломжгүй байна</translation>
 <translation id="9211177926627870898">Шинэчлэх шаардлагатай</translation>
 <translation id="9211904674129619383">Клоудаар хэвлэхийг XII сарын 31-нээс хойш дэмжихээ болино. <ph name="BEGIN_LINK_LEARN_MORE" />Нэмэлт мэдээлэл авах<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="9214520840402538427">Програм суурьлуулах атрибут эхлэх цаг хэтэрхий удаан байна. Тусламжийн төлөөлөгчдөө хандана уу.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index df36147a..5e0716d 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -8,6 +8,7 @@
 
 Some features may be unavailable and changes to preferences won't be saved.</translation>
 <translation id="1088300314857992706"><ph name="USER_EMAIL_ADDRESS" /> was previously using Chrome</translation>
+<translation id="1088654056000736875">Chrome is removing harmful software from your computer…</translation>
 <translation id="1097330777386562916">Clear cookies and site data when you quit Chrome</translation>
 <translation id="110877069173485804">This is your Chrome</translation>
 <translation id="1125124144982679672">Who's using Chrome?</translation>
@@ -18,6 +19,7 @@
 <translation id="1355000804395496115">Use different profiles in Chrome to separate work and personal browsing, or for different people who use this device</translation>
 <translation id="137466361146087520">Google Chrome Beta</translation>
 <translation id="1399397803214730675">This computer already has a more recent version of Google Chrome. If the software is not working, please uninstall Google Chrome and try again.</translation>
+<translation id="140541193409212341">An error occurred while Chrome was checking your computer for harmful software</translation>
 <translation id="1434626383986940139">Chrome Canary Apps</translation>
 <translation id="1513277449617685876">To separate personal and <ph name="NEW_USER" /> browsing, create a new profile in Chrome</translation>
 <translation id="1553358976309200471">Update Chrome</translation>
@@ -59,6 +61,7 @@
 <translation id="2429317896000329049">Google Chrome could not sync your data because Sync is not available for your domain.</translation>
 <translation id="2467438592969358367">Google Chrome wants to export your passwords. Type your Windows password to allow this.</translation>
 <translation id="2485422356828889247">Uninstall</translation>
+<translation id="252502352004572774">Chrome is checking your computer for harmful software...</translation>
 <translation id="2534507159460261402">Google Pay (copied to Chrome)</translation>
 <translation id="2580411288591421699">Cannot install the same Google Chrome version that is currently running. Please close Google Chrome and try again.</translation>
 <translation id="2586406160782125153">This will delete your browsing data from this device. To retrieve your data later, sign in to Chrome as <ph name="USER_EMAIL" />.</translation>
@@ -113,10 +116,12 @@
 <translation id="4050175100176540509">Important security improvements and new features are available in the latest version.</translation>
 <translation id="4053720452172726777">Customise and control Google Chrome</translation>
 <translation id="4110895483821904099">Set up your new Chrome profile</translation>
+<translation id="4127976662406264741">{NUM_MINS,plural, =1{Chrome didn't find known harmful software on your computer. Last checked: 1 minute ago.}other{Chrome didn't find known harmful software on your computer. Last checked: {NUM_MINS} minutes ago.}}</translation>
 <translation id="4143243756087420366">Chrome name and picture</translation>
 <translation id="4147555960264124640">You are signing in with a managed account and giving its administrator control over your Google Chrome profile. Your Chrome data, such as your apps, bookmarks, history, passwords and other settings will become permanently tied to <ph name="USER_NAME" />. You will be able to delete this data via the Google Accounts Dashboard, but you will not be able to associate this data with another account. <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">The installer failed to uncompress archive. Please download Google Chrome again.</translation>
 <translation id="4191857738314598978">{0,plural, =1{Relaunch Chrome within a day}other{Relaunch Chrome within # days}}</translation>
+<translation id="4205362703535890467">Chrome didn't find known harmful software on your computer. Last checked: yesterday.</translation>
 <translation id="4205939740494406371">Chrome can't check your passwords. Try again after 24 hours or <ph name="BEGIN_LINK" />check passwords in your Google Account<ph name="END_LINK" />.</translation>
 <translation id="424864128008805179">Sign out of Chrome?</translation>
 <translation id="4251615635259297716">Link my Chrome data to this account</translation>
@@ -145,6 +150,7 @@
 <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation>
 <translation id="4771048833395599659">This file may be dangerous, so Chrome has blocked it.</translation>
 <translation id="479167709087336770">This uses the same spell checker that's used in Google search. Text that you type in the browser is sent to Google. You can always change this behaviour in settings.</translation>
+<translation id="4831688036548685548">Chrome didn't find known harmful software on your computer. Last checked: a moment ago.</translation>
 <translation id="4891791193823137474">Let Google Chrome run in the background</translation>
 <translation id="4895437082222824641">Open link in new Chrome &amp;tab</translation>
 <translation id="4953650215774548573">Set Google Chrome as your default browser</translation>
@@ -160,6 +166,7 @@
 <translation id="532046782124376502">Warning: Google Chrome cannot prevent extensions from recording your browsing history. To disable this extension in incognito mode, unselect this option.</translation>
 <translation id="5386244825306882791">It also controls what page is shown when you start Chrome or search from the Omnibox.</translation>
 <translation id="5394833366792865639">Share a Chrome tab</translation>
+<translation id="5409605318138185493">{NUM_DAYS,plural, =1{Chrome didn't find known harmful software on your computer. Last checked: one day ago.}other{Chrome didn't find known harmful software on your computer. Last checked: {NUM_DAYS} days ago.}}</translation>
 <translation id="5430073640787465221">Your preferences file is corrupt or invalid.
 
 Google Chrome is unable to recover your settings.</translation>
@@ -198,6 +205,7 @@
 <translation id="6750954913813541382">To fix spelling errors, Chrome sends the text that you type in the browser to Google</translation>
 <translation id="677276454032249905">Exit Chrome anyway?</translation>
 <translation id="683440813066116847">Inbound rule for Google Chrome Canary to allow mDNS traffic.</translation>
+<translation id="6861451385429799394"><ph name="BEGIN_LINK" />Your administrator<ph name="END_LINK" /> has disabled Chrome's check for harmful software</translation>
 <translation id="6885412569789873916">Chrome Beta Apps</translation>
 <translation id="6943584222992551122">This person's browsing data will be deleted from this device. To recover the data, sign in to Chrome as <ph name="USER_EMAIL" />.</translation>
 <translation id="6967962315388095737">Inbound rule for Google Chrome Beta to allow mDNS traffic.</translation>
@@ -269,6 +277,7 @@
 <translation id="8834965163890861871">Google Chrome is trying to edit passwords. Type your Windows password to allow this.</translation>
 <translation id="884296878221830158">It also controls what page is shown when you start Chrome or click the Home button.</translation>
 <translation id="8862326446509486874">You do not have appropriate rights for system-level installation. Try running the installer again as Administrator.</translation>
+<translation id="8907906903932240086">Chrome can check your computer for harmful software</translation>
 <translation id="8914504000324227558">Relaunch Chrome</translation>
 <translation id="8922193594870374009">To send a number from <ph name="ORIGIN" /> to your Android phone, sign in to Chrome on both devices.</translation>
 <translation id="8999208279178790196">{0,plural, =0{A Chrome update is available}=1{A Chrome update is available}other{A Chrome update has been available for # days}}</translation>
@@ -276,6 +285,7 @@
 <translation id="9067395829937117663">Google Chrome requires Windows 7 or higher.</translation>
 <translation id="911206726377975832">Also delete your browsing data?</translation>
 <translation id="9138603949443464873">To apply your changes, relaunch Chrome</translation>
+<translation id="9155112650704618965">{NUM_HOURS,plural, =1{Chrome didn't find known harmful software on your computer. Last checked: 1 hour ago.}other{Chrome didn't find known harmful software on your computer. Last checked: {NUM_HOURS} hours ago.}}</translation>
 <translation id="919706545465235479">Update Chrome to start sync</translation>
 <translation id="989369509083708165">Google Chrome is your default browser</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb
index c4d7441..5ec4f29 100644
--- a/chrome/app/resources/google_chrome_strings_mn.xtb
+++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -33,7 +33,7 @@
 <translation id="1682634494516646069">Google Chrome нь өөрийн өгөгдлийн хадгалалтын сан руу уншуулж бас бичиж чадахгүй:
 
  <ph name="USER_DATA_DIRECTORY" /></translation>
-<translation id="1698376642261615901">Google Chrome нь вэб хуудсууд болон аппликейшнуудыг цахилгаан мэт хурдан ажиллуулдаг вэб хөтөч юм. Энэ нь хурдан, найдвартай мөн хэрэглэхэд хялбар. Google Chrome-д бий болгосон хорт вирус болон хууль бус үйлдлээс хамгаалах хамгаалалтаар дамжуулан вэб сайтуудад илүү аюулгүй хайлт хийгээрэй.</translation>
+<translation id="1698376642261615901">Google Chrome нь веб хуудсууд болон аппликейшнуудыг цахилгаан мэт хурдан ажиллуулдаг веб хөтөч юм. Энэ нь хурдан, найдвартай мөн хэрэглэхэд хялбар. Google Chrome-д бий болгосон хорт вирус болон хууль бус үйлдлээс хамгаалах хамгаалалтаар дамжуулан веб сайтуудад илүү аюулгүй хайлт хийгээрэй.</translation>
 <translation id="1713301662689114961">{0,plural, =1{Chrome-г 1 цагийн дотор дахин ажиллуулна}other{Chrome-г # цагийн дотор дахин ажиллуулна}}</translation>
 <translation id="1734234790201236882">Chrome энэ нууц үгийг таны Google Бүртгэлд хадгалах тул та үүнийг санах шаардлагагүй.</translation>
 <translation id="174539241580958092">Google Chrome нь нэвтрэх хэсэгт гарсан алдаатай холбоотойгоор таны өгөгдлийн тохиргоог хийж чадсангүй.</translation>
@@ -68,7 +68,7 @@
 <translation id="2665296953892887393">Google рүү эвдрэлийн тайлан болон <ph name="UMA_LINK" />-ыг илгээх замаар Google Chrome-ыг сайжруулахад туслаач</translation>
 <translation id="2689103672227170538">Энэ өргөтгөл нь таныг Chrome-г эхлүүлэх үед хуудсанд харагдах зүйлийг өөрчилсөн.</translation>
 <translation id="2765403129283291972">Энэ сайтыг ашиглахын тулд Chrome-д таны микрофонд хандах зөвшөөрөл шаардлагатай</translation>
-<translation id="2770231113462710648">Стандарт вэб хөтчийг дараах руу өөрчил:</translation>
+<translation id="2770231113462710648">Стандарт веб хөтчийг дараах руу өөрчил:</translation>
 <translation id="2775140325783767197">Chrome таны нууц үгсийг шалгах боломжгүй байна. Интернэт холболтоо шалгаж үзнэ үү.</translation>
 <translation id="2799223571221894425">Дахин эхлүүлэх</translation>
 <translation id="2847461019998147611">Google Chrome-г энэ хэлээр харуулах</translation>
@@ -133,10 +133,10 @@
 <translation id="4458462641685292929">Google Chrome-н өөр үйл ажиллагаа явагдаж байна. Дараа дахин оролдоно уу.</translation>
 <translation id="4480040274068703980">Таныг нэвтрэхэд алдаа гарсны улмаас Chrome-ийн үйлдлийн систем таны датаг синхрончлох боломжгүй байна.</translation>
 <translation id="4521185804071812304">Заавал биш: Оношилгоо болон ашиглалтын өгөгдлийг Google-д автоматаар илгээх замаар Chrome үйлдлийн системийн онцлогууд болон гүйцэтгэлийг сайжруулахад туслах.</translation>
-<translation id="4561051373932531560">Google Chrome нь танд вэб дээр утасны дугаараа хийж Skype-аар дуудлага хийх боломжийг олгоно.</translation>
+<translation id="4561051373932531560">Google Chrome нь танд веб дээр утасны дугаараа хийж Skype-аар дуудлага хийх боломжийг олгоно.</translation>
 <translation id="4567424176335768812">Та <ph name="USER_EMAIL_ADDRESS" /> ингэж нэвтэрсэн байна. Одоо та өөрийн нэвтэрсэн бүх төхөөрөмжүүд дээрээ хайлтын жагсаалт, түүх болон бусад тохиргоонууд руугаа нэвтэрч болно.</translation>
 <translation id="4571503333518166079">Chrome-н мэдэгдлийн тохиргоо хэсэгт очих</translation>
-<translation id="459622048091363950">Chrome-д хандалт олгосны дараа вэб сайтууд таны хандалтыг асуух боломжтой болно.</translation>
+<translation id="459622048091363950">Chrome-д хандалт олгосны дараа веб сайтууд таны хандалтыг асуух боломжтой болно.</translation>
 <translation id="4600710005438004015">Chrome-г хамгийн сүүлийн хувилбарт шинэчлээгүй тул та шинэ онцлог болон аюулгүй байдлын засвар авах боломжгүй байна.</translation>
 <translation id="4631713731678262610">Chrome-ын цэсэнд нуух</translation>
 <translation id="4633000520311261472">Chrome-ыг илүү аюулгүй болгохын тулд бид <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />-дахь жагсаалтанд ороогүй мөн танд мэдэгдэлгүйгээр нэмэгдсэн байж болох зарим нэг өргөтгөлүүдийг идэвхгүй болголоо.</translation>
@@ -147,7 +147,7 @@
 <translation id="479167709087336770">Энэ нь Google хайлтад ашигладаг зөв бичгийн ижил алдаа шалгагчийг ашигладаг. Таны хөтчид бичсэн текстийг Google-д илгээдэг. Та энэ ажиллах төлөвийг хүссэн үедээ тохиргоонд өөрчилж болно</translation>
 <translation id="4891791193823137474">Google Chrome-ыг энэ дэвсгэр дээр ажиллуулна уу</translation>
 <translation id="4895437082222824641">Холбоосыг шинэ Chrome-н чихтэй хуудсанд нээх</translation>
-<translation id="4953650215774548573">Google Chrome-ыг өөрийн анхдагч вэб хөтөч болгон тохируулна уу</translation>
+<translation id="4953650215774548573">Google Chrome-ыг өөрийн анхдагч веб хөтөч болгон тохируулна уу</translation>
 <translation id="495931528404527476">Chrome-д</translation>
 <translation id="4990567037958725628">Google Chrome цайвар шаргал өнгө</translation>
 <translation id="5062123544085870375">Chrome OS-г дахин эхлүүлэх</translation>
@@ -179,8 +179,8 @@
 <translation id="5867197326698922595">Google Chrome нь нууц үгсийг засах гэж оролдож байна.</translation>
 <translation id="5895138241574237353">Дахин асаах</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Сүлжээнд нэвтрэх</translation>
-<translation id="5940385492829620908">Таны вэб, хавчуурга, болон Chrome-ийн бусад зүйлс энд хадгалагддаг.</translation>
-<translation id="5941830788786076944">Google Chrome-ыг анхдагч вэб хөтөчөө болгоно уу</translation>
+<translation id="5940385492829620908">Таны веб, хавчуурга, болон Chrome-ийн бусад зүйлс энд хадгалагддаг.</translation>
+<translation id="5941830788786076944">Google Chrome-ыг анхдагч веб хөтөчөө болгоно уу</translation>
 <translation id="6070348360322141662">Таны аюулгүй байдлыг сайжруулахын тулд Google Chrome таны өгөгдлийг шифрлэнэ</translation>
 <translation id="6113794647360055231">Chrome илүү сайн боллоо</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 2c6e030..7ce1812 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -31,6 +31,7 @@
 import("//printing/buildflags/buildflags.gni")
 import("//rlz/buildflags/buildflags.gni")
 import("//sandbox/features.gni")
+import("//third_party/blink/public/public_features.gni")
 import("//third_party/protobuf/proto_library.gni")
 import("//third_party/webrtc/webrtc.gni")
 import("//third_party/widevine/cdm/widevine.gni")
@@ -77,6 +78,7 @@
   header = "buildflags.h"
   flags = [
     "ENABLE_KALEIDOSCOPE=$enable_kaleidoscope",
+    "USE_MINIKIN_HYPHENATION=$use_minikin_hyphenation",
     "USE_THIN_LTO=$use_thin_lto",
   ]
   if (is_win) {
@@ -6134,6 +6136,13 @@
   if (!is_android && !is_official_build) {
     deps += [ "//chrome/browser/ui/webui/new_tab_page/foo:mojo_bindings" ]
   }
+
+  if (use_minikin_hyphenation && !is_android) {
+    sources += [
+      "component_updater/hyphenation_component_installer.cc",
+      "component_updater/hyphenation_component_installer.h",
+    ]
+  }
 }
 
 if (is_android) {
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.cc b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
index 6ed1169..8ea0478 100644
--- a/chrome/browser/android/autofill_assistant/ui_controller_android.cc
+++ b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
@@ -49,6 +49,7 @@
 #include "components/autofill_assistant/browser/rectf.h"
 #include "components/autofill_assistant/browser/user_data.h"
 #include "components/autofill_assistant/browser/user_data_util.h"
+#include "components/autofill_assistant/browser/user_model.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/strings/grit/components_strings.h"
@@ -1715,8 +1716,10 @@
         env, jcontext, image.text_size(), 0);
 
     Java_AssistantOverlayModel_setOverlayImage(
-        env, GetOverlayModel(),
-        base::android::ConvertUTF8ToJavaString(env, image.image_url()),
+        env, GetOverlayModel(), jcontext,
+        ui_controller_android_utils::CreateJavaDrawable(
+            env, jcontext, image.image_drawable(),
+            ui_delegate_->GetUserModel()),
         image_size, top_margin, bottom_margin,
         base::android::ConvertUTF8ToJavaString(env, image.text()),
         ui_controller_android_utils::GetJavaColor(env, image.text_color()),
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d614030..7a0a164b 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -352,10 +352,10 @@
 #include "third_party/blink/public/common/loader/url_loader_throttle.h"
 #include "third_party/blink/public/common/switches.h"
 #include "third_party/blink/public/common/web_preferences/autoplay_policy.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
 #include "third_party/blink/public/mojom/site_engagement/site_engagement.mojom.h"
 #include "third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/widevine/cdm/buildflags.h"
 #include "ui/base/clipboard/clipboard_format_type.h"
@@ -3277,12 +3277,13 @@
       prefs->GetString(prefs::kAnimationPolicy);
   if (image_animation_policy == kAnimationPolicyOnce) {
     web_prefs->animation_policy =
-        blink::web_pref::kImageAnimationPolicyAnimateOnce;
+        blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce;
   } else if (image_animation_policy == kAnimationPolicyNone) {
     web_prefs->animation_policy =
-        blink::web_pref::kImageAnimationPolicyNoAnimation;
+        blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation;
   } else {
-    web_prefs->animation_policy = blink::web_pref::kImageAnimationPolicyAllowed;
+    web_prefs->animation_policy =
+        blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
   }
 #endif
 
diff --git a/chrome/browser/chromeos/crosapi/browser_util.cc b/chrome/browser/chromeos/crosapi/browser_util.cc
index ae4daeb2..db07e98 100644
--- a/chrome/browser/chromeos/crosapi/browser_util.cc
+++ b/chrome/browser/chromeos/crosapi/browser_util.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_paths.h"
+#include "chrome/common/pref_names.h"
 #include "chromeos/crosapi/cpp/crosapi_constants.h"
 #include "chromeos/crosapi/mojom/crosapi.mojom.h"
 #include "components/exo/shell_surface_util.h"
@@ -67,6 +68,7 @@
       metrics::prefs::kMetricsReportingEnabled);
 
   params->session_type = environment_provider->GetSessionType();
+  params->device_mode = environment_provider->GetDeviceMode();
   return params;
 }
 
@@ -104,19 +106,13 @@
   if (!IsUserTypeAllowed(user))
     return false;
 
-  const Profile* const profile =
-      chromeos::ProfileHelper::Get()->GetProfileByUser(user);
-  DCHECK(profile);
+  // TODO(https://crbug.com/1135494): Remove the free ticket for
+  // Channel::UNKNOWN after the policy is set on server side for developers.
+  if (channel == Channel::UNKNOWN)
+    return true;
 
-  // TODO(https://crbug.com/1135494): Disable Lacros for managed users that
-  // aren't @google using more robust mechanism.
-  if (profile->GetProfilePolicyConnector()->IsManaged()) {
-    const std::string canonical_email = user->GetAccountId().GetUserEmail();
-    if (!base::EndsWith(canonical_email, "@google.com",
-                        base::CompareCase::INSENSITIVE_ASCII)) {
-      return false;
-    }
-  }
+  if (!g_browser_process->local_state()->GetBoolean(prefs::kLacrosAllowed))
+    return false;
 
   switch (channel) {
     case Channel::UNKNOWN:
diff --git a/chrome/browser/chromeos/crosapi/browser_util_unittest.cc b/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
index db900a4c..9969f2d 100644
--- a/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
+++ b/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
@@ -4,10 +4,14 @@
 
 #include "chrome/browser/chromeos/crosapi/browser_util.h"
 
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/scoped_testing_local_state.h"
+#include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/account_id/account_id.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -22,7 +26,7 @@
 
 class LacrosUtilTest : public testing::Test {
  public:
-  LacrosUtilTest() = default;
+  LacrosUtilTest() : local_state_(TestingBrowserProcess::GetGlobal()) {}
   ~LacrosUtilTest() override = default;
 
   void SetUp() override {
@@ -47,6 +51,8 @@
   TestingProfile testing_profile_;
   chromeos::FakeChromeUserManager* fake_user_manager_ = nullptr;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
+
+  ScopedTestingLocalState local_state_;
 };
 
 TEST_F(LacrosUtilTest, ChannelTest) {
@@ -59,26 +65,20 @@
   EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::STABLE));
 }
 
-TEST_F(LacrosUtilTest, ManagedAccountGoogle) {
-  AddRegularUser("user@google.com");
+TEST_F(LacrosUtilTest, ManagedAccountLacrosAllowed) {
+  AddRegularUser("user@managedchrome.com");
   testing_profile_.GetProfilePolicyConnector()->OverrideIsManagedForTesting(
       true);
+  g_browser_process->local_state()->SetBoolean(prefs::kLacrosAllowed, true);
 
   EXPECT_TRUE(browser_util::IsLacrosAllowed(Channel::CANARY));
 }
 
-TEST_F(LacrosUtilTest, ManagedAccountFakeGoogle) {
-  AddRegularUser("user@thisisnotgoogle.com");
+TEST_F(LacrosUtilTest, ManagedAccountLacrosNotAllowed) {
+  AddRegularUser("user@managedchrome.com");
   testing_profile_.GetProfilePolicyConnector()->OverrideIsManagedForTesting(
       true);
-
-  EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::CANARY));
-}
-
-TEST_F(LacrosUtilTest, ManagedAccountNonGoogle) {
-  AddRegularUser("user@foople.com");
-  testing_profile_.GetProfilePolicyConnector()->OverrideIsManagedForTesting(
-      true);
+  g_browser_process->local_state()->SetBoolean(prefs::kLacrosAllowed, false);
 
   EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::CANARY));
 }
diff --git a/chrome/browser/chromeos/crosapi/environment_provider.cc b/chrome/browser/chromeos/crosapi/environment_provider.cc
index 1f1370c..28d1721 100644
--- a/chrome/browser/chromeos/crosapi/environment_provider.cc
+++ b/chrome/browser/chromeos/crosapi/environment_provider.cc
@@ -3,25 +3,56 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/chromeos/crosapi/environment_provider.h"
+
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profiles_state.h"
+#include "chromeos/tpm/install_attributes.h"
+#include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 
-crosapi::EnvironmentProvider::EnvironmentProvider() = default;
-crosapi::EnvironmentProvider::~EnvironmentProvider() = default;
+namespace crosapi {
 
-crosapi::mojom::SessionType crosapi::EnvironmentProvider::GetSessionType() {
+EnvironmentProvider::EnvironmentProvider() = default;
+EnvironmentProvider::~EnvironmentProvider() = default;
+
+mojom::SessionType EnvironmentProvider::GetSessionType() {
   const user_manager::User* const user =
       user_manager::UserManager::Get()->GetActiveUser();
   const Profile* const profile =
       chromeos::ProfileHelper::Get()->GetProfileByUser(user);
   if (profile->IsGuestSession()) {
-    return crosapi::mojom::SessionType::kGuestSession;
+    return mojom::SessionType::kGuestSession;
   }
   if (profiles::IsPublicSession()) {
-    return crosapi::mojom::SessionType::kPublicSession;
+    return mojom::SessionType::kPublicSession;
   }
-  return crosapi::mojom::SessionType::kRegularSession;
+  return mojom::SessionType::kRegularSession;
 }
+
+mojom::DeviceMode EnvironmentProvider::GetDeviceMode() {
+  policy::DeviceMode mode = chromeos::InstallAttributes::Get()->GetMode();
+  switch (mode) {
+    case policy::DEVICE_MODE_PENDING:
+      // "Pending" is an internal detail of InstallAttributes and doesn't need
+      // its own mojom value.
+      return mojom::DeviceMode::kNotSet;
+    case policy::DEVICE_MODE_NOT_SET:
+      return mojom::DeviceMode::kNotSet;
+    case policy::DEVICE_MODE_CONSUMER:
+      return mojom::DeviceMode::kConsumer;
+    case policy::DEVICE_MODE_ENTERPRISE:
+      return mojom::DeviceMode::kEnterprise;
+    case policy::DEVICE_MODE_ENTERPRISE_AD:
+      return mojom::DeviceMode::kEnterpriseActiveDirectory;
+    case policy::DEVICE_MODE_LEGACY_RETAIL_MODE:
+      return mojom::DeviceMode::kLegacyRetailMode;
+    case policy::DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH:
+      return mojom::DeviceMode::kConsumerKioskAutolaunch;
+    case policy::DEVICE_MODE_DEMO:
+      return mojom::DeviceMode::kDemo;
+  }
+}
+
+}  // namespace crosapi
diff --git a/chrome/browser/chromeos/crosapi/environment_provider.h b/chrome/browser/chromeos/crosapi/environment_provider.h
index 8c02e4a86..c90bb548 100644
--- a/chrome/browser/chromeos/crosapi/environment_provider.h
+++ b/chrome/browser/chromeos/crosapi/environment_provider.h
@@ -19,6 +19,7 @@
 
   // Virtual for tests.
   virtual crosapi::mojom::SessionType GetSessionType();
+  virtual crosapi::mojom::DeviceMode GetDeviceMode();
 };
 
 }  // namespace crosapi
diff --git a/chrome/browser/chromeos/crosapi/test_mojo_connection_manager.cc b/chrome/browser/chromeos/crosapi/test_mojo_connection_manager.cc
index 5799249..99bcc8e 100644
--- a/chrome/browser/chromeos/crosapi/test_mojo_connection_manager.cc
+++ b/chrome/browser/chromeos/crosapi/test_mojo_connection_manager.cc
@@ -28,6 +28,9 @@
   crosapi::mojom::SessionType GetSessionType() override {
     return crosapi::mojom::SessionType::kRegularSession;
   }
+  mojom::DeviceMode GetDeviceMode() override {
+    return crosapi::mojom::DeviceMode::kConsumer;
+  }
 };
 
 // TODO(crbug.com/1124494): Refactor the code to share with ARC.
diff --git a/chrome/browser/chromeos/file_manager/devtools_listener.cc b/chrome/browser/chromeos/file_manager/devtools_listener.cc
index 82d4e442..e702456 100644
--- a/chrome/browser/chromeos/file_manager/devtools_listener.cc
+++ b/chrome/browser/chromeos/file_manager/devtools_listener.cc
@@ -72,7 +72,7 @@
 }
 
 std::string DevToolsListener::HostString(content::DevToolsAgentHost* host,
-                                         const std::string& prefix = "") {
+                                         const std::string& prefix) {
   std::string result = base::StrCat(
       {prefix, " ", host->GetType(), " title: ", host->GetTitle()});
   std::string description = host->GetDescription();
diff --git a/chrome/browser/chromeos/file_manager/devtools_listener.h b/chrome/browser/chromeos/file_manager/devtools_listener.h
index 22bf9076..b9f73c6 100644
--- a/chrome/browser/chromeos/file_manager/devtools_listener.h
+++ b/chrome/browser/chromeos/file_manager/devtools_listener.h
@@ -42,7 +42,7 @@
   // Returns a string that uniquely identifies a host
   // with an optional prefix.
   static std::string HostString(content::DevToolsAgentHost* host,
-                                const std::string& prefix);
+                                const std::string& prefix = {});
 
  private:
   // Enable CDP on host.
diff --git a/chrome/browser/chromeos/file_manager/devtools_listener_browsertest.cc b/chrome/browser/chromeos/file_manager/devtools_listener_browsertest.cc
index 0c747437..464199f 100644
--- a/chrome/browser/chromeos/file_manager/devtools_listener_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/devtools_listener_browsertest.cc
@@ -3,16 +3,20 @@
 // found in the LICENSE file.
 
 #include <map>
+#include <memory>
 
 #include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
 #include "base/path_service.h"
 #include "base/process/process_handle.h"
+#include "base/threading/thread_restrictions.h"
 #include "chrome/browser/chromeos/file_manager/devtools_listener.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_observer.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -55,7 +59,7 @@
                                 base::TerminationStatus status) override {
     if (devtools_agent_.find(host) == devtools_agent_.end())
       return;
-    NOTREACHED();
+    LOG(FATAL) << "Host crashed: " << DevToolsListener::HostString(host);
   }
 
   void CollectCodeCoverage() {
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
index b78a746..8902562 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
@@ -94,7 +94,7 @@
     bool observe_file_tasks = true;
 
     // Whether test should enable sharesheet.
-    bool enable_sharesheet = false;
+    bool enable_sharesheet = true;
 
     // Whether test needs the single partition format feature.
     bool single_partition_format = false;
diff --git a/chrome/browser/chromeos/login/marketing_backend_connector.cc b/chrome/browser/chromeos/login/marketing_backend_connector.cc
index 7c43cd3..5047a08 100644
--- a/chrome/browser/chromeos/login/marketing_backend_connector.cc
+++ b/chrome/browser/chromeos/login/marketing_backend_connector.cc
@@ -54,6 +54,10 @@
                         const std::string& country) {
   base::UmaHistogramEnumeration(
       "OOBE.MarketingOptInScreen.BackendConnector." + country, event);
+
+  // Generic event aggregating data from all countries.
+  base::UmaHistogramEnumeration("OOBE.MarketingOptInScreen.BackendConnector",
+                                event);
 }
 
 std::unique_ptr<network::ResourceRequest> GetResourceRequest() {
diff --git a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc
index 49e39b2..2cc566e8 100644
--- a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc
+++ b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc
@@ -58,6 +58,8 @@
 
   base::UmaHistogramEnumeration("OOBE.MarketingOptInScreen.Event." + country,
                                 event);
+  // Generic event aggregating data from all countries.
+  base::UmaHistogramEnumeration("OOBE.MarketingOptInScreen.Event", event);
 }
 
 void RecordGeolocationResolve(MarketingOptInScreen::GeolocationEvent event) {
diff --git a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc
index ee61764..05b50dc 100644
--- a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc
@@ -408,12 +408,16 @@
   TapOnGetStartedAndWaitForScreenExit();
   WaitForBackendRequest();
   EXPECT_EQ(GetRequestedCountryCode(), param.country_code);
-  histogram_tester_.ExpectUniqueSample(
-      "OOBE.MarketingOptInScreen.Event." + std::string(param.country_code),
+  const auto event =
       (param.is_default_opt_in)
           ? MarketingOptInScreen::Event::kUserOptedInWhenDefaultIsOptIn
-          : MarketingOptInScreen::Event::kUserOptedInWhenDefaultIsOptOut,
-      1);
+          : MarketingOptInScreen::Event::kUserOptedInWhenDefaultIsOptOut;
+  histogram_tester_.ExpectUniqueSample(
+      "OOBE.MarketingOptInScreen.Event." + std::string(param.country_code),
+      event, 1);
+  // Expect a generic event in addition to the country specific one.
+  histogram_tester_.ExpectUniqueSample("OOBE.MarketingOptInScreen.Event", event,
+                                       1);
 
   // Expect successful geolocation resolve.
   ExpectGeolocationMetric(true, std::string(param.country_code).size());
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index e223ee6..b34887c 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -171,6 +171,7 @@
       ::prefs::kSystemTimezoneAutomaticDetectionPolicy,
       enterprise_management::SystemTimezoneProto::USERS_DECIDE);
   registry->RegisterStringPref(::prefs::kMinimumAllowedChromeVersion, "");
+  registry->RegisterBooleanPref(::prefs::kLacrosAllowed, true);
 
   ash::RegisterLocalStatePrefs(registry);
   split_settings_sync_field_trial::RegisterLocalStatePrefs(registry);
diff --git a/chrome/browser/component_updater/hyphenation_component_installer.cc b/chrome/browser/component_updater/hyphenation_component_installer.cc
new file mode 100644
index 0000000..d028f88
--- /dev/null
+++ b/chrome/browser/component_updater/hyphenation_component_installer.cc
@@ -0,0 +1,108 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/component_updater/hyphenation_component_installer.h"
+
+#include "base/files/file_util.h"
+#include "base/logging.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+
+using component_updater::ComponentUpdateService;
+
+namespace {
+
+// The SHA256 of the SubjectPublicKeyInfo used to sign the extension.
+// The extension id is: jamhcnnkihinmdlkakkaopbjbbcngflc
+constexpr uint8_t kHyphenationPublicKeySHA256[32] = {
+    0x90, 0xc7, 0x2d, 0xda, 0x87, 0x8d, 0xc3, 0xba, 0x0a, 0xa0, 0xef,
+    0x19, 0x11, 0x2d, 0x65, 0xb2, 0x04, 0xfc, 0x2e, 0x3e, 0xbb, 0x35,
+    0x85, 0xae, 0x64, 0xca, 0x07, 0x61, 0x15, 0x12, 0x9e, 0xbc};
+
+constexpr char kHyphenationManifestName[] = "Hyphenation";
+
+constexpr base::FilePath::CharType kHyphenationRelativeInstallDir[] =
+    FILE_PATH_LITERAL("hyphen-data");
+
+}  // namespace
+
+namespace component_updater {
+
+HyphenationComponentInstallerPolicy::HyphenationComponentInstallerPolicy() =
+    default;
+
+HyphenationComponentInstallerPolicy::~HyphenationComponentInstallerPolicy() =
+    default;
+
+bool HyphenationComponentInstallerPolicy::
+    SupportsGroupPolicyEnabledComponentUpdates() const {
+  // False since this is a data, non-binary component.
+  return false;
+}
+
+bool HyphenationComponentInstallerPolicy::RequiresNetworkEncryption() const {
+  // Update checks and pings associated with this component do not require
+  // confidentiality, since the component is identical for all users.
+  return false;
+}
+
+update_client::CrxInstaller::Result
+HyphenationComponentInstallerPolicy::OnCustomInstall(
+    const base::DictionaryValue& manifest,
+    const base::FilePath& install_dir) {
+  return update_client::CrxInstaller::Result(0);  // Nothing custom here.
+}
+
+void HyphenationComponentInstallerPolicy::OnCustomUninstall() {}
+
+void HyphenationComponentInstallerPolicy::ComponentReady(
+    const base::Version& version,
+    const base::FilePath& install_dir,
+    std::unique_ptr<base::DictionaryValue> manifest) {
+  VLOG(1) << "Hyphenation Component ready, version " << version.GetString()
+          << " in " << install_dir.value();
+  // TODO(kojii): Pass `install_dir` to `hyphenation_impl.cc`.
+}
+
+// Called during startup and installation before ComponentReady().
+bool HyphenationComponentInstallerPolicy::VerifyInstallation(
+    const base::DictionaryValue& manifest,
+    const base::FilePath& install_dir) const {
+  return true;
+}
+
+base::FilePath HyphenationComponentInstallerPolicy::GetRelativeInstallDir()
+    const {
+  return base::FilePath(kHyphenationRelativeInstallDir);
+}
+
+void HyphenationComponentInstallerPolicy::GetHash(
+    std::vector<uint8_t>* hash) const {
+  hash->assign(
+      kHyphenationPublicKeySHA256,
+      kHyphenationPublicKeySHA256 + base::size(kHyphenationPublicKeySHA256));
+}
+
+std::string HyphenationComponentInstallerPolicy::GetName() const {
+  return kHyphenationManifestName;
+}
+
+update_client::InstallerAttributes
+HyphenationComponentInstallerPolicy::GetInstallerAttributes() const {
+  return update_client::InstallerAttributes();
+}
+
+std::vector<std::string> HyphenationComponentInstallerPolicy::GetMimeTypes()
+    const {
+  return {};
+}
+
+void RegisterHyphenationComponent(ComponentUpdateService* cus) {
+  VLOG(1) << "Registering Hyphenation component.";
+  auto installer = base::MakeRefCounted<ComponentInstaller>(
+      std::make_unique<HyphenationComponentInstallerPolicy>());
+  installer->Register(cus, base::OnceClosure());
+}
+
+}  // namespace component_updater
diff --git a/chrome/browser/component_updater/hyphenation_component_installer.h b/chrome/browser/component_updater/hyphenation_component_installer.h
new file mode 100644
index 0000000..1c281c3
--- /dev/null
+++ b/chrome/browser/component_updater/hyphenation_component_installer.h
@@ -0,0 +1,60 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COMPONENT_UPDATER_HYPHENATION_COMPONENT_INSTALLER_H_
+#define CHROME_BROWSER_COMPONENT_UPDATER_HYPHENATION_COMPONENT_INSTALLER_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/values.h"
+#include "components/component_updater/component_installer.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace component_updater {
+
+class HyphenationComponentInstallerPolicy : public ComponentInstallerPolicy {
+ public:
+  HyphenationComponentInstallerPolicy();
+  ~HyphenationComponentInstallerPolicy() override;
+
+  HyphenationComponentInstallerPolicy(
+      const HyphenationComponentInstallerPolicy&) = delete;
+  HyphenationComponentInstallerPolicy operator=(
+      const HyphenationComponentInstallerPolicy&) = delete;
+
+ private:
+  // The following methods override ComponentInstallerPolicy.
+  bool SupportsGroupPolicyEnabledComponentUpdates() const override;
+  bool RequiresNetworkEncryption() const override;
+  update_client::CrxInstaller::Result OnCustomInstall(
+      const base::DictionaryValue& manifest,
+      const base::FilePath& install_dir) override;
+  void OnCustomUninstall() override;
+  bool VerifyInstallation(const base::DictionaryValue& manifest,
+                          const base::FilePath& install_dir) const override;
+  void ComponentReady(const base::Version& version,
+                      const base::FilePath& install_dir,
+                      std::unique_ptr<base::DictionaryValue> manifest) override;
+  base::FilePath GetRelativeInstallDir() const override;
+  void GetHash(std::vector<uint8_t>* hash) const override;
+  std::string GetName() const override;
+  update_client::InstallerAttributes GetInstallerAttributes() const override;
+  std::vector<std::string> GetMimeTypes() const override;
+};
+
+// Call once during startup to make the component update service aware of
+// the First-Party Sets component.
+void RegisterHyphenationComponent(ComponentUpdateService* cus);
+
+}  // namespace component_updater
+
+#endif  // CHROME_BROWSER_COMPONENT_UPDATER_HYPHENATION_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc
index 97a0dfd..9a3335a 100644
--- a/chrome/browser/component_updater/registration.cc
+++ b/chrome/browser/component_updater/registration.cc
@@ -9,6 +9,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/buildflags.h"
 #include "chrome/browser/component_updater/autofill_regex_component_installer.h"
 #include "chrome/browser/component_updater/autofill_states_component_installer.h"
 #include "chrome/browser/component_updater/crl_set_component_installer.h"
@@ -17,6 +18,7 @@
 #include "chrome/browser/component_updater/first_party_sets_component_installer.h"
 #include "chrome/browser/component_updater/floc_component_installer.h"
 #include "chrome/browser/component_updater/games_component_installer.h"
+#include "chrome/browser/component_updater/hyphenation_component_installer.h"
 #include "chrome/browser/component_updater/mei_preload_component_installer.h"
 #include "chrome/browser/component_updater/optimization_hints_component_installer.h"
 #include "chrome/browser/component_updater/origin_trials_component_installer.h"
@@ -193,6 +195,10 @@
   RegisterSmartDimComponent(cus);
 #endif  // !defined(OS_CHROMEOS)
 
+#if BUILDFLAG(USE_MINIKIN_HYPHENATION) && !defined(OS_ANDROID)
+  RegisterHyphenationComponent(cus);
+#endif
+
   RegisterZxcvbnDataComponent(cus);
 
   RegisterAutofillStatesComponent(cus, profile_prefs);
diff --git a/chrome/browser/extensions/process_management_browsertest.cc b/chrome/browser/extensions/process_management_browsertest.cc
index caee5a8..bae36c0 100644
--- a/chrome/browser/extensions/process_management_browsertest.cc
+++ b/chrome/browser/extensions/process_management_browsertest.cc
@@ -495,11 +495,18 @@
       content::SiteInstance::CreateForURL(context, gallery_url());
   EXPECT_TRUE(cws_site_instance->RequiresDedicatedProcess());
 
+  // Calculate an URL that is 1) relative to the fake (i.e. test-controlled)
+  // Chrome Web Store gallery URL and 2) resolves to something that
+  // embedded_test_server can actually serve (e.g. title1.html test file).
+  GURL::Replacements replace_path;
+  replace_path.SetPathStr("/title1.html");
+  GURL cws_web_url = gallery_url().ReplaceComponents(replace_path);
+
   // Navigate to Chrome Web Store and check that it's loaded successfully.
-  ui_test_utils::NavigateToURL(browser(), gallery_url());
+  ui_test_utils::NavigateToURL(browser(), cws_web_url);
   WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
-  EXPECT_EQ(gallery_url(), web_contents->GetLastCommittedURL());
+  EXPECT_EQ(cws_web_url, web_contents->GetLastCommittedURL());
 
   // Verify that the Chrome Web Store hosted app is really loaded.
   content::RenderProcessHost* render_process_host =
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 84c26c2..e39dc80 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -329,7 +329,7 @@
   {
     "name": "autofill-keyboard-accessory-view",
     "owners": [ "fhorschig@chromium.org" ],
-    "expiry_milestone": 87
+    "expiry_milestone": 90
   },
   {
     "name": "autofill-off-no-server-data",
@@ -1215,7 +1215,7 @@
   {
     "name": "enable-autofill-manual-fallback",
     "owners": [ "fhorschig@chromium.org" ],
-    "expiry_milestone": 87
+    "expiry_milestone": 90
   },
   {
     "name": "enable-autofill-password-reauth-ios",
@@ -2567,8 +2567,8 @@
   },
   {
     "name": "filling-passwords-from-any-origin",
-    "owners": [ "fhorschig" ],
-    "expiry_milestone": 87
+    "owners": [ "fhorschig", "redatawfik" ],
+    "expiry_milestone": 90
   },
   {
     "name": "focus-mode",
diff --git a/chrome/browser/media/history/media_history_browsertest.cc b/chrome/browser/media/history/media_history_browsertest.cc
index 99469da7..53eabf5 100644
--- a/chrome/browser/media/history/media_history_browsertest.cc
+++ b/chrome/browser/media/history/media_history_browsertest.cc
@@ -285,7 +285,8 @@
 
   void SimulateNavigationToCommit(Browser* browser) {
     // Navigate to trigger the session to be saved.
-    ui_test_utils::NavigateToURL(browser, embedded_test_server()->base_url());
+    ui_test_utils::NavigateToURL(browser,
+                                 embedded_test_server()->GetURL("/empty.html"));
 
     // Wait until the session has finished saving.
     WaitForDB(GetMediaHistoryService(browser));
diff --git a/chrome/browser/memory/oom_memory_details.cc b/chrome/browser/memory/oom_memory_details.cc
index 2c22d9b..81e0af8 100644
--- a/chrome/browser/memory/oom_memory_details.cc
+++ b/chrome/browser/memory/oom_memory_details.cc
@@ -36,10 +36,11 @@
   // diagnose user-reported problems with frequently discarded tabs.
   std::string log_string = ToLogString(/*include_tab_title=*/false);
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
-  base::SystemMemoryInfoKB memory;
-  if (base::GetSystemMemoryInfo(&memory) && memory.gem_size != -1) {
-    log_string += "Graphics ";
-    log_string += base::UTF16ToASCII(ui::FormatBytes(memory.gem_size));
+  base::GraphicsMemoryInfoKB gpu_meminfo;
+  if (base::GetGraphicsMemoryInfo(&gpu_meminfo)) {
+    log_string +=
+        "Graphics " +
+        base::UTF16ToASCII(ui::FormatBytes(gpu_meminfo.gpu_memory_size));
   }
 #endif
   LOG(WARNING) << title_ << " (" << delta.InMilliseconds() << " ms):\n"
diff --git a/chrome/browser/metrics/metrics_memory_details.cc b/chrome/browser/metrics/metrics_memory_details.cc
index 303a517..7396129 100644
--- a/chrome/browser/metrics/metrics_memory_details.cc
+++ b/chrome/browser/metrics/metrics_memory_details.cc
@@ -160,9 +160,11 @@
 #if defined(OS_CHROMEOS)
   // Chrome OS exposes system-wide graphics driver memory which has historically
   // been a source of leak/bloat.
-  base::SystemMemoryInfoKB meminfo;
-  if (base::GetSystemMemoryInfo(&meminfo) && meminfo.gem_size != -1)
-    UMA_HISTOGRAM_MEMORY_MB("Memory.Graphics", meminfo.gem_size / 1024 / 1024);
+  base::GraphicsMemoryInfoKB meminfo;
+  if (base::GetGraphicsMemoryInfo(&meminfo)) {
+    UMA_HISTOGRAM_MEMORY_MB("Memory.Graphics",
+                            meminfo.gpu_memory_size / 1024 / 1024);
+  }
 #endif
 
   UpdateSiteIsolationMetrics();
diff --git a/chrome/browser/net/chrome_accept_header_browsertest.cc b/chrome/browser/net/chrome_accept_header_browsertest.cc
index 3ba4488..5323b6b 100644
--- a/chrome/browser/net/chrome_accept_header_browsertest.cc
+++ b/chrome/browser/net/chrome_accept_header_browsertest.cc
@@ -57,11 +57,11 @@
   ASSERT_EQ(expected_plugin_accept_header, plugin_accept_header);
 
   const char* expected_favicon_accept_header =
-      "image/webp,image/apng,image/*,*/*;q=0.8";
+      "image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
 #if BUILDFLAG(ENABLE_AV1_DECODER)
   if (base::FeatureList::IsEnabled(blink::features::kAVIF)) {
     expected_favicon_accept_header =
-        "image/avif,image/webp,image/apng,image/*,*/*;q=0.8";
+        "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
   }
 #endif
   ASSERT_EQ(expected_favicon_accept_header, favicon_accept_header);
diff --git a/chrome/browser/password_check/android/java/res/layout/password_check_edit_fragment.xml b/chrome/browser/password_check/android/java/res/layout/password_check_edit_fragment.xml
index cc1a7a1..7376425 100644
--- a/chrome/browser/password_check/android/java/res/layout/password_check_edit_fragment.xml
+++ b/chrome/browser/password_check/android/java/res/layout/password_check_edit_fragment.xml
@@ -36,7 +36,8 @@
                 android:imeOptions="flagNoExtractUi"
                 android:inputType="text"
                 android:hint="@string/password_entry_viewer_site_title"
-                android:enabled="false"/>
+                android:enabled="false"
+                android:focusable="false"/>
         </com.google.android.material.textfield.TextInputLayout>
 
         <!-- Username -->
@@ -56,7 +57,8 @@
                 android:imeOptions="flagNoExtractUi"
                 android:inputType="text"
                 android:hint="@string/password_entry_viewer_username_title"
-                android:enabled="false"/>
+                android:enabled="false"
+                android:focusable="false"/>
         </com.google.android.material.textfield.TextInputLayout>
 
         <!-- Password -->
diff --git a/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckEditViewTest.java b/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckEditViewTest.java
index 0e339472..2818df9 100644
--- a/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckEditViewTest.java
+++ b/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckEditViewTest.java
@@ -10,10 +10,12 @@
 import static androidx.test.espresso.action.ViewActions.click;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
+import static androidx.test.espresso.matcher.ViewMatchers.isFocusable;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 
 import static junit.framework.Assert.assertTrue;
 
+import static org.hamcrest.CoreMatchers.allOf;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
@@ -123,6 +125,14 @@
 
     @Test
     @MediumTest
+    public void testSiteAndUsernameDisabled() {
+        onView(withId(R.id.site_edit)).check(matches(allOf(not(isEnabled()), not(isFocusable()))));
+        onView(withId(R.id.username_edit))
+                .check(matches(allOf(not(isEnabled()), not(isFocusable()))));
+    }
+
+    @Test
+    @MediumTest
     public void testSavesCredentialAndChangedPasswordInBundle() {
         // Change the password.
         final String newPassword = "NewPassword";
diff --git a/chrome/browser/password_manager/password_manager_test_base.cc b/chrome/browser/password_manager/password_manager_test_base.cc
index cc1851b..ec5ab47 100644
--- a/chrome/browser/password_manager/password_manager_test_base.cc
+++ b/chrome/browser/password_manager/password_manager_test_base.cc
@@ -16,6 +16,7 @@
 #include "base/optional.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/password_manager/account_password_store_factory.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -28,6 +29,7 @@
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/password_manager/core/browser/password_manager_test_utils.h"
 #include "components/password_manager/core/browser/test_password_store.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 #include "components/sync/driver/test_sync_service.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_details.h"
@@ -491,12 +493,23 @@
 
 // static
 void PasswordManagerBrowserTestBase::WaitForPasswordStore(Browser* browser) {
-  scoped_refptr<password_manager::PasswordStore> password_store =
+  scoped_refptr<password_manager::PasswordStore> profile_password_store =
       PasswordStoreFactory::GetForProfile(browser->profile(),
                                           ServiceAccessType::IMPLICIT_ACCESS);
-  PasswordStoreResultsObserver syncer;
-  password_store->GetAllLoginsWithAffiliationAndBrandingInformation(&syncer);
-  syncer.WaitForResults();
+  PasswordStoreResultsObserver profile_syncer;
+  profile_password_store->GetAllLoginsWithAffiliationAndBrandingInformation(
+      &profile_syncer);
+  profile_syncer.WaitForResults();
+
+  scoped_refptr<password_manager::PasswordStore> account_password_store =
+      AccountPasswordStoreFactory::GetForProfile(
+          browser->profile(), ServiceAccessType::IMPLICIT_ACCESS);
+  if (account_password_store) {
+    PasswordStoreResultsObserver account_syncer;
+    account_password_store->GetAllLoginsWithAffiliationAndBrandingInformation(
+        &account_syncer);
+    account_syncer.WaitForResults();
+  }
 }
 
 content::WebContents* PasswordManagerBrowserTestBase::WebContents() const {
@@ -673,11 +686,33 @@
                 // considered enabled.
                 ProfileSyncServiceFactory::GetInstance()->SetTestingFactory(
                     context, base::BindRepeating(&BuildTestSyncService));
+
                 PasswordStoreFactory::GetInstance()->SetTestingFactory(
                     context,
                     base::BindRepeating(&password_manager::BuildPasswordStore<
                                         content::BrowserContext,
                                         password_manager::TestPasswordStore>));
+
+                if (base::FeatureList::IsEnabled(
+                        password_manager::features::
+                            kEnablePasswordsAccountStorage)) {
+                  AccountPasswordStoreFactory::GetInstance()->SetTestingFactory(
+                      context,
+                      base::BindRepeating(
+                          &password_manager::BuildPasswordStoreWithArgs<
+                              content::BrowserContext,
+                              password_manager::TestPasswordStore,
+                              password_manager::IsAccountStore>,
+                          password_manager::IsAccountStore(true)));
+                } else {
+                  AccountPasswordStoreFactory::GetInstance()->SetTestingFactory(
+                      context,
+                      base::BindRepeating(
+                          [](content::BrowserContext* context)
+                              -> scoped_refptr<RefcountedKeyedService> {
+                            return nullptr;
+                          }));
+                }
               }));
 }
 
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
index a97d228..21c925f8 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -64,7 +63,6 @@
 #endif
 
 using ::testing::_;
-using web_app::ProviderType;
 
 namespace {
 
@@ -2544,7 +2542,7 @@
 };
 
 // Show/hide pwa page and check that Auto Picture-in-Picture is triggered.
-IN_PROC_BROWSER_TEST_P(WebAppPictureInPictureWindowControllerBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppPictureInPictureWindowControllerBrowserTest,
                        AutoPictureInPicture) {
   InstallAndLaunchPWA(main_url());
   bool result = false;
@@ -2572,7 +2570,7 @@
 
 // Show pwa page and check that Auto Picture-in-Picture is not triggered if
 // document is not inside the scope specified in the Web App Manifest.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     WebAppPictureInPictureWindowControllerBrowserTest,
     AutoPictureInPictureNotTriggeredIfDocumentNotInWebAppScope) {
   // We open a web app with a different scope
@@ -2605,7 +2603,7 @@
 
 // Show pwa page and check that Auto Picture-in-Picture is not triggered if
 // video is not playing.
-IN_PROC_BROWSER_TEST_P(WebAppPictureInPictureWindowControllerBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppPictureInPictureWindowControllerBrowserTest,
                        AutoPictureInPictureNotTriggeredIfVideoNotPlaying) {
   InstallAndLaunchPWA(main_url());
   ASSERT_TRUE(content::ExecuteScript(web_contents(),
@@ -2631,7 +2629,7 @@
 
 // Check that Auto Picture-in-Picture is not triggered if there's already a
 // video in Picture-in-Picture.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     WebAppPictureInPictureWindowControllerBrowserTest,
     AutoPictureInPictureWhenPictureInPictureWindowAlreadyVisible) {
   InstallAndLaunchPWA(main_url());
@@ -2668,7 +2666,7 @@
 
 // Check that video does not leave Picture-in-Picture automatically when it
 // doesn't have the Auto Picture-in-Picture attribute set.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     WebAppPictureInPictureWindowControllerBrowserTest,
     AutoPictureInPictureNotTriggeredOnPageShownIfNoAttribute) {
   InstallAndLaunchPWA(main_url());
@@ -2709,7 +2707,7 @@
 // TODO(http://crbug/1001249): flaky.
 // Check that Auto Picture-in-Picture applies only to the video element whose
 // autoPictureInPicture attribute was set most recently
-IN_PROC_BROWSER_TEST_P(WebAppPictureInPictureWindowControllerBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppPictureInPictureWindowControllerBrowserTest,
                        DISABLED_AutoPictureInPictureAttributeApplies) {
   InstallAndLaunchPWA(main_url());
   bool result = false;
@@ -2788,7 +2786,7 @@
 
 // Check that video does not leave Picture-in-Picture automatically when it
 // not the most recent element with the Auto Picture-in-Picture attribute set.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     WebAppPictureInPictureWindowControllerBrowserTest,
     AutoPictureInPictureNotTriggeredOnPageShownIfNotEnteredAutoPictureInPicture) {
   InstallAndLaunchPWA(main_url());
@@ -2831,7 +2829,7 @@
 
 // Check that video with no audio that is paused when hidden is still eligible
 // to enter Auto Picture-in-Picture and resumes playback.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     WebAppPictureInPictureWindowControllerBrowserTest,
     AutoPictureInPictureTriggeredOnPageHiddenIfVideoPausedWhenHidden) {
   InstallAndLaunchPWA(main_url());
@@ -3016,9 +3014,3 @@
             content::TitleWatcher(active_web_contents, expected_title)
                 .WaitAndGetTitle());
 }
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppPictureInPictureWindowControllerBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index bbaef0f..c6037af 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -17,6 +17,7 @@
 #include "base/values.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/browser/chromeos/login/login_pref_names.h"
 #include "chrome/browser/net/disk_cache_dir_policy_handler.h"
 #include "chrome/browser/net/referrer_policy_policy_handler.h"
@@ -1337,6 +1338,13 @@
     first_run::kCCTToSDialogEnabled,
     base::Value::Type::BOOLEAN },
 #endif  // defined(OS_ANDROID)
+
+#if BUILDFLAG(IS_ASH)
+  { key::kLacrosAllowed,
+    prefs::kLacrosAllowed,
+    base::Value::Type::BOOLEAN },
+#endif  // BUILDFLAG(IS_ASH)
+
 };
 // clang-format on
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index c32620a..79e853c 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1065,8 +1065,6 @@
   profile_prefs->ClearPref(
       kDataReductionProxySavingsClearedNegativeSystemClock);
 
-  // Added 10/2019.
-  syncer::DeviceInfoPrefs::MigrateRecentLocalCacheGuidsPref(profile_prefs);
 #if defined(OS_CHROMEOS)
   // Added 10/2019.
   profile_prefs->ClearPref(kDisplayRotationAcceleratorDialogHasBeenAccepted);
diff --git a/chrome/browser/referrer_policy_browsertest.cc b/chrome/browser/referrer_policy_browsertest.cc
index f364e47..fea03e1a 100644
--- a/chrome/browser/referrer_policy_browsertest.cc
+++ b/chrome/browser/referrer_policy_browsertest.cc
@@ -540,7 +540,8 @@
       blink::WebMouseEvent::Button::kLeft, EXPECT_ORIGIN_AS_REFERRER);
 
   // Navigate to C.
-  ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL("/"));
+  ui_test_utils::NavigateToURL(browser(),
+                               embedded_test_server()->GetURL("/title1.html"));
 
   base::string16 expected_title =
       GetExpectedTitle(start_url, EXPECT_ORIGIN_AS_REFERRER);
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
index 05eea50..c7906c2 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
@@ -68,6 +68,7 @@
 <translation id="1383876407941801731">Search</translation>
 <translation id="1396114365388024581">tablst</translation>
 <translation id="1405567553485452995">Light green</translation>
+<translation id="141454040365657399">Page header</translation>
 <translation id="1417889266572670458">Navy</translation>
 <translation id="1431911867058218151">Plum</translation>
 <translation id="1439316808600711881">rgn</translation>
@@ -348,6 +349,7 @@
 <translation id="3549141990712742152">cut <ph name="TEXT" />.</translation>
 <translation id="3549680091535286226">Tap with 2 fingers to temporarily stop speech</translation>
 <translation id="3564729643041517261">Current display style is side by side</translation>
+<translation id="3573145950452451508">Page footer</translation>
 <translation id="3587482841069643663">All</translation>
 <translation id="3589661172894441357">Glossary</translation>
 <translation id="3591784666823501596">Royal Blue</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb
index a8428e0..112874b 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb
@@ -529,7 +529,7 @@
 <translation id="5020651427400641814">Ярианы бүртгэлийг идэвхжүүлэх</translation>
 <translation id="5041394372352067729">Брайлийн дэлгэцийг хуудасны дээд хэсэгт шилжүүлэх</translation>
 <translation id="5042770794184672516">Ярианы түвшинг нэмэгдүүлэх</translation>
-<translation id="5042992464904238023">Вэб контент</translation>
+<translation id="5042992464904238023">Веб контент</translation>
 <translation id="5050015258024679800">Өмнөх түвшингийн 4 гарчиг</translation>
 <translation id="5054047268577924192">Өмнөх жагсаалтын зүйлс</translation>
 <translation id="5085453135206054947">Бүдэг хөх ягаан</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
index b065295..bb25120 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
@@ -270,7 +270,7 @@
 <translation id="3070245424257836917">Uchta barmoq bilan tepaga suring</translation>
 <translation id="3078345202707391975">Keyingi ikkinchi darajali sarlavha</translation>
 <translation id="3078740164268491126">jadval</translation>
-<translation id="3082249673510793544">Orqaga o‘tkazish</translation>
+<translation id="3082249673510793544">Orqaga varaqlash</translation>
 <translation id="3084806535845658316">ovozsiz</translation>
 <translation id="3086746722712840547">note</translation>
 <translation id="3090227230165225418">Yuklanma bildirishnomalari xabar qilinsin</translation>
@@ -447,7 +447,7 @@
 <translation id="4372705107434148843">Nutqni to‘xtatish</translation>
 <translation id="4376316291247992553">Grafik elementlarni Brayl yozuviga o‘tkazish</translation>
 <translation id="437809255587011096">Matn bezaklari aytilsin</translation>
-<translation id="4378308539633073595">Oldinga o‘tkazish</translation>
+<translation id="4378308539633073595">Oldinga varaqlash</translation>
 <translation id="4384583879834880242">Savol-javoblar</translation>
 <translation id="4391478986194775161">cntntinfo</translation>
 <translation id="4402014469255336455">Yorqin moviy</translation>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.js
index 5fa05d41..7ef5955 100644
--- a/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.js
+++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.js
@@ -150,6 +150,7 @@
     this.$['third-party-dialog'].setAttribute(
         'aria-label', data['thirdPartyTitle']);
     this.$['title-text'].textContent = data['thirdPartyTitle'];
+    this.$['next-button'].labelForAria = data['thirdPartyContinueButton'];
     this.$['next-button-text'].textContent = data['thirdPartyContinueButton'];
     this.$['footer-text'].innerHTML =
         this.sanitizer_.sanitizeHtml(data['thirdPartyFooter']);
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js
index 6e28ca8..4e8539a 100644
--- a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js
+++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js
@@ -265,7 +265,9 @@
     this.$['title-text'].textContent = data['valuePropTitle'];
     this.$['intro-text'].textContent = data['valuePropIntro'];
     this.$['user-name'].textContent = data['valuePropIdentity'];
+    this.$['next-button'].labelForAria = data['valuePropNextButton'];
     this.$['next-button-text'].textContent = data['valuePropNextButton'];
+    this.$['skip-button'].labelForAria = data['valuePropSkipButton'];
     this.$['skip-button-text'].textContent = data['valuePropSkipButton'];
     this.$['footer-text'].innerHTML =
         this.sanitizer_.sanitizeHtml(data['valuePropFooter']);
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_buttons.html b/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
index d0c1c57..e4a8209 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
@@ -41,7 +41,8 @@
     <oobe-icon-button inverse text-key="oobeOKButtonText">
     </oobe-icon-button>
 
-  Button text can be also changed by specifying element for "text" slot.
+  Button text can be also changed by specifying element for "text" slot, but
+  will have to define label-for-aria in such case.
 
   Attributes:
     'disabled' - button is disabled when the attribute is set.
@@ -51,6 +52,8 @@
     'border' - adds border to the button.
     'label-for-aria' - accessibility label, override usual behavior
                        (string specified by text-key is used as aria-label).
+                       Elements that use slot="text" must provide label-for-aria
+                       value.
 -->
 <dom-module id="oobe-text-button">
   <template>
@@ -84,7 +87,8 @@
 
     or
 
-    <oobe-back-button on-click="handleOnClick_">
+    <oobe-back-button on-click="handleOnClick_"
+        label-for-aria="[[i18nDynamic(locale, 'continueButton')]]">
       <div slot="text">[[i18nDynamic(locale, 'continueButton')]]</div>
     </oobe-back-button>
 
@@ -92,6 +96,10 @@
     'disabled' - button is disabled when the attribute is set.
     (See crbug.com/900640)
     'text-key' - ID of localized string to be used as button text.
+    'label-for-aria' - accessibility label, override usual behavior
+                       (string specified by text-key is used as aria-label).
+                       Elements that use slot="text" must provide label-for-aria
+                       value.
 -->
 <dom-module id="oobe-back-button">
   <template>
@@ -142,7 +150,8 @@
 
     or
 
-    <oobe-welcome-secondary-button icon="close">
+    <oobe-welcome-secondary-button icon="close"
+        label-for-aria="[[i18nDynamic(locale, 'offlineLoginCloseBtn')]]">
       <div slot="text">[[i18nDynamic(locale, 'offlineLoginCloseBtn')]]</div>
     </oobe-welcome-secondary-button>
 
@@ -152,7 +161,9 @@
       'icon1x' - a name of icon from material design set to show on button.
       'icon2x' - a name of icon from material design set to show on button.
     'label-for-aria' - accessibility label, override usual behavior
-                       (string specified by text-key  is used as aria-label).
+                       (string specified by text-key is used as aria-label).
+                       Elements that use slot="text" must provide label-for-aria
+                       value.
 -->
 <dom-module id="oobe-welcome-secondary-button">
   <template>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_buttons.js b/chrome/browser/resources/chromeos/login/components/oobe_buttons.js
index 001e1d98..df9407ff 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_buttons.js
+++ b/chrome/browser/resources/chromeos/login/components/oobe_buttons.js
@@ -73,9 +73,13 @@
       value: 'back',
     },
 
+    labelForAria: {
+      type: String,
+    },
+
     labelForAria_: {
       type: String,
-      computed: 'i18nDynamic(locale, textKey)',
+      computed: 'ariaLabel_(labelForAria, locale, textKey)',
     },
   },
 
@@ -92,6 +96,13 @@
       e.stopPropagation();
     }
   },
+
+  ariaLabel_(labelForAria, locale, textKey) {
+    if ((typeof labelForAria !== 'undefined') && (labelForAria !== '')) {
+      return labelForAria;
+    }
+    return this.i18n(textKey);
+  },
 });
 
 Polymer({
@@ -109,9 +120,13 @@
       value: 'next',
     },
 
+    labelForAria: {
+      type: String,
+    },
+
     labelForAria_: {
       type: String,
-      computed: 'i18nDynamic(locale, textKey)',
+      computed: 'ariaLabel_(labelForAria, locale, textKey)',
     },
   },
 
@@ -122,7 +137,14 @@
   onClick_(e) {
     if (this.disabled)
       e.stopPropagation();
-  }
+  },
+
+  ariaLabel_(labelForAria, locale, textKey) {
+    if ((typeof labelForAria !== 'undefined') && (labelForAria !== '')) {
+      return labelForAria;
+    }
+    return this.i18n(textKey);
+  },
 });
 
 Polymer({
diff --git a/chrome/browser/resources/chromeos/login/sync_consent.html b/chrome/browser/resources/chromeos/login/sync_consent.html
index 6e68cdd3..f0debe7 100644
--- a/chrome/browser/resources/chromeos/login/sync_consent.html
+++ b/chrome/browser/resources/chromeos/login/sync_consent.html
@@ -61,8 +61,11 @@
         </cr-checkbox>
       </div>
       <div slot="bottom-buttons" class="layout horizontal end-justified">
-        <oobe-text-button id="settingsSaveAndContinueButton" on-tap="onSettingsSaveAndContinue_" class="focus-on-show"
-          inverse>
+        <oobe-text-button class="focus-on-show" inverse
+            id="settingsSaveAndContinueButton"
+            on-tap="onSettingsSaveAndContinue_"
+            label-for-aria="[[i18nDynamic(locale,
+                                          'syncConsentAcceptAndContinue')]]">
           <div slot="text" consent-description consent-confirmation>
             [[i18nDynamic(locale, 'syncConsentAcceptAndContinue')]]
           </div>
@@ -133,13 +136,17 @@
         </div>
       </div>
       <div slot="bottom-buttons" class="layout horizontal end-justified">
-        <oobe-text-button id="declineButton" on-tap="onDeclineTap_">
+        <oobe-text-button id="declineButton" on-tap="onDeclineTap_"
+            label-for-aria="[[i18nDynamic(locale,
+                                          'syncConsentScreenDecline')]]">
           <div slot="text" consent-description consent-confirmation>
             [[i18nDynamic(locale, 'syncConsentScreenDecline')]]
           </div>
         </oobe-text-button>
         <oobe-text-button id="acceptButton" on-tap="onAcceptTap_"
-          class="focus-on-show" inverse>
+            class="focus-on-show" inverse
+            label-for-aria="[[i18nDynamic(locale,
+                                          'syncConsentScreenAccept')]]">
           <div slot="text" consent-description consent-confirmation>
             [[i18nDynamic(locale, 'syncConsentScreenAccept')]]
           </div>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
index 2aacc9d..d8aab1a 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -17,6 +17,8 @@
     ":multidevice_smartlock_subpage",
     ":multidevice_subpage",
     ":multidevice_tether_item",
+    ":multidevice_wifi_sync_disabled_link",
+    ":multidevice_wifi_sync_item",
   ]
 }
 
@@ -114,6 +116,7 @@
     ":multidevice_browser_proxy",
     ":multidevice_constants",
     ":multidevice_feature_behavior",
+    ":multidevice_wifi_sync_item",
     "..:deep_linking_behavior",
     "..:os_route",
     "..:os_settings_routes",
@@ -137,6 +140,32 @@
   extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
 }
 
+js_library("multidevice_wifi_sync_item") {
+  deps = [
+    ":multidevice_feature_behavior",
+    ":multidevice_feature_item",
+    ":multidevice_wifi_sync_disabled_link",
+    "..:os_route",
+    "..:route_origin_behavior",
+    "../..:router",
+    "../../people_page:sync_browser_proxy",
+    "../os_people_page:os_sync_browser_proxy",
+    "//ui/webui/resources/js:i18n_behavior",
+    "//ui/webui/resources/js:load_time_data",
+    "//ui/webui/resources/js:web_ui_listener_behavior",
+  ]
+}
+
+js_library("multidevice_wifi_sync_disabled_link") {
+  deps = [
+    ":multidevice_feature_behavior",
+    "..:os_route",
+    "..:route_origin_behavior",
+    "../..:router",
+    "//ui/webui/resources/js:i18n_behavior",
+  ]
+}
+
 js_type_check("closure_compile_module") {
   is_polymer3 = true
   deps = [
@@ -151,6 +180,8 @@
     ":multidevice_smartlock_subpage.m",
     ":multidevice_subpage.m",
     ":multidevice_tether_item.m",
+    ":multidevice_wifi_sync_disabled_link.m",
+    ":multidevice_wifi_sync_item.m",
   ]
 }
 
@@ -268,6 +299,7 @@
   deps = [
     ":multidevice_browser_proxy.m",
     ":multidevice_constants.m",
+    ":multidevice_wifi_sync_item.m",
     "..:deep_linking_behavior.m",
     "..:os_route.m",
     "..:os_settings_routes.m",
@@ -292,6 +324,39 @@
   extra_deps = [ ":multidevice_tether_item_module" ]
 }
 
+js_library("multidevice_wifi_sync_item.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.m.js" ]
+  deps = [
+    ":multidevice_feature_behavior.m",
+    ":multidevice_feature_item.m",
+    ":multidevice_wifi_sync_disabled_link.m",
+    "..:os_route.m",
+    "..:route_origin_behavior.m",
+    "../..:router.m",
+    "../../people_page:sync_browser_proxy.m",
+    "../os_people_page:os_sync_browser_proxy.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:i18n_behavior.m",
+    "//ui/webui/resources/js:load_time_data.m",
+    "//ui/webui/resources/js:web_ui_listener_behavior.m",
+  ]
+  extra_deps = [ ":multidevice_wifi_sync_item_module" ]
+}
+
+js_library("multidevice_wifi_sync_disabled_link.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.m.js" ]
+  deps = [
+    ":multidevice_feature_behavior.m",
+    "..:os_route.m",
+    "..:route_origin_behavior.m",
+    "../..:router.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:i18n_behavior.m",
+    "//ui/webui/resources/js:load_time_data.m",
+  ]
+  extra_deps = [ ":multidevice_wifi_sync_disabled_link_module" ]
+}
+
 group("polymer3_elements") {
   public_deps = [
     ":modulize",
@@ -303,6 +368,8 @@
     ":multidevice_smartlock_subpage_module",
     ":multidevice_subpage_module",
     ":multidevice_tether_item_module",
+    ":multidevice_wifi_sync_disabled_link_module",
+    ":multidevice_wifi_sync_item_module",
   ]
 }
 
@@ -383,6 +450,24 @@
   auto_imports = os_settings_auto_imports
 }
 
+polymer_modulizer("multidevice_wifi_sync_item") {
+  js_file = "multidevice_wifi_sync_item.js"
+  html_file = "multidevice_wifi_sync_item.html"
+  html_type = "dom-module"
+  migrated_imports = os_settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
+}
+
+polymer_modulizer("multidevice_wifi_sync_disabled_link") {
+  js_file = "multidevice_wifi_sync_disabled_link.js"
+  html_file = "multidevice_wifi_sync_disabled_link.html"
+  html_type = "dom-module"
+  migrated_imports = os_settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
+}
+
 js_modulizer("modulize") {
   input_files = [
     "multidevice_browser_proxy.js",
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html
index 5cb65c7..3a7e91d 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.html
@@ -41,11 +41,13 @@
         </slot>
         <div id="item-text-container" class="middle">
           <div id="featureName">[[getFeatureName(feature)]]</div>
-          <settings-localized-link
-              class="secondary"
-              id="featureSecondary"
-              localized-string="[[getFeatureSummaryHtml(feature)]]">
-          </settings-localized-link>
+          <slot name="feature-summary">
+            <settings-localized-link
+                class="secondary"
+                id="featureSecondary"
+                localized-string="[[getFeatureSummaryHtml(feature)]]">
+            </settings-localized-link>
+          </slot>
         </div>
         <template is="dom-if"
                   if="[[hasSubpageClickHandler_(
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html
index fc0fc6db8..1fda23e 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.html
@@ -19,6 +19,7 @@
 <link rel="import" href="multidevice_feature_item.html">
 <link rel="import" href="multidevice_feature_toggle.html">
 <link rel="import" href="multidevice_tether_item.html">
+<link rel="import" href="multidevice_wifi_sync_item.html">
 
 <dom-module id="settings-multidevice-subpage">
   <template>
@@ -151,11 +152,9 @@
             if="[[isFeatureSupported(
                 MultiDeviceFeature.WIFI_SYNC, pageContentData)]]"
             restamp>
-          <settings-multidevice-feature-item id="wifiSyncItem"
-              feature="[[MultiDeviceFeature.WIFI_SYNC]]"
-              page-content-data="[[pageContentData]]"
-              deep-link-focus-id$="[[Setting.kWifiSyncOnOff]]">
-          </settings-multidevice-feature-item>
+          <settings-multidevice-wifi-sync-item id="wifiSyncItem"
+              page-content-data="[[pageContentData]]"">
+          </settings-multidevice-wifi-sync-item>
         </template>
       </div>
     </template>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.html
new file mode 100644
index 0000000..3e8e9919
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.html
@@ -0,0 +1,19 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="multidevice_feature_behavior.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/html/load_time_data.html">
+<link rel="import" href="../os_route.html">
+<link rel="import" href="../os_settings_routes.html">
+<link rel="import" href="../../router.html">
+<link rel="import" href="../../settings_shared_css.html">
+
+<dom-module id="settings-multidevice-wifi-sync-disabled-link">
+  <template>
+    <style include="settings-shared"></style>
+    <div id="container"
+        inner-h-t-m-l="[[getAriaLabelledContent_()]]">
+    </div>
+  </template>
+  <script src="multidevice_wifi_sync_disabled_link.js"></script>
+</dom-module>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
new file mode 100644
index 0000000..a45a364
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
@@ -0,0 +1,71 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview 'settings-multidevice-wifi-sync-disabled-link' creates a
+ * localized string with accessibility labels for the Wifi Sync feature when
+ * the prerequisite Chrome Sync setting is not enabled.
+ *
+ * The localized string is treated as a special case for accessibility
+ * labelling since it contains two links, one to the Chrome Sync dependency
+ * and the other to a Learn More page for Wifi Sync.
+ */
+Polymer({
+  is: 'settings-multidevice-wifi-sync-disabled-link',
+
+  behaviors: [
+    MultiDeviceFeatureBehavior,
+  ],
+
+  getAriaLabelledContent_() {
+    const tempEl = document.createElement('div');
+    tempEl.innerHTML = this.i18nAdvanced(
+        'multideviceEnableWifiSyncV1ItemSummary', {attrs: ['id']});
+
+    tempEl.childNodes.forEach((node, index) => {
+      // Text nodes should be aria-hidden
+      if (node.nodeType == Node.TEXT_NODE) {
+        const spanNode = document.createElement('span');
+        spanNode.textContent = node.textContent;
+        spanNode.id = `id${index}`;
+        spanNode.setAttribute('aria-hidden', true);
+        node.replaceWith(spanNode);
+        return;
+      }
+    });
+
+    const chromeSyncLink = tempEl.querySelector('#chromeSyncLink');
+    const learnMoreLink = tempEl.querySelector('#learnMoreLink');
+
+    chromeSyncLink.setAttribute(
+        'aria-label', this.i18n('multideviceWifiSyncChromeSyncLabel'));
+    learnMoreLink.setAttribute(
+        'aria-label', this.i18n('multideviceWifiSyncLearnMoreLabel'));
+    chromeSyncLink.href = '#';
+
+    return tempEl.innerHTML;
+  },
+
+  /** @override */
+  attached() {
+    const chromeSyncLink = this.$$('#chromeSyncLink');
+    if (chromeSyncLink) {
+      chromeSyncLink.addEventListener(
+          'click', this.onChromeSyncLinkClick_.bind(this));
+    }
+  },
+
+  /**
+   * @param {!Event} event
+   * @private
+   */
+  onChromeSyncLinkClick_(event) {
+    event.preventDefault();
+    if (loadTimeData.getBoolean('splitSettingsSyncEnabled')) {
+      settings.Router.getInstance().navigateTo(settings.routes.OS_SYNC);
+    } else {
+      settings.Router.getInstance().navigateTo(settings.routes.SYNC_ADVANCED);
+    }
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.html
new file mode 100644
index 0000000..1c88195
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.html
@@ -0,0 +1,40 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="multidevice_feature_behavior.html">
+<link rel="import" href="multidevice_feature_item.html">
+<link rel="import" href="multidevice_wifi_sync_disabled_link.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/html/load_time_data.html">
+<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
+<link rel="import" href="../../settings_shared_css.html">
+<link rel="import" href="../os_people_page/os_sync_browser_proxy.html">
+<link rel="import" href="../../people_page/sync_browser_proxy.html">
+
+<dom-module id="settings-multidevice-wifi-sync-item">
+  <template>
+    <style include="settings-shared"></style>
+    <settings-multidevice-feature-item id="wifiSyncItem"
+        feature="[[MultiDeviceFeature.WIFI_SYNC]]"
+        page-content-data="[[pageContentData]]"
+        deep-link-focus-id$="[[Setting.kWifiSyncOnOff]]">
+      <template is="dom-if" if="[[!isWifiSyncV1Enabled_]]" restamp>
+        <settings-multidevice-wifi-sync-disabled-link
+            class="secondary"
+            id="featureSecondary"
+            slot="feature-summary">
+        </settings-multidevice-wifi-sync-disabled-link>
+        <!-- Replace the standard feature-controller with an always disabled
+          cr-toggle when Chrome Sync is disabled. When Chrome Sync is enabled
+          the standard feature-controller is used. This is done to avoid adding
+          extra logic in the standard feature-controller to keep the toggle
+          unchecked when Chrome Sync is on but Wifi Sync host is enabled on the
+          backend -->
+        <cr-toggle disabled="true"
+            slot="feature-controller">
+        </cr-toggle>
+      </template>
+    </settings-multidevice-feature-item>
+  </template>
+  <script src="multidevice_wifi_sync_item.js"></script>
+</dom-module>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
new file mode 100644
index 0000000..98e0a7c9
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
@@ -0,0 +1,78 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview 'settings-multidevice-wifi-sync-item' encapsulates special
+ * logic for the wifi sync item used in the multidevice subpage.
+ *
+ * Wifi sync depends on Chrome Sync being activated. This component uses sync
+ * proxies from the people page to check whether chrome sync is enabled.
+ *
+ * If it is enabled the multidevice feature item is used in the standard way,
+ * otherwise the feature-controller and localized-link slots are overridden with
+ * a disabled toggle and the wifi sync localized string component that is a
+ * special case containing two links.
+ */
+Polymer({
+  is: 'settings-multidevice-wifi-sync-item',
+
+  behaviors: [
+    MultiDeviceFeatureBehavior,
+    WebUIListenerBehavior,
+  ],
+
+  properties: {
+    /** @private */
+    isWifiSyncV1Enabled_: Boolean,
+  },
+
+  /** @private {?settings.OsSyncBrowserProxy} */
+  osSyncBrowserProxy_: null,
+
+  /** @private {?settings.SyncBrowserProxy} */
+  syncBrowserProxy_: null,
+
+  /** @override */
+  attached() {
+    if (loadTimeData.getBoolean('splitSettingsSyncEnabled')) {
+      this.addWebUIListener(
+          'os-sync-prefs-changed', this.handleOsSyncPrefsChanged_.bind(this));
+      this.osSyncBrowserProxy_.sendOsSyncPrefsChanged();
+    } else {
+      this.addWebUIListener(
+          'sync-prefs-changed', this.handleSyncPrefsChanged_.bind(this));
+      this.syncBrowserProxy_.sendSyncPrefsChanged();
+    }
+  },
+
+  /** @override */
+  created() {
+    if (loadTimeData.getBoolean('splitSettingsSyncEnabled')) {
+      this.osSyncBrowserProxy_ = settings.OsSyncBrowserProxyImpl.getInstance();
+    } else {
+      this.syncBrowserProxy_ = settings.SyncBrowserProxyImpl.getInstance();
+    }
+  },
+
+  /**
+   * Handler for when the sync preferences are updated.
+   * @param {!settings.SyncPrefs} syncPrefs
+   * @private
+   */
+  handleSyncPrefsChanged_(syncPrefs) {
+    this.isWifiSyncV1Enabled_ =
+        !!syncPrefs && syncPrefs.wifiConfigurationsSynced;
+  },
+
+  /**
+   * Handler for when os sync preferences are updated.
+   * @param {!settings.OsSyncPrefs} osSyncPrefs
+   * @param {!boolean} osSyncFeatureEnabled
+   * @private
+   */
+  handleOsSyncPrefsChanged_(osSyncFeatureEnabled, osSyncPrefs) {
+    this.isWifiSyncV1Enabled_ = osSyncFeatureEnabled && !!osSyncPrefs &&
+        osSyncPrefs.osWifiConfigurationsSynced;
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 81fd9ae..450dbb9 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -131,7 +131,7 @@
                              "chrome/browser/resources/settings/lifetime_browser_proxy.html|LifetimeBrowserProxy,LifetimeBrowserProxyImpl",
                              "chrome/browser/resources/settings/people_page/account_manager_browser_proxy.html|AccountManagerBrowserProxy,AccountManagerBrowserProxyImpl,Account",
                              "chrome/browser/resources/settings/people_page/profile_info_browser_proxy.html|ProfileInfoBrowserProxyImpl,ProfileInfoBrowserProxy,ProfileInfo",
-                             "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncBrowserProxy,StatusAction,SyncStatus",
+                             "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncBrowserProxy,StatusAction,SyncStatus,SyncPrefs",
                              "chrome/browser/resources/settings/route.html|routes",
                              "chrome/browser/resources/settings/router.html|Router,Route,RouteObserverBehavior",
                              "chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.html|SearchEngine,SearchEnginesBrowserProxy,SearchEnginesBrowserProxyImpl",
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.js b/chrome/browser/resources/settings/chromeos/os_settings.js
index 4d55144..0102cf1 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings.js
@@ -59,6 +59,7 @@
 export {getReceiveManager, observeReceiveManager, setReceiveManagerForTesting} from './nearby_share_page/nearby_share_receive_manager.m.js';
 export {dataUsageStringToEnum, NearbyShareDataUsage} from './nearby_share_page/types.m.js';
 export {KerberosAccountsBrowserProxyImpl, KerberosConfigErrorCode, KerberosErrorType} from './os_people_page/kerberos_accounts_browser_proxy.m.js';
+export {OsSyncBrowserProxyImpl} from './os_people_page/os_sync_browser_proxy.m.js';
 export {OsResetBrowserProxyImpl} from './os_reset_page/os_reset_browser_proxy.m.js';
 export {routes} from './os_route.m.js';
 export {ParentalControlsBrowserProxy, ParentalControlsBrowserProxyImpl} from './parental_controls_page/parental_controls_browser_proxy.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp b/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
index 6170453..044b62e 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
+++ b/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
@@ -668,6 +668,16 @@
            use_base_dir="false"
            compress="false"
            type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_multidevice_wifi_sync_item_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_MULTIDEVICE_WIFI_SYNC_DISABLED_LINK_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
   <include name="IDR_OS_SETTINGS_MULTIDEVICE_SMARTLOCK_SUBPAGE_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.m.js"
            use_base_dir="false"
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index dc8177b..6a682ea 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -1358,6 +1358,18 @@
       <structure name="IDR_OS_SETTINGS_MULTIDEVICE_TETHER_ITEM_JS"
                  file="chromeos/multidevice_page/multidevice_tether_item.js"
                  compress="false" type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_multidevice_wifi_sync_item_HTML"
+                 file="chromeos/multidevice_page/multidevice_wifi_sync_item.html"
+                 compress="false" type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_multidevice_wifi_sync_item_JS"
+                 file="chromeos/multidevice_page/multidevice_wifi_sync_item.js"
+                 compress="false" type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_MULTIDEVICE_WIFI_SYNC_DISABLED_LINK_HTML"
+                 file="chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.html"
+                 compress="false" type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_MULTIDEVICE_WIFI_SYNC_DISABLED_LINK_JS"
+                 file="chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js"
+                 compress="false" type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_NEARBY_SHARE_CONFIRM_PAGE_HTML"
                  file="chromeos/nearby_share_page/nearby_share_confirm_page.html"
                  compress="false" type="chrome_html" />
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/BUILD.gn b/chrome/browser/resources/signin/dice_web_signin_intercept/BUILD.gn
index 46ceef9..a3ddf2e 100644
--- a/chrome/browser/resources/signin/dice_web_signin_intercept/BUILD.gn
+++ b/chrome/browser/resources/signin/dice_web_signin_intercept/BUILD.gn
@@ -18,7 +18,6 @@
     ":dice_web_signin_intercept_browser_proxy",
     "//third_party/polymer/v3_0/components-chromium/iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/js:load_time_data.m",
     "//ui/webui/resources/js:web_ui_listener_behavior.m",
   ]
 }
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html
index e09c30c..135eb2b 100644
--- a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html
+++ b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html
@@ -116,9 +116,9 @@
 <div class="action-container">
   <cr-button id="acceptButton" class="action-button" on-click="onAccept_"
       autofocus>
-    $i18n{diceWebSigninInterceptAcceptLabel}
+    [[interceptionParameters_.confirmButtonLabel]]
   </cr-button>
   <cr-button id="cancelButton" on-click="onCancel_">
-    $i18n{diceWebSigninInterceptCancelLabel}
+    [[interceptionParameters_.cancelButtonLabel]]
   </cr-button>
 </div>
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js
index fb8426f52..79ed250 100644
--- a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js
+++ b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js
@@ -7,9 +7,7 @@
 import './signin_icons.js';
 import './signin_shared_css.js';
 import './signin_vars_css.js';
-import './strings.m.js';
 
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_browser_proxy.js b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_browser_proxy.js
index 8b2f622..b58a78e 100644
--- a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_browser_proxy.js
+++ b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_browser_proxy.js
@@ -22,6 +22,8 @@
  *   headerText: string,
  *   bodyTitle: string,
  *   bodyText: string,
+ *   confirmButtonLabel: string,
+ *   cancelButtonLabel: string,
  *   headerTextColor: string,
  *   headerBackgroundColor: string,
  *   interceptedAccount: AccountInfo,
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html
index 2c995fae..1e4678d 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.html
@@ -1,4 +1,4 @@
-<style include="profile-picker-shared">
+<style include="profile-picker-shared cr-hidden-style">
   :host {
     --avatar-icon-size: 74px;
     --banner-img-height: 400px;
@@ -118,10 +118,6 @@
     padding-inline-start: 5px;
   }
 
-  cr-checkbox[hidden] {
-    display: none;
-  }
-
   @media (prefers-color-scheme: dark) {
     #leftBanner {
       background: url(images/dark_mode_left_banner_image.svg);
@@ -147,45 +143,41 @@
   }
 </style>
 
-<template is="dom-if" if="[[profilesList_]]">
-  <div id="leftBanner" class="banner"></div>
-  <div class="title-container">
-    <img id="product-logo" on-click="onProductLogoTap_"
-        srcset="chrome://theme/current-channel-logo@1x 1x,
-                chrome://theme/current-channel-logo@2x 2x"
-        role="presentation">
-    <h2>$i18n{mainViewTitle}</h2>
-    <h3>$i18n{mainViewSubtitle}</h3>
-  </div>
-  <div id="wrapper">
-    <div class="profiles-container">
-      <template is="dom-repeat"
-          hidden="[[!profilesList_]]" items="[[profilesList_]]">
-        <profile-card
-            class="profile-item" profile-state="[[item]]">
-        </profile-card>
-      </template>
-      <div id="addProfile" class="profile-item">
-        <div class="profile-card-info">$i18n{addSpaceButton}</div>
-        <cr-icon-button iron-icon="profiles:add"
-            on-click="onAddProfileClick_" aria-label$="$i18n{addSpaceButton}">
-        </cr-icon-button>
-        <!-- Empty div to maintain alignment with other profile cards. -->
-        <div class="profile-card-info"></div>
-      </div>
+<div id="leftBanner" class="banner"></div>
+<div class="title-container">
+  <img id="product-logo" on-click="onProductLogoTap_"
+      srcset="chrome://theme/current-channel-logo@1x 1x,
+              chrome://theme/current-channel-logo@2x 2x"
+      role="presentation">
+  <h2>$i18n{mainViewTitle}</h2>
+  <h3>$i18n{mainViewSubtitle}</h3>
+</div>
+<div id="wrapper" hidden$="[[!profilesListLoaded_]]">
+  <div class="profiles-container">
+    <template is="dom-repeat" items="[[profilesList_]]">
+      <profile-card
+          class="profile-item" profile-state="[[item]]">
+      </profile-card>
+    </template>
+    <div id="addProfile" class="profile-item">
+      <div class="profile-card-info">$i18n{addSpaceButton}</div>
+      <cr-icon-button iron-icon="profiles:add"
+          on-click="onAddProfileClick_" aria-label$="$i18n{addSpaceButton}">
+      </cr-icon-button>
+      <!-- Empty div to maintain alignment with other profile cards. -->
+      <div class="profile-card-info"></div>
     </div>
   </div>
-  <div id="rightBanner" class="banner"></div>
+</div>
+<div id="rightBanner" class="banner"></div>
 
-  <div class="footer">
-    <cr-button id="browseAsGuestButton" on-click="onLaunchGuestProfileClick_">
-      <iron-icon icon="profiles:account-circle"></iron-icon>
-      <div>$i18n{browseAsGuestButton}</div>
-    </cr-button>
-    <cr-checkbox checked="{{askOnStartup_}}"
-        on-change="onAskOnStartupChangedByUser_"
-        hidden="[[shouldHideAskOnStartup_(profilesList_.length)]]">
-      $i18n{askOnStartupCheckboxText}
-    </cr-checkbox>
-  </div>
-</template>
+<div class="footer">
+  <cr-button id="browseAsGuestButton" on-click="onLaunchGuestProfileClick_">
+    <iron-icon icon="profiles:account-circle"></iron-icon>
+    <div>$i18n{browseAsGuestButton}</div>
+  </cr-button>
+  <cr-checkbox checked="{{askOnStartup_}}"
+      on-change="onAskOnStartupChangedByUser_" hidden$="[[hideAskOnStartup_]]">
+    $i18n{askOnStartupCheckboxText}
+  </cr-checkbox>
+</div>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
index 4236106..928e79f6 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
+++ b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.js
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
 import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
@@ -9,11 +10,11 @@
 import './icons.js';
 import './profile_card.js';
 import './profile_picker_shared_css.js';
+import './strings.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import './strings.js';
 
 import {ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl, ProfileState} from './manage_profiles_browser_proxy.js';
 import {navigateTo, NavigationBehavior, Routes} from './navigation_behavior.js';
@@ -33,6 +34,21 @@
      */
     profilesList_: {
       type: Object,
+      value: () => [],
+    },
+
+    /** @private */
+    profilesListLoaded_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    hideAskOnStartup_: {
+      type: Boolean,
+      value: true,
+      computed: 'computeHideAskOnStartup_(profilesList_.length)',
+
     },
 
     /** @private */
@@ -88,6 +104,7 @@
    * @private
    */
   handleProfilesListChanged_(profilesList) {
+    this.profilesListLoaded_ = true;
     this.profilesList_ = profilesList;
   },
 
@@ -131,7 +148,7 @@
    * @return boolean
    * @private
    */
-  shouldHideAskOnStartup_() {
+  computeHideAskOnStartup_() {
     return !this.profilesList_ || (this.profilesList_.length < 2);
   },
 });
diff --git a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html
index 328bfda..2141cd97 100644
--- a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html
+++ b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation.html
@@ -16,6 +16,7 @@
         }
       }
     </style>
+    <title>$i18n{syncConfirmationTitle}</title>
   </head>
   <body>
     <sync-confirmation-app></sync-confirmation-app>
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc
index 1a9f3dc..170e14f 100644
--- a/chrome/browser/search/local_ntp_source.cc
+++ b/chrome/browser/search/local_ntp_source.cc
@@ -114,7 +114,7 @@
 } kResources[] = {
     {"animations.css", IDR_LOCAL_NTP_ANIMATIONS_CSS, "text/css"},
     {"animations.js", IDR_LOCAL_NTP_ANIMATIONS_JS, "application/javascript"},
-    {"assert.js", IDR_WEBUI_JS_ASSERT, "application/javascript"},
+    {"assert.js", IDR_WEBUI_JS_ASSERT_JS, "application/javascript"},
     {"local-ntp-common.css", IDR_LOCAL_NTP_COMMON_CSS, "text/css"},
     {"customize.css", IDR_LOCAL_NTP_CUSTOMIZE_CSS, "text/css"},
     {"customize.js", IDR_LOCAL_NTP_CUSTOMIZE_JS, "application/javascript"},
@@ -140,7 +140,7 @@
     // added complexity.
     {chrome::kChromeSearchLocalNtpBackgroundFilename, kLocalResource,
      "image/jpg"},
-    {omnibox::kGoogleGIconResourceName, IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G,
+    {omnibox::kGoogleGIconResourceName, IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G_PNG,
      "image/png"},
     {omnibox::kBookmarkIconResourceName, IDR_LOCAL_NTP_ICONS_BOOKMARK,
      "image/svg+xml"},
@@ -169,7 +169,7 @@
     {omnibox::kExtensionAppIconResourceName, IDR_LOCAL_NTP_ICONS_EXTENSION_APP,
      "image/svg+xml"},
     {omnibox::kPageIconResourceName, IDR_LOCAL_NTP_ICONS_PAGE, "image/svg+xml"},
-    {omnibox::kSearchIconResourceName, IDR_WEBUI_IMAGES_ICON_SEARCH,
+    {omnibox::kSearchIconResourceName, IDR_WEBUI_IMAGES_ICON_SEARCH_SVG,
      "image/svg+xml"},
     {omnibox::kTrendingUpIconResourceName, IDR_LOCAL_NTP_ICONS_TRENDING_UP,
      "image/svg+xml"},
diff --git a/chrome/browser/search/most_visited_iframe_source.cc b/chrome/browser/search/most_visited_iframe_source.cc
index 43eab4be..7aa5ccb 100644
--- a/chrome/browser/search/most_visited_iframe_source.cc
+++ b/chrome/browser/search/most_visited_iframe_source.cc
@@ -109,7 +109,7 @@
   } else if (path == kLocalNTPUtilsJSPath) {
     SendResource(IDR_LOCAL_NTP_UTILS_JS, std::move(callback));
   } else if (path == kAssertJsPath) {
-    SendResource(IDR_WEBUI_JS_ASSERT, std::move(callback));
+    SendResource(IDR_WEBUI_JS_ASSERT_JS, std::move(callback));
   } else {
     std::move(callback).Run(nullptr);
   }
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
index 1ede35f..4d640202 100644
--- a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc
@@ -10,9 +10,6 @@
 #include "base/check.h"
 #include "base/time/default_clock.h"
 #include "base/values.h"
-#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
 #include "components/content_settings/core/browser/content_settings_constraints.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings.h"
@@ -43,16 +40,15 @@
     SubresourceFilterContentSettingsManager::kMaxPersistMetadataDuration;
 
 SubresourceFilterContentSettingsManager::
-    SubresourceFilterContentSettingsManager(Profile* profile)
-    : settings_map_(HostContentSettingsMapFactory::GetForProfile(profile)),
+    SubresourceFilterContentSettingsManager(
+        HostContentSettingsMap* settings_map,
+        history::HistoryService* history_service)
+    : settings_map_(settings_map),
       clock_(std::make_unique<base::DefaultClock>(base::DefaultClock())),
       should_use_smart_ui_(ShouldUseSmartUI()) {
-  DCHECK(profile);
   DCHECK(settings_map_);
-  if (auto* history_service = HistoryServiceFactory::GetForProfile(
-          profile, ServiceAccessType::EXPLICIT_ACCESS)) {
+  if (history_service)
     history_observer_.Add(history_service);
-  }
 }
 
 SubresourceFilterContentSettingsManager::
diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h
index a722bf3..6bef2860 100644
--- a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h
+++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h
@@ -18,12 +18,15 @@
 
 class GURL;
 class HostContentSettingsMap;
-class Profile;
 
 namespace base {
 class DictionaryValue;
 }  // namespace base
 
+namespace history {
+class HistoryService;
+}
+
 // This class contains helpers to get/set content and website settings related
 // to subresource filtering.
 //
@@ -65,7 +68,9 @@
 class SubresourceFilterContentSettingsManager
     : public history::HistoryServiceObserver {
  public:
-  explicit SubresourceFilterContentSettingsManager(Profile* profile);
+  SubresourceFilterContentSettingsManager(
+      HostContentSettingsMap* settings_map,
+      history::HistoryService* history_service);
   ~SubresourceFilterContentSettingsManager() override;
 
   ContentSetting GetSitePermission(const GURL& url) const;
diff --git a/chrome/browser/subresource_filter/subresource_filter_profile_context.cc b/chrome/browser/subresource_filter/subresource_filter_profile_context.cc
index 9d348ed..b944ba3 100644
--- a/chrome/browser/subresource_filter/subresource_filter_profile_context.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_profile_context.cc
@@ -8,9 +8,12 @@
 #include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h"
 
 SubresourceFilterProfileContext::SubresourceFilterProfileContext(
-    Profile* profile)
+    HostContentSettingsMap* settings_map,
+    history::HistoryService* history_service)
     : settings_manager_(
-          std::make_unique<SubresourceFilterContentSettingsManager>(profile)),
+          std::make_unique<SubresourceFilterContentSettingsManager>(
+              settings_map,
+              history_service)),
       ads_intervention_manager_(
           std::make_unique<AdsInterventionManager>(settings_manager_.get())) {}
 
diff --git a/chrome/browser/subresource_filter/subresource_filter_profile_context.h b/chrome/browser/subresource_filter/subresource_filter_profile_context.h
index c8836d7..b2ab890 100644
--- a/chrome/browser/subresource_filter/subresource_filter_profile_context.h
+++ b/chrome/browser/subresource_filter/subresource_filter_profile_context.h
@@ -10,14 +10,19 @@
 #include "base/macros.h"
 #include "components/keyed_service/core/keyed_service.h"
 
-class Profile;
+class HostContentSettingsMap;
 class SubresourceFilterContentSettingsManager;
 class AdsInterventionManager;
 
+namespace history {
+class HistoryService;
+}
+
 // This class holds profile scoped context for subresource filtering.
 class SubresourceFilterProfileContext : public KeyedService {
  public:
-  explicit SubresourceFilterProfileContext(Profile* profile);
+  SubresourceFilterProfileContext(HostContentSettingsMap* settings_map,
+                                  history::HistoryService* history_service);
   ~SubresourceFilterProfileContext() override;
 
   SubresourceFilterContentSettingsManager* settings_manager() {
diff --git a/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.cc b/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.cc
index f172958..a098b062 100644
--- a/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.cc
@@ -5,6 +5,8 @@
 #include "chrome/browser/subresource_filter/subresource_filter_profile_context_factory.h"
 
 #include "base/memory/singleton.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/subresource_filter/subresource_filter_profile_context.h"
@@ -27,11 +29,19 @@
 SubresourceFilterProfileContextFactory::SubresourceFilterProfileContextFactory()
     : BrowserContextKeyedServiceFactory(
           "SubresourceFilterProfileContext",
-          BrowserContextDependencyManager::GetInstance()) {}
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(HostContentSettingsMapFactory::GetInstance());
+  DependsOn(HistoryServiceFactory::GetInstance());
+}
 
 KeyedService* SubresourceFilterProfileContextFactory::BuildServiceInstanceFor(
-    content::BrowserContext* profile) const {
-  return new SubresourceFilterProfileContext(static_cast<Profile*>(profile));
+    content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
+
+  return new SubresourceFilterProfileContext(
+      HostContentSettingsMapFactory::GetForProfile(profile),
+      HistoryServiceFactory::GetForProfile(profile,
+                                           ServiceAccessType::EXPLICIT_ACCESS));
 }
 
 content::BrowserContext*
diff --git a/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.h b/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.h
index 1392563..c2d3953 100644
--- a/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.h
+++ b/chrome/browser/subresource_filter/subresource_filter_profile_context_factory.h
@@ -25,7 +25,7 @@
 
  private:
   KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* profile) const override;
+      content::BrowserContext* context) const override;
 
   content::BrowserContext* GetBrowserContextToUse(
       content::BrowserContext* context) const override;
diff --git a/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc b/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
index 622e2c3d..96cfe78 100644
--- a/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
+++ b/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
@@ -36,6 +36,7 @@
   path = path.AppendASCII(name);
 
   base::DictionaryValue value;
+  value.SetInteger(keys::kManifestVersion, 2);
   value.SetString(keys::kVersion, "1.0.0.0");
   value.SetString(keys::kName, name);
   std::string error;
@@ -51,8 +52,12 @@
 template <class T>
 void FireBookmarksApiEvent(
     const scoped_refptr<Extension>& extension, int repeats) {
-  scoped_refptr<T> bookmarks_function(new T());
+  scoped_refptr<extensions::BookmarksFunction> bookmarks_function(new T());
+  bookmarks_function->set_histogram_value(T::histogram_value());
   bookmarks_function->SetName(T::function_name());
+  // |bookmarks_function| won't be run, just passed to Notify(), so calling
+  // ignore_did_respond_for_testing() is needed to avoid a DCHECK failure.
+  bookmarks_function->ignore_did_respond_for_testing();
   for (int i = 0; i < repeats; i++) {
     content::NotificationService::current()->Notify(
         extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
@@ -83,14 +88,11 @@
   const std::string& id2_;
 };
 
-// NOTE: The tests below are DISABLED because they're flaky:
-// https://code.google.com/p/chromium/issues/detail?id=172002
-
 // Fire some mutating bookmark API events with extension 1, then fire
 // some mutating and non-mutating bookmark API events with extension
 // 2.  Only the mutating events should be recorded by the
 // syncer::ExtensionsActivityMonitor.
-TEST_F(SyncChromeExtensionsActivityMonitorTest, DISABLED_Basic) {
+TEST_F(SyncChromeExtensionsActivityMonitorTest, Basic) {
   FireBookmarksApiEvent<extensions::BookmarksRemoveFunction>(extension1_, 1);
   FireBookmarksApiEvent<extensions::BookmarksMoveFunction>(extension1_, 1);
   FireBookmarksApiEvent<extensions::BookmarksUpdateFunction>(extension1_, 2);
@@ -121,7 +123,7 @@
 // get the records, fire some more mutating and non-mutating events,
 // and put the old records back.  Those should be merged with the new
 // records correctly.
-TEST_F(SyncChromeExtensionsActivityMonitorTest, DISABLED_Put) {
+TEST_F(SyncChromeExtensionsActivityMonitorTest, Put) {
   FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(extension1_, 5);
   FireBookmarksApiEvent<extensions::BookmarksMoveFunction>(extension2_, 8);
 
@@ -151,7 +153,7 @@
 // Fire some mutating bookmark API events and get the records multiple
 // times.  The mintor should correctly clear its records every time
 // they're returned.
-TEST_F(SyncChromeExtensionsActivityMonitorTest, DISABLED_MultiGet) {
+TEST_F(SyncChromeExtensionsActivityMonitorTest, MultiGet) {
   FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(extension1_, 5);
 
   syncer::ExtensionsActivity::Records results;
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index 1b55ad1..648a799 100644
--- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "build/build_config.h"
 #include "chrome/common/buildflags.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/sync/base/model_type.h"
@@ -93,8 +92,7 @@
     datatypes.push_back(syncer::EXTENSIONS);
     datatypes.push_back(syncer::EXTENSION_SETTINGS);
     datatypes.push_back(syncer::APP_SETTINGS);
-    if (base::FeatureList::IsEnabled(features::kDesktopPWAsWithoutExtensions))
-      datatypes.push_back(syncer::WEB_APPS);
+    datatypes.push_back(syncer::WEB_APPS);
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 #if !defined(OS_ANDROID)
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc
index 042cf7d..132b28e 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -1248,12 +1248,12 @@
 ServerBookmarksEqualityChecker::ServerBookmarksEqualityChecker(
     syncer::ProfileSyncService* service,
     fake_server::FakeServer* fake_server,
-    const std::vector<ExpectedBookmark>& expected_bookmarks,
+    std::vector<ExpectedBookmark> expected_bookmarks,
     syncer::Cryptographer* cryptographer)
     : SingleClientStatusChangeChecker(service),
       fake_server_(fake_server),
       cryptographer_(cryptographer),
-      expected_bookmarks_(expected_bookmarks) {}
+      expected_bookmarks_(std::move(expected_bookmarks)) {}
 
 bool ServerBookmarksEqualityChecker::IsExitConditionSatisfied(
     std::ostream* os) {
@@ -1293,6 +1293,7 @@
                      [actual_specifics](const ExpectedBookmark& bookmark) {
                        return actual_specifics.legacy_canonicalized_title() ==
                                   bookmark.title &&
+                              actual_specifics.full_title() == bookmark.title &&
                               actual_specifics.url() == bookmark.url;
                      });
     if (it != expected.end()) {
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.h b/chrome/browser/sync/test/integration/bookmarks_helper.h
index ac352c162..4cf0d94 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.h
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.h
@@ -443,10 +443,11 @@
 };
 
 // Checker used to block until the bookmarks on the server match a given set of
-// expected bookmarks.
+// expected bookmarks. The |title| is comapred to both legacy and full titles.
 class ServerBookmarksEqualityChecker : public SingleClientStatusChangeChecker {
  public:
   struct ExpectedBookmark {
+    // Used to check both legacy and full titles in specifics.
     std::string title;
     GURL url;
   };
@@ -454,10 +455,11 @@
   // If a |cryptographer| is provided (i.e. is not nullptr), it is assumed that
   // the server-side data should be encrypted, and the provided cryptographer
   // will be used to decrypt the data prior to checking for equality.
+  // |fake_server| must not be nullptr and must outlive this object.
   ServerBookmarksEqualityChecker(
       syncer::ProfileSyncService* service,
       fake_server::FakeServer* fake_server,
-      const std::vector<ExpectedBookmark>& expected_bookmarks,
+      std::vector<ExpectedBookmark> expected_bookmarks,
       syncer::Cryptographer* cryptographer);
 
   bool IsExitConditionSatisfied(std::ostream* os) override;
diff --git a/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc
new file mode 100644
index 0000000..22432e1
--- /dev/null
+++ b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc
@@ -0,0 +1,89 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h"
+
+#include "components/sync/invalidations/fcm_handler.h"
+#include "components/sync/protocol/sync_invalidations_payload.pb.h"
+
+namespace fake_server {
+
+namespace {
+
+// This has the same value as in
+// components/sync/invalidations/sync_invalidations_service_impl.cc.
+const char kSyncInvalidationsAppId[] = "com.google.chrome.sync.invalidations";
+
+}  // namespace
+
+FakeServerSyncInvalidationSender::FakeServerSyncInvalidationSender(
+    FakeServer* fake_server,
+    const std::vector<syncer::FCMHandler*>& fcm_handlers)
+    : fake_server_(fake_server), fcm_handlers_(fcm_handlers) {
+  DCHECK(fake_server_);
+  fake_server_->AddObserver(this);
+}
+
+FakeServerSyncInvalidationSender::~FakeServerSyncInvalidationSender() {
+  fake_server_->RemoveObserver(this);
+}
+
+void FakeServerSyncInvalidationSender::OnCommit(
+    const std::string& committer_id,
+    syncer::ModelTypeSet committed_model_types) {
+  const std::map<std::string, syncer::ModelTypeSet>
+      token_to_interested_data_types_map = GetTokenToInterestedDataTypesMap();
+  // Pass a message to each FCMHandler to simulate a message from the
+  // GCMDriver.
+  // TODO(crbug.com/1082115): Implement reflection blocking.
+  for (syncer::FCMHandler* fcm_handler : fcm_handlers_) {
+    const std::string& token = fcm_handler->GetFCMRegistrationToken();
+    if (!token_to_interested_data_types_map.count(token)) {
+      continue;
+    }
+
+    // Send the invalidation only for interested types.
+    const syncer::ModelTypeSet invalidated_data_types = Intersection(
+        committed_model_types, token_to_interested_data_types_map.at(token));
+    if (invalidated_data_types.Empty()) {
+      continue;
+    }
+    sync_pb::SyncInvalidationsPayload payload;
+    for (const syncer::ModelType data_type : invalidated_data_types) {
+      payload.add_data_type_invalidations()->set_data_type_id(
+          syncer::GetSpecificsFieldNumberFromModelType(data_type));
+    }
+
+    gcm::IncomingMessage message;
+    message.data["payload"] = payload.SerializeAsString();
+    fcm_handler->OnMessage(kSyncInvalidationsAppId, message);
+  }
+}
+
+std::map<std::string, syncer::ModelTypeSet>
+FakeServerSyncInvalidationSender::GetTokenToInterestedDataTypesMap() {
+  std::map<std::string, syncer::ModelTypeSet> result;
+  for (const sync_pb::SyncEntity& entity :
+       fake_server_->GetSyncEntitiesByModelType(syncer::DEVICE_INFO)) {
+    const sync_pb::InvalidationSpecificFields& invalidation_fields =
+        entity.specifics().device_info().invalidation_fields();
+    const std::string& token = invalidation_fields.instance_id_token();
+    if (token.empty()) {
+      continue;
+    }
+
+    DCHECK(!result.count(token));
+    result[token] = syncer::ModelTypeSet();
+    for (const int field_number :
+         invalidation_fields.interested_data_type_ids()) {
+      syncer::ModelType data_type =
+          syncer::GetModelTypeFromSpecificsFieldNumber(field_number);
+      DCHECK(syncer::IsRealDataType(data_type));
+      result[token].Put(data_type);
+    }
+  }
+  return result;
+}
+
+}  // namespace fake_server
diff --git a/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h
new file mode 100644
index 0000000..448389a
--- /dev/null
+++ b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h
@@ -0,0 +1,46 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_FAKE_SERVER_SYNC_INVALIDATION_SENDER_H_
+#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_FAKE_SERVER_SYNC_INVALIDATION_SENDER_H_
+
+#include "components/sync/base/model_type.h"
+#include "components/sync/test/fake_server/fake_server.h"
+
+namespace syncer {
+class FCMHandler;
+}
+
+namespace fake_server {
+
+// This class is observing changes to the fake server, and sends invalidations
+// to clients upon commits. Sent invalidation follows the same format expected
+// by the sync invalidations framework (i.e. SyncInvalidationsService).
+class FakeServerSyncInvalidationSender : public FakeServer::Observer {
+ public:
+  // |fake_server| must not be nullptr, and must outlive this object.
+  FakeServerSyncInvalidationSender(
+      FakeServer* fake_server,
+      const std::vector<syncer::FCMHandler*>& fcm_handlers);
+  ~FakeServerSyncInvalidationSender() override;
+  FakeServerSyncInvalidationSender(const FakeServerSyncInvalidationSender&) =
+      delete;
+  FakeServerSyncInvalidationSender& operator=(
+      const FakeServerSyncInvalidationSender&) = delete;
+
+  // FakeServer::Observer implementation.
+  void OnCommit(const std::string& committer_id,
+                syncer::ModelTypeSet committed_model_types) override;
+
+ private:
+  std::map<std::string, syncer::ModelTypeSet>
+  GetTokenToInterestedDataTypesMap();
+
+  FakeServer* fake_server_;
+  std::vector<syncer::FCMHandler*> fcm_handlers_;
+};
+
+}  // namespace fake_server
+
+#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_FAKE_SERVER_SYNC_INVALIDATION_SENDER_H_
diff --git a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
index 1d80e69..76f71fb26 100644
--- a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
@@ -71,6 +71,10 @@
 // fake server across PRE_MyTest and MyTest.
 const char kBookmarkGuid[] = "e397ed62-9532-4dbf-ae55-200236eba15c";
 
+// A title and a URL which are used across PRE_MyTest and MyTest.
+const char kBookmarkTitle[] = "Title";
+const char kBookmarkPageUrl[] = "http://www.foo.com/";
+
 class SingleClientBookmarksSyncTest : public SyncTest {
  public:
   SingleClientBookmarksSyncTest() : SyncTest(SINGLE_CLIENT) {}
@@ -1238,7 +1242,6 @@
 IN_PROC_BROWSER_TEST_F(
     SingleClientBookmarksSyncTestWithDisabledReuploadBookmarks,
     PRE_ShouldNotReploadUponFaviconLoad) {
-  const GURL url = GURL("http://www.foo.com");
   fake_server::EntityBuilderFactory entity_builder_factory;
   fake_server::BookmarkEntityBuilder bookmark_builder =
       entity_builder_factory.NewBookmarkEntityBuilder("Foo Title");
@@ -1247,14 +1250,17 @@
   // that it's a legacy bookmark means any locally-produced specifics would be
   // different for this bookmark (new fields like GUID would be populated).
   std::unique_ptr<syncer::LoopbackServerEntity> bookmark =
-      bookmark_builder.BuildBookmark(url, /*is_legacy=*/true);
+      bookmark_builder.BuildBookmark(GURL(kBookmarkPageUrl),
+                                     /*is_legacy=*/true);
   ASSERT_TRUE(bookmark.get()->GetSpecifics().bookmark().guid().empty());
   fake_server_->InjectEntity(std::move(bookmark));
 
   // Start syncing.
   DisableVerifier();
   ASSERT_TRUE(SetupSync());
-  ASSERT_TRUE(BookmarksUrlChecker(kSingleProfileIndex, url, 1).Wait());
+  ASSERT_TRUE(
+      BookmarksUrlChecker(kSingleProfileIndex, GURL(kBookmarkPageUrl), 1)
+          .Wait());
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -1264,10 +1270,10 @@
 
   const std::string title = "Title";
   const std::string new_title = "New Title";
-  const GURL page_url = GURL("http://www.foo.com");
   const GURL icon_url("http://www.google.com/favicon.ico");
 
-  const BookmarkNode* bookmark = AddURL(kSingleProfileIndex, title, page_url);
+  const BookmarkNode* bookmark =
+      AddURL(kSingleProfileIndex, title, GURL(kBookmarkPageUrl));
   SetFavicon(0, bookmark, icon_url, CreateFavicon(SK_ColorWHITE),
              bookmarks_helper::FROM_UI);
 
@@ -1275,7 +1281,8 @@
       UpdatedProgressMarkerChecker(GetSyncService(kSingleProfileIndex)).Wait());
   ASSERT_TRUE(bookmarks_helper::ServerBookmarksEqualityChecker(
                   GetSyncService(kSingleProfileIndex), GetFakeServer(),
-                  {{title, page_url}}, /*cryptographer=*/nullptr)
+                  {{title, GURL(kBookmarkPageUrl)}},
+                  /*cryptographer=*/nullptr)
                   .Wait());
 
   // Stop Sync and update local entity to enter in unsynced state.
@@ -1324,7 +1331,8 @@
   ASSERT_TRUE(GetClient(kSingleProfileIndex)->AwaitEngineInitialization());
   ASSERT_TRUE(bookmarks_helper::ServerBookmarksEqualityChecker(
                   GetSyncService(kSingleProfileIndex), GetFakeServer(),
-                  {{new_title, url}}, /*cryptographer=*/nullptr)
+                  {{new_title, url}},
+                  /*cryptographer=*/nullptr)
                   .Wait());
 
   // Last commit should initiate favicon loading.
@@ -1392,15 +1400,11 @@
   fake_server_->InjectEntity(std::move(remote_folder));
 
   ASSERT_TRUE(SetupSync());
-  ASSERT_TRUE(
-      UpdatedProgressMarkerChecker(GetSyncService(kSingleProfileIndex)).Wait());
-
-  const std::vector<sync_pb::SyncEntity> server_bookmarks =
-      GetFakeServer()->GetSyncEntitiesByModelType(syncer::BOOKMARKS);
-  ASSERT_EQ(1u, CountFoldersWithTitlesMatching(kSingleProfileIndex, title));
-  ASSERT_EQ(1u, server_bookmarks.size());
-
-  EXPECT_TRUE(server_bookmarks.front().specifics().bookmark().has_full_title());
+  ASSERT_TRUE(bookmarks_helper::ServerBookmarksEqualityChecker(
+                  GetSyncService(kSingleProfileIndex), GetFakeServer(),
+                  {{title, /*url=*/GURL()}},
+                  /*cryptographer=*/nullptr)
+                  .Wait());
 }
 
 // This test looks similar to
@@ -1414,22 +1418,16 @@
   // locally.
   ASSERT_TRUE(SetupSync());
 
-  const std::string title = "Title";
-  const GURL url = GURL("http://www.foo.com");
-
   // Make an incremental remote creation of bookmark without full_title.
   fake_server::EntityBuilderFactory entity_builder_factory;
   fake_server::BookmarkEntityBuilder bookmark_builder =
-      entity_builder_factory.NewBookmarkEntityBuilder(title);
+      entity_builder_factory.NewBookmarkEntityBuilder(kBookmarkTitle);
   std::unique_ptr<syncer::LoopbackServerEntity> remote_folder =
-      bookmark_builder.BuildBookmark(url, /*is_legacy=*/false);
-  const std::string new_guid = remote_folder->GetSpecifics().bookmark().guid();
+      bookmark_builder.BuildBookmarkWithoutFullTitle(GURL(kBookmarkPageUrl));
 
-  // Makr sure that server-side specifics doesn't have full title.
-  remote_folder->GetSpecifics().mutable_bookmark()->clear_full_title();
   fake_server_->InjectEntity(std::move(remote_folder));
 
-  ASSERT_TRUE(BookmarksTitleChecker(kSingleProfileIndex, title,
+  ASSERT_TRUE(BookmarksTitleChecker(kSingleProfileIndex, kBookmarkTitle,
                                     /*expected_count=*/1)
                   .Wait());
 }
@@ -1439,16 +1437,15 @@
     ShouldReuploadFullTitleForOldClients) {
   // This test checks that the legacy bookmark which was stored locally will
   // imply reupload to the server when reupload feature is enabled.
-  const GURL url = GURL("http://www.foo.com");
-
   ASSERT_EQ(
       1u,
       GetFakeServer()->GetSyncEntitiesByModelType(syncer::BOOKMARKS).size());
-  const int64_t old_server_version =
-      GetFakeServer()
-          ->GetSyncEntitiesByModelType(syncer::BOOKMARKS)
-          .front()
-          .version();
+  ASSERT_FALSE(GetFakeServer()
+                   ->GetSyncEntitiesByModelType(syncer::BOOKMARKS)
+                   .front()
+                   .specifics()
+                   .bookmark()
+                   .has_full_title());
   ASSERT_TRUE(SetupClients());
 #if defined(OS_CHROMEOS)
   // signin::SetRefreshTokenForPrimaryAccount() is needed on ChromeOS in order
@@ -1456,20 +1453,14 @@
   GetClient(0)->SignInPrimaryAccount();
 #endif  // defined(OS_CHROMEOS)
   ASSERT_TRUE(GetClient(kSingleProfileIndex)->AwaitEngineInitialization());
-  ASSERT_TRUE(BookmarkFaviconLoadedChecker(kSingleProfileIndex, url).Wait());
   ASSERT_TRUE(
-      UpdatedProgressMarkerChecker(GetSyncService(kSingleProfileIndex)).Wait());
-  ASSERT_GT(GetFakeServer()
-                ->GetSyncEntitiesByModelType(syncer::BOOKMARKS)
-                .front()
-                .version(),
-            old_server_version);
-
-  const std::string title = "Title";
-  const std::vector<sync_pb::SyncEntity> server_bookmarks =
-      GetFakeServer()->GetSyncEntitiesByModelType(syncer::BOOKMARKS);
-  ASSERT_EQ(1u, server_bookmarks.size());
-  EXPECT_TRUE(server_bookmarks.front().specifics().bookmark().has_full_title());
+      BookmarkFaviconLoadedChecker(kSingleProfileIndex, GURL(kBookmarkPageUrl))
+          .Wait());
+  ASSERT_TRUE(bookmarks_helper::ServerBookmarksEqualityChecker(
+                  GetSyncService(kSingleProfileIndex), GetFakeServer(),
+                  {{kBookmarkTitle, GURL(kBookmarkPageUrl)}},
+                  /*cryptographer=*/nullptr)
+                  .Wait());
 }
 
 // TODO(rushans): add the same test as before with favicons.
@@ -1479,28 +1470,18 @@
     PRE_ShouldReuploadFullTitleAfterRestartOnIncrementalChange) {
   ASSERT_TRUE(SetupSync());
 
-  const std::string title = "Title";
-  const GURL url = GURL("http://www.foo.com");
-
   // Make an incremental remote creation of bookmark.
   fake_server::EntityBuilderFactory entity_builder_factory;
   fake_server::BookmarkEntityBuilder bookmark_builder =
-      entity_builder_factory.NewBookmarkEntityBuilder(title);
+      entity_builder_factory.NewBookmarkEntityBuilder(kBookmarkTitle);
   std::unique_ptr<syncer::LoopbackServerEntity> remote_folder =
-      bookmark_builder.BuildBookmarkWithoutFullTitle(url);
+      bookmark_builder.BuildBookmarkWithoutFullTitle(GURL(kBookmarkPageUrl));
   ASSERT_FALSE(remote_folder->GetSpecifics().bookmark().has_full_title());
   fake_server_->InjectEntity(std::move(remote_folder));
 
-  ASSERT_TRUE(BookmarksTitleChecker(kSingleProfileIndex, title,
+  ASSERT_TRUE(BookmarksTitleChecker(kSingleProfileIndex, kBookmarkTitle,
                                     /*expected_count=*/1)
                   .Wait());
-
-  // Check that the full title was not uploaded to the server yet.
-  const std::vector<sync_pb::SyncEntity> server_bookmarks =
-      GetFakeServer()->GetSyncEntitiesByModelType(syncer::BOOKMARKS);
-  ASSERT_EQ(1u, server_bookmarks.size());
-  EXPECT_FALSE(
-      server_bookmarks.front().specifics().bookmark().has_full_title());
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -1508,7 +1489,16 @@
     ShouldReuploadFullTitleAfterRestartOnIncrementalChange) {
   ASSERT_TRUE(SetupClients());
 
-  const GURL url = GURL("http://www.foo.com");
+  // Check that the full title was not uploaded to the server yet.
+  ASSERT_EQ(
+      1u,
+      GetFakeServer()->GetSyncEntitiesByModelType(syncer::BOOKMARKS).size());
+  ASSERT_FALSE(GetFakeServer()
+                   ->GetSyncEntitiesByModelType(syncer::BOOKMARKS)
+                   .front()
+                   .specifics()
+                   .bookmark()
+                   .has_full_title());
 
 #if defined(OS_CHROMEOS)
   // signin::SetRefreshTokenForPrimaryAccount() is needed on ChromeOS in order
@@ -1516,15 +1506,14 @@
   GetClient(0)->SignInPrimaryAccount();
 #endif  // defined(OS_CHROMEOS)
   ASSERT_TRUE(GetClient(kSingleProfileIndex)->AwaitEngineInitialization());
-  ASSERT_TRUE(BookmarkFaviconLoadedChecker(kSingleProfileIndex, url).Wait());
   ASSERT_TRUE(
-      UpdatedProgressMarkerChecker(GetSyncService(kSingleProfileIndex)).Wait());
-
-  const std::string title = "Title";
-  const std::vector<sync_pb::SyncEntity> server_bookmarks =
-      GetFakeServer()->GetSyncEntitiesByModelType(syncer::BOOKMARKS);
-  ASSERT_EQ(1u, server_bookmarks.size());
-  EXPECT_TRUE(server_bookmarks.front().specifics().bookmark().has_full_title());
+      BookmarkFaviconLoadedChecker(kSingleProfileIndex, GURL(kBookmarkPageUrl))
+          .Wait());
+  ASSERT_TRUE(bookmarks_helper::ServerBookmarksEqualityChecker(
+                  GetSyncService(kSingleProfileIndex), GetFakeServer(),
+                  {{kBookmarkTitle, GURL(kBookmarkPageUrl)}},
+                  /*cryptographer=*/nullptr)
+                  .Wait());
 }
 
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
index 9a63930..a3754a2c 100644
--- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -201,18 +201,20 @@
 
 IN_PROC_BROWSER_TEST_F(SingleClientCustomPassphraseSyncTest,
                        CommitsEncryptedData) {
+  const std::string title1 = "Hello world";
+  const std::string title2 = "Bookmark #2";
+  const GURL page_url1("https://google.com/");
+  const GURL page_url2("https://example.com/");
+
   SetEncryptionPassphraseForClient(/*index=*/0, "hunter2");
   ASSERT_TRUE(SetupSync());
 
-  ASSERT_TRUE(
-      AddURL(/*profile=*/0, "Hello world", GURL("https://google.com/")));
-  ASSERT_TRUE(
-      AddURL(/*profile=*/0, "Bookmark #2", GURL("https://example.com/")));
+  ASSERT_TRUE(AddURL(/*profile=*/0, title1, page_url1));
+  ASSERT_TRUE(AddURL(/*profile=*/0, title2, page_url2));
   ASSERT_TRUE(WaitForNigori(PassphraseType::kCustomPassphrase));
 
   EXPECT_TRUE(WaitForEncryptedServerBookmarks(
-      {{"Hello world", GURL("https://google.com/")},
-       {"Bookmark #2", GURL("https://example.com/")}},
+      {{title1, page_url1}, {title2, page_url2}},
       /*passphrase=*/"hunter2"));
 }
 
@@ -261,37 +263,39 @@
 
 IN_PROC_BROWSER_TEST_F(SingleClientCustomPassphraseDoNotUseScryptSyncTest,
                        CommitsEncryptedDataUsingPbkdf2WhenScryptDisabled) {
+  const std::string title = "PBKDF2 encrypted";
+  const GURL page_url("https://google.com/pbkdf2-encrypted");
+
   SetEncryptionPassphraseForClient(/*index=*/0, "hunter2");
   ASSERT_TRUE(SetupSync());
-  ASSERT_TRUE(AddURL(/*profile=*/0, "PBKDF2 encrypted",
-                     GURL("https://google.com/pbkdf2-encrypted")));
+  ASSERT_TRUE(AddURL(/*profile=*/0, title, page_url));
 
   ASSERT_TRUE(WaitForNigori(PassphraseType::kCustomPassphrase));
   NigoriSpecifics nigori;
   EXPECT_TRUE(GetServerNigori(GetFakeServer(), &nigori));
   EXPECT_EQ(nigori.custom_passphrase_key_derivation_method(),
             sync_pb::NigoriSpecifics::PBKDF2_HMAC_SHA1_1003);
-  EXPECT_TRUE(WaitForEncryptedServerBookmarks(
-      {{"PBKDF2 encrypted", GURL("https://google.com/pbkdf2-encrypted")}},
-      /*passphrase=*/"hunter2"));
+  EXPECT_TRUE(WaitForEncryptedServerBookmarks({{title, page_url}},
+                                              /*passphrase=*/"hunter2"));
 }
 
 IN_PROC_BROWSER_TEST_F(SingleClientCustomPassphraseUseScryptSyncTest,
                        CommitsEncryptedDataUsingScryptWhenScryptEnabled) {
+  const std::string title = "scrypt encrypted";
+  const GURL page_url("https://google.com/scrypt-encrypted");
+
   SetEncryptionPassphraseForClient(/*index=*/0, "hunter2");
   ASSERT_TRUE(SetupSync());
 
-  ASSERT_TRUE(AddURL(/*profile=*/0, "scrypt encrypted",
-                     GURL("https://google.com/scrypt-encrypted")));
+  ASSERT_TRUE(AddURL(/*profile=*/0, title, page_url));
 
   ASSERT_TRUE(WaitForNigori(PassphraseType::kCustomPassphrase));
   NigoriSpecifics nigori;
   EXPECT_TRUE(GetServerNigori(GetFakeServer(), &nigori));
   EXPECT_EQ(nigori.custom_passphrase_key_derivation_method(),
             sync_pb::NigoriSpecifics::SCRYPT_8192_8_11);
-  EXPECT_TRUE(WaitForEncryptedServerBookmarks(
-      {{"scrypt encrypted", GURL("https://google.com/scrypt-encrypted")}},
-      /*passphrase=*/"hunter2"));
+  EXPECT_TRUE(WaitForEncryptedServerBookmarks({{title, page_url}},
+                                              /*passphrase=*/"hunter2"));
 }
 
 IN_PROC_BROWSER_TEST_F(SingleClientCustomPassphraseDoNotUseScryptSyncTest,
@@ -313,12 +317,13 @@
 
 IN_PROC_BROWSER_TEST_F(SingleClientCustomPassphraseDoNotUseScryptSyncTest,
                        DoesNotLeakUnencryptedData) {
+  const std::string title = "Should be encrypted";
+  const GURL page_url("https://google.com/encrypted");
   SetEncryptionPassphraseForClient(/*index=*/0, "hunter2");
   ASSERT_TRUE(SetupClients());
 
   // Create local bookmarks before sync is enabled.
-  ASSERT_TRUE(AddURL(/*profile=*/0, "Should be encrypted",
-                     GURL("https://google.com/encrypted")));
+  ASSERT_TRUE(AddURL(/*profile=*/0, title, page_url));
 
   CommittedBookmarkEntityNameObserver observer(GetFakeServer());
   ASSERT_TRUE(SetupSync());
@@ -332,19 +337,20 @@
   // once, we are certain that no bookmarks other than those we've verified to
   // be encrypted have been committed.
   EXPECT_TRUE(WaitForEncryptedServerBookmarks(
-      {{"Should be encrypted", GURL("https://google.com/encrypted")}},
+      {{title, page_url}},
       {KeyDerivationParams::CreateForPbkdf2(), "hunter2"}));
   EXPECT_THAT(observer.GetCommittedEntityNames(), ElementsAre("encrypted"));
 }
 
 IN_PROC_BROWSER_TEST_F(SingleClientCustomPassphraseDoNotUseScryptSyncTest,
                        ReencryptsDataWhenPassphraseIsSet) {
+  const std::string title = "Re-encryption is great";
+  const GURL page_url("https://google.com/re-encrypted");
   ASSERT_TRUE(SetupSync());
   ASSERT_TRUE(WaitForNigori(PassphraseType::kKeystorePassphrase));
-  ASSERT_TRUE(AddURL(/*profile=*/0, "Re-encryption is great",
-                     GURL("https://google.com/re-encrypted")));
-  std::vector<ServerBookmarksEqualityChecker::ExpectedBookmark> expected = {
-      {"Re-encryption is great", GURL("https://google.com/re-encrypted")}};
+  ASSERT_TRUE(AddURL(/*profile=*/0, title, page_url));
+  const std::vector<ServerBookmarksEqualityChecker::ExpectedBookmark> expected =
+      {{title, page_url}};
   ASSERT_TRUE(WaitForUnencryptedServerBookmarks(expected));
 
   GetSyncService()->GetUserSettings()->SetEncryptionPassphrase("hunter2");
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 281fc9e..66a2f41 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -11,6 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
+#include "base/rand_util.h"
 #include "base/run_loop.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -214,8 +215,25 @@
   DISALLOW_COPY_AND_ASSIGN(SyncProfileDelegate);
 };
 
+instance_id::InstanceIDDriver* GetOrCreateInstanceIDDriver(
+    Profile* profile,
+    std::map<const Profile*, std::unique_ptr<instance_id::InstanceIDDriver>>*
+        profile_to_instance_id_driver_map) {
+  if (!profile_to_instance_id_driver_map->count(profile)) {
+    (*profile_to_instance_id_driver_map)[profile] =
+        std::make_unique<SyncTest::FakeInstanceIDDriver>();
+  }
+  return (*profile_to_instance_id_driver_map)[profile].get();
+}
+
 }  // namespace
 
+int SyncTest::FakeInstanceID::next_token_id_ = 1;
+
+SyncTest::FakeInstanceID::FakeInstanceID(const std::string& app_id)
+    : instance_id::InstanceID(app_id, /*gcm_driver = */ nullptr),
+      token_(base::StringPrintf("token %d", next_token_id_++)) {}
+
 void SyncTest::FakeInstanceID::GetToken(
     const std::string& authorized_entity,
     const std::string& scope,
@@ -223,16 +241,25 @@
     const std::map<std::string, std::string>& options,
     std::set<Flags> flags,
     GetTokenCallback callback) {
-  std::move(callback).Run("token", instance_id::InstanceID::Result::SUCCESS);
+  std::move(callback).Run(token_, instance_id::InstanceID::Result::SUCCESS);
 }
 
+SyncTest::FakeInstanceIDDriver::FakeInstanceIDDriver()
+    : instance_id::InstanceIDDriver(/*gcm_driver=*/nullptr) {}
+
+SyncTest::FakeInstanceIDDriver::~FakeInstanceIDDriver() = default;
+
 instance_id::InstanceID* SyncTest::FakeInstanceIDDriver::GetInstanceID(
     const std::string& app_id) {
-  return &fake_instance_id_;
+  if (!fake_instance_ids_.count(app_id)) {
+    fake_instance_ids_[app_id] = std::make_unique<FakeInstanceID>(app_id);
+  }
+  return fake_instance_ids_[app_id].get();
 }
+
 bool SyncTest::FakeInstanceIDDriver::ExistsInstanceID(
     const std::string& app_id) const {
-  return true;
+  return fake_instance_ids_.count(app_id);
 }
 
 SyncTest::SyncTest(TestType test_type)
@@ -629,6 +656,13 @@
   }
 #endif
 
+  // Create the fake server sync invalidations sender.
+  if (server_type_ == IN_PROCESS_FAKE_SERVER) {
+    fake_server_sync_invalidation_sender_ =
+        std::make_unique<fake_server::FakeServerSyncInvalidationSender>(
+            GetFakeServer(), sync_invalidations_fcm_handlers_);
+  }
+
   LOG(INFO)
       << "SyncTest::SetupClients() completed; elapsed time since construction: "
       << (base::Time::Now() - test_construction_time_);
@@ -929,6 +963,7 @@
              observer : fake_server_invalidation_observers_) {
       fake_server_->RemoveObserver(observer.get());
     }
+    fake_server_sync_invalidation_sender_.reset();
     fake_server_.reset();
   }
 
@@ -958,21 +993,25 @@
           context,
           base::BindRepeating(&SyncTest::CreateProfileInvalidationProvider,
                               &profile_to_fcm_network_handler_map_,
-                              &fake_instance_id_driver_));
+                              &profile_to_instance_id_driver_map_));
   SyncInvalidationsServiceFactory::GetInstance()->SetTestingFactory(
       context, base::BindRepeating(&SyncTest::CreateSyncInvalidationsService,
-                                   &fake_instance_id_driver_));
+                                   &profile_to_instance_id_driver_map_,
+                                   &sync_invalidations_fcm_handlers_));
 }
 
 // static
 std::unique_ptr<KeyedService> SyncTest::CreateProfileInvalidationProvider(
     std::map<const Profile*, syncer::FCMNetworkHandler*>*
         profile_to_fcm_network_handler_map,
-    instance_id::InstanceIDDriver* instance_id_driver,
+    std::map<const Profile*, std::unique_ptr<instance_id::InstanceIDDriver>>*
+        profile_to_instance_id_driver_map,
     content::BrowserContext* context) {
   Profile* profile = Profile::FromBrowserContext(context);
   gcm::GCMProfileService* gcm_profile_service =
       gcm::GCMProfileServiceFactory::GetForProfile(profile);
+  instance_id::InstanceIDDriver* instance_id_driver =
+      GetOrCreateInstanceIDDriver(profile, profile_to_instance_id_driver_map);
 
   auto profile_identity_provider =
       std::make_unique<invalidation::ProfileIdentityProvider>(
@@ -1007,7 +1046,9 @@
 
 // static
 std::unique_ptr<KeyedService> SyncTest::CreateSyncInvalidationsService(
-    instance_id::InstanceIDDriver* instance_id_driver,
+    std::map<const Profile*, std::unique_ptr<instance_id::InstanceIDDriver>>*
+        profile_to_instance_id_driver_map,
+    std::vector<syncer::FCMHandler*>* sync_invalidations_fcm_handlers,
     content::BrowserContext* context) {
   if (!base::FeatureList::IsEnabled(switches::kSyncSendInterestedDataTypes)) {
     return nullptr;
@@ -1017,8 +1058,15 @@
 
   gcm::GCMDriver* gcm_driver =
       gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver();
-  return std::make_unique<syncer::SyncInvalidationsServiceImpl>(
+  instance_id::InstanceIDDriver* instance_id_driver =
+      GetOrCreateInstanceIDDriver(profile, profile_to_instance_id_driver_map);
+  auto service = std::make_unique<syncer::SyncInvalidationsServiceImpl>(
       gcm_driver, instance_id_driver);
+
+  sync_invalidations_fcm_handlers->push_back(
+      service->GetFCMHandlerForTesting());
+
+  return std::move(service);
 }
 
 void SyncTest::ResetSyncForPrimaryAccount() {
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h
index 4d59f59..2359b01 100644
--- a/chrome/browser/sync/test/integration/sync_test.h
+++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -19,6 +19,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/test/integration/configuration_refresher.h"
 #include "chrome/browser/sync/test/integration/fake_server_invalidation_sender.h"
+#include "chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h"
 #include "chrome/common/buildflags.h"
 #include "components/gcm_driver/instance_id/instance_id.h"
 #include "components/gcm_driver/instance_id/instance_id_driver.h"
@@ -104,8 +105,7 @@
 
   class FakeInstanceID : public instance_id::InstanceID {
    public:
-    FakeInstanceID()
-        : instance_id::InstanceID("FakeAppId", /*gcm_driver = */ nullptr) {}
+    explicit FakeInstanceID(const std::string& app_id);
     ~FakeInstanceID() override = default;
 
     void GetID(GetIDCallback callback) override {}
@@ -135,20 +135,21 @@
     void DeleteIDImpl(DeleteIDCallback callback) override {}
 
    private:
+    static int next_token_id_;
+    const std::string token_;
     DISALLOW_COPY_AND_ASSIGN(FakeInstanceID);
   };
 
   class FakeInstanceIDDriver : public instance_id::InstanceIDDriver {
    public:
-    FakeInstanceIDDriver()
-        : instance_id::InstanceIDDriver(/*gcm_driver=*/nullptr) {}
-    ~FakeInstanceIDDriver() override = default;
+    FakeInstanceIDDriver();
+    ~FakeInstanceIDDriver() override;
     instance_id::InstanceID* GetInstanceID(const std::string& app_id) override;
     void RemoveInstanceID(const std::string& app_id) override {}
     bool ExistsInstanceID(const std::string& app_id) const override;
 
    private:
-    FakeInstanceID fake_instance_id_;
+    std::map<std::string, std::unique_ptr<FakeInstanceID>> fake_instance_ids_;
     DISALLOW_COPY_AND_ASSIGN(FakeInstanceIDDriver);
   };
 
@@ -357,11 +358,14 @@
   static std::unique_ptr<KeyedService> CreateProfileInvalidationProvider(
       std::map<const Profile*, syncer::FCMNetworkHandler*>*
           profile_to_fcm_network_handler_map,
-      instance_id::InstanceIDDriver* instance_id_driver,
+      std::map<const Profile*, std::unique_ptr<instance_id::InstanceIDDriver>>*
+          profile_to_instance_id_driver_map,
       content::BrowserContext* context);
 
   static std::unique_ptr<KeyedService> CreateSyncInvalidationsService(
-      instance_id::InstanceIDDriver* instance_id_driver,
+      std::map<const Profile*, std::unique_ptr<instance_id::InstanceIDDriver>>*
+          profile_to_instance_id_driver_map,
+      std::vector<syncer::FCMHandler*>* sync_invalidations_fcm_handlers,
       content::BrowserContext* context);
 
   // Helper to Profile::CreateProfile that handles path creation. It creates
@@ -481,7 +485,8 @@
   std::map<const Profile*, syncer::FCMNetworkHandler*>
       profile_to_fcm_network_handler_map_;
 
-  FakeInstanceIDDriver fake_instance_id_driver_;
+  std::map<const Profile*, std::unique_ptr<instance_id::InstanceIDDriver>>
+      profile_to_instance_id_driver_map_;
 
   // Triggers a GetUpdates via refresh after a configuration.
   std::unique_ptr<ConfigurationRefresher> configuration_refresher_;
@@ -517,6 +522,10 @@
       model_updater_factory_;
 #endif
 
+  std::vector<syncer::FCMHandler*> sync_invalidations_fcm_handlers_;
+  std::unique_ptr<fake_server::FakeServerSyncInvalidationSender>
+      fake_server_sync_invalidation_sender_;
+
   DISALLOW_COPY_AND_ASSIGN(SyncTest);
 };
 
diff --git a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java
index b250624..cd24d38 100644
--- a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java
+++ b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java
@@ -44,12 +44,11 @@
     void prepareMenu(Menu menu, AppMenuHandler handler);
 
     /**
-     * Gets an optional bundle of extra data associated with the provided MenuItem.
+     * Gets a bundle of (optional) extra data associated with the provided MenuItem.
      *
      * @param item The {@link MenuItem} for which to return the Bundle.
-     * @return A {@link Bundle} for the provided MenuItem containing extra data, or null.
+     * @return A {@link Bundle} for the provided MenuItem containing extra data, if any.
      */
-    @Nullable
     Bundle getBundleForMenuItem(MenuItem item);
 
     /**
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
index 5380e2f..5bb8386 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -165,6 +165,7 @@
 <translation id="2169830938017475061">Now</translation>
 <translation id="2175927920773552910">QR code</translation>
 <translation id="218608176142494674">Sharing</translation>
+<translation id="2195339740518523951">Get Chrome’s strongest security</translation>
 <translation id="2227444325776770048">Continue as <ph name="USER_FULL_NAME" /></translation>
 <translation id="2234876718134438132">Sync and Google services</translation>
 <translation id="2239812875700136898">Control your stories from the 'Options for Discover' button</translation>
@@ -256,6 +257,7 @@
 <translation id="2893180576842394309">Google may use your history to personalise Search and other Google services</translation>
 <translation id="2898264748040935573">Edit stored password</translation>
 <translation id="2900528713135656174">Create event</translation>
+<translation id="2901411048554510387">Showing suggestions for <ph name="WEBSITE_TITLE" /></translation>
 <translation id="2904414404539560095">List of devices to share a tab with, opened at full height.</translation>
 <translation id="2905036901251765993">To share with people nearby, let them scan this QR code</translation>
 <translation id="2909615210195135082">Google Notifications Platform</translation>
@@ -441,6 +443,7 @@
 <translation id="4405224443901389797">Move to…</translation>
 <translation id="4411535500181276704">Lite mode</translation>
 <translation id="4415276339145661267">Manage your Google Account</translation>
+<translation id="4427306783828095590">Enhanced protection does more to block phishing and malware</translation>
 <translation id="4440958355523780886">Lite page provided by Google. Tap to load the original.</translation>
 <translation id="4452411734226507615">Close <ph name="TAB_TITLE" /> tab</translation>
 <translation id="4452548195519783679">Bookmarked to <ph name="FOLDER_NAME" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
index 8eaad192..dcea2a8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -5,7 +5,7 @@
 <translation id="103269572468856066">Эдгээр сайт, аппаас мөн өгөгдөл арилгах уу?</translation>
 <translation id="1036348656032585052">Унтраа</translation>
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" />-г нэмж байна...</translation>
-<translation id="1041308826830691739">Вэбсайтаас</translation>
+<translation id="1041308826830691739">Вебсайтаас</translation>
 <translation id="1045899828449635435">Эдгээр сайтаас мөн өгөгдөл арилгах уу?</translation>
 <translation id="1047303875618851375">Chrome мэдээллийг тань баталгаажуулж чадсангүй</translation>
 <translation id="1049743911850919806">Нууцлал</translation>
@@ -16,7 +16,7 @@
 <translation id="1105960400813249514">Дэлгэцийн зураг авах</translation>
 <translation id="1111673857033749125">Таны бусад төхөөрөмжид хадгалсан хавчуурга энд харагдах болно</translation>
 <translation id="1113597929977215864">Хялбаршуулсан харагдцыг харуулах</translation>
-<translation id="1126809382673880764">Таныг аюултай вэб сайт, таталт болон өргөтгөлөөс хамгаалахгүй. Гэхдээ та Аюулгүй үзэх хамгаалалтыг Gmail, Хайлт зэрэг Google-н боломжтой бусад үйлчилгээнд авсан хэвээр байна.</translation>
+<translation id="1126809382673880764">Таныг аюултай вебсайт, таталт болон өргөтгөлөөс хамгаалахгүй. Гэхдээ та Аюулгүй үзэх хамгаалалтыг Gmail, Хайлт зэрэг Google-н боломжтой бусад үйлчилгээнд авсан хэвээр байна.</translation>
 <translation id="1129510026454351943">Дэлгэрэнгүй: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1141800923049248244">{FILE_COUNT,plural, =1{1 таталт хүлээгдэж байна.}other{# таталт хүлээгдэж байна.}}</translation>
 <translation id="1142732900304639782">Эдгээр сайтыг орчуулахыг бүү санал болго</translation>
@@ -24,7 +24,7 @@
 <translation id="1146678959555564648">VR-г оруулна уу</translation>
 <translation id="1154704303112745282">Хуудас офлайн үед боломжгүй: <ph name="VIOLATED_URL" /></translation>
 <translation id="116280672541001035">Ашигласан</translation>
-<translation id="1171770572613082465">"Шилдэг сайтууд" товчлуурыг товшин, түгээмэл хэрэглэгддэг вэб сайтыг харна уу</translation>
+<translation id="1171770572613082465">"Шилдэг сайтууд" товчлуурыг товшин, түгээмэл хэрэглэгддэг веб сайтыг харна уу</translation>
 <translation id="1173894706177603556">Нэр солих</translation>
 <translation id="1177863135347784049">Хэвийн</translation>
 <translation id="1197267115302279827">Хавчуургыг шилжүүлэх</translation>
@@ -72,7 +72,7 @@
 <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />-г хуваалцах боломжгүй байна</translation>
 <translation id="1477626028522505441">Серверийн алдаанаас шалтгаалан <ph name="FILE_NAME" />-г татаж чадсангүй.</translation>
 <translation id="1506061864768559482">Хайлтын хэрэгсэл</translation>
-<translation id="1513352483775369820">Хавчуурга болон вэб түүх</translation>
+<translation id="1513352483775369820">Хавчуурга болон веб түүх</translation>
 <translation id="1513858653616922153">Нууц үг устгах</translation>
 <translation id="1521774566618522728">Өнөөдөр идэвхтэй</translation>
 <translation id="1543538514740974167">Энд хурдан очих</translation>
@@ -116,12 +116,12 @@
 <translation id="189358972401248634">Бусад хэлнүүд</translation>
 <translation id="1919130412786645364">Chromium-д нэвтрэхийг зөвшөөрөх</translation>
 <translation id="1922362554271624559">Санал болгосон хэлнүүд</translation>
-<translation id="1925021887439448749">Тохируулсан вэб хаяг оруулах</translation>
+<translation id="1925021887439448749">Тохируулсан веб хаяг оруулах</translation>
 <translation id="1928696683969751773">Шинэчлэл</translation>
 <translation id="19288952978244135">Chrome-г дахин нээнэ үү.</translation>
 <translation id="1933845786846280168">Сонгосон чихтэй хуудас</translation>
 <translation id="1943432128510653496">Нууц үг хадгалах</translation>
-<translation id="1952172573699511566">Вэбсайт текстийг таны сонгосон хэлээр (хэрэв тухайн хэл боломжтой бол) харуулна.</translation>
+<translation id="1952172573699511566">Вебсайт текстийг таны сонгосон хэлээр (хэрэв тухайн хэл боломжтой бол) харуулна.</translation>
 <translation id="1960290143419248813">Chrome-н шинэчлэлтийг Android-н энэ хувилбарт дэмжихээ больсон байна</translation>
 <translation id="1963976881984600709">Стандарт хамгаалалт</translation>
 <translation id="1966710179511230534">Өөрийнхөө бүртгэлийн дэлгэрэнгүй мэдээллийг шинэчилнэ үү.</translation>
@@ -148,7 +148,7 @@
 <translation id="2096012225669085171">Төхөөрөмжүүдийг синк хийж хувийн болгох</translation>
 <translation id="2100273922101894616">Автоматаар нэвтэх</translation>
 <translation id="2100314319871056947">Текстийг жижиг хэсгээр хуваалцахыг оролдоно уу</translation>
-<translation id="2109711654079915747">Хуудаснаас гаралгүйгээр вэб сайтууд дээрх сэдвүүдийн талаар мэдээлэл аваарай. Хайхын тулд товших онцлог нь үг болон тухайн үгийн хам сэдвийг Google Хайлт руу илгээснээр тодорхойлолт, зураг, хайлтын илэрц болон бусад дэлгэрэнгүйг гаргаж ирнэ.
+<translation id="2109711654079915747">Хуудаснаас гаралгүйгээр веб сайтууд дээрх сэдвүүдийн талаар мэдээлэл аваарай. Хайхын тулд товших онцлог нь үг болон тухайн үгийн хам сэдвийг Google Хайлт руу илгээснээр тодорхойлолт, зураг, хайлтын илэрц болон бусад дэлгэрэнгүйг гаргаж ирнэ.
 
 Хайхын тулд дурын үгийг товшино уу. Хайлтаа боловсронгуй болгохын тулд илүү олон эсвэл цөөн үг сонгох бол удаан дарна уу. Хайлтаа засахын тулд түр зуурын самбарыг нээж, дүрс тэмдгийг товшин шинэ табд нээгээд хайх хэсэгт өөрчлөлтөө хийнэ үү.</translation>
 <translation id="2111511281910874386">Хуудаст очих</translation>
@@ -192,7 +192,7 @@
 <translation id="2426805022920575512">Өөр бүртгэл сонгох</translation>
 <translation id="2433507940547922241">Харагдах байдал</translation>
 <translation id="2450083983707403292">Та <ph name="FILE_NAME" />-г дахин татаж эхлүүлэх үү?</translation>
-<translation id="2450907520913474542">Хуудаснаас гаралгүйгээр вэб сайтууд дээрх сэдвүүдийн талаар мэдээлэл аваарай. Хайхын тулд товших онцлог нь үг болон тухайн үгийн хам сэдвийг Google Хайлт руу илгээснээр тодорхойлолт, зураг, хайлтын илэрц болон бусад дэлгэрэнгүйг гаргаж ирнэ.
+<translation id="2450907520913474542">Хуудаснаас гаралгүйгээр веб сайтууд дээрх сэдвүүдийн талаар мэдээлэл аваарай. Хайхын тулд товших онцлог нь үг болон тухайн үгийн хам сэдвийг Google Хайлт руу илгээснээр тодорхойлолт, зураг, хайлтын илэрц болон бусад дэлгэрэнгүйг гаргаж ирнэ.
 
 Хайлт үүсгэхийн тулд дурын үгийг удаан дарна уу. Хайлтаа боловсронгуй болгохын тулд илүү олон эсвэл цөөн үг сонгоно уу. Хайлтаа засахын тулд түр зуурын самбарыг нээж, дүрс тэмдгийг товшин шинэ табд нээгээд хайх хэсэгт өөрчлөлтөө хийнэ үү.</translation>
 <translation id="246532703174860178">Хуваалцах</translation>
@@ -206,9 +206,9 @@
 <translation id="2512164632052122970">Контентын хэлнүүд</translation>
 <translation id="2513403576141822879">Нууцлал, аюулгүй байдал болон өгөгдөл цуглуулахтай холбоотой бусад тохиргоог харахын тулд <ph name="BEGIN_LINK" />Синк болон Google-н үйлчилгээ<ph name="END_LINK" />-г харна уу</translation>
 <translation id="2517472476991765520">Шалгах</translation>
-<translation id="2518590038762162553">Lite горимд байх үед Chrome хуудсыг илүү хурдан ачаалж, 60 хувь хүртэлх бага дата ашигладаг. Таны зочилдог хуудсыг оновчтой болгохын тулд Chrome таны вэбийн ачааллыг Google-д илгээдэг. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation>
+<translation id="2518590038762162553">Lite горимд байх үед Chrome хуудсыг илүү хурдан ачаалж, 60 хувь хүртэлх бага дата ашигладаг. Таны зочилдог хуудсыг оновчтой болгохын тулд Chrome таны вебийн ачааллыг Google-д илгээдэг. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation>
 <translation id="2523184218357549926">Таны зочилсон хуудасны URL-г Google-д илгээдэг</translation>
-<translation id="2532336938189706096">Вэб харах</translation>
+<translation id="2532336938189706096">Веб харах</translation>
 <translation id="2534155362429831547"><ph name="NUMBER_OF_ITEMS" /> зүйлийг устгасан</translation>
 <translation id="2536728043171574184">Энэ хуудсын офлайн хуулбарыг харж байна</translation>
 <translation id="2537178555904266562">Нууц үгийг синк хийхэд алдаа гарлаа</translation>
@@ -224,7 +224,7 @@
 <translation id="2647434099613338025">Хэл нэмэх</translation>
 <translation id="2650751991977523696">Файлыг дахин татаж авах уу?</translation>
 <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Аудио файл}other{# Аудио файл}}</translation>
-<translation id="2656405586795711023">Вэб программууд</translation>
+<translation id="2656405586795711023">Веб программууд</translation>
 <translation id="2689830683995595741">Chrome-г ашигласнаар та <ph name="BEGIN_LINK1" />Google-н Үйлчилгээний нөхцөл<ph name="END_LINK1" /> ба <ph name="BEGIN_LINK2" />Google Chrome болон Chrome үйлдлийн системийн Үйлчилгээний нэмэлт нөхцөлийг<ph name="END_LINK2" /> зөвшөөрч байна. <ph name="BEGIN_LINK3" />Family Link-р удирддаг Google Бүртгэлийн нууцлалын сануулгыг<ph name="END_LINK3" /> мөн хэрэгжүүлнэ.</translation>
 <translation id="2704606927547763573">Хуулсан</translation>
 <translation id="2707726405694321444">Хуудсыг дахин шинэчлэх</translation>
@@ -293,7 +293,7 @@
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" />-г устгасан</translation>
 <translation id="3211503082155944789">Уншаагүй <ph name="READING_LIST_COUNT" /> хуудас</translation>
 <translation id="321773570071367578">Хэрэв та нэвтрэх үгээ мартсан, эсвэл тохиргоог нь өөрчлөхийг хүсвэл <ph name="BEGIN_LINK" />синкийг дахин тохируулна уу<ph name="END_LINK" /></translation>
-<translation id="3232754137068452469">Вэб Апп</translation>
+<translation id="3232754137068452469">Веб Апп</translation>
 <translation id="3236059992281584593">1 минут үлдсэн</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Энэ хуудсыг хадгал</translation>
@@ -343,14 +343,14 @@
 <translation id="3566923219790363270">Chrome Виртуал бодит байдлыг бэлтгэсээр байна. Chrome-г дараа дахин эхлүүлнэ үү.</translation>
 <translation id="3568688522516854065">Бусад төхөөрөмжөөсөө чихтэй хуудсаа авахын тулд нэвтрээд синкийг асаана уу`</translation>
 <translation id="3587482841069643663">Бүгд</translation>
-<translation id="3587596251841506391">Вэб дэх аюулгүй байдлыг сайжруулахад туслах</translation>
+<translation id="3587596251841506391">Веб дэх аюулгүй байдлыг сайжруулахад туслах</translation>
 <translation id="3598653140581545904">Нэвтрэхийн тулд Нууцлалтай горимыг ашиглана уу</translation>
 <translation id="3599863153486145794">Бүх нэвтэрсэн төхөөрөмжийн түүхийг устгана. Таны Google бүртгэл <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-д хайлтын түүхийн өөр хэлбэртэй байж болзошгүй.</translation>
 <translation id="3602290021589620013">Мэдээллийг урьдчилж харах</translation>
 <translation id="3616113530831147358">Аудио</translation>
 <translation id="3631987586758005671"><ph name="DEVICE_NAME" />-тай хуваалцаж байна</translation>
 <translation id="3632295766818638029">Нууц үгийг харуулах</translation>
-<translation id="363596933471559332">Хадгалсан итгэмжлэлийг ашиглан вэбсайтад автоматаар нэвтрэх. Энэ үйлдлийг идэвхжүүлээгүй тохиолдолд аливаа вэбсайтад хандах бүрт таниас баталгаажуулалт шаардана.</translation>
+<translation id="363596933471559332">Хадгалсан итгэмжлэлийг ашиглан вебсайтад автоматаар нэвтрэх. Энэ үйлдлийг идэвхжүүлээгүй тохиолдолд аливаа вебсайтад хандах бүрт таниас баталгаажуулалт шаардана.</translation>
 <translation id="3653111872753786013"><ph name="WEBSITE_TITLE" />: <ph name="WEBSITE_URL" /></translation>
 <translation id="3658159451045945436">Шинэчилснээр таны зочилсон сайтын жагсаалт зэрэг өгөгдөл хадгалалтын түүхийг устгана.</translation>
 <translation id="3692944402865947621">Сангийн байршил олдоогүй тул <ph name="FILE_NAME" />-г татаж чадсангүй.</translation>
@@ -381,7 +381,7 @@
 <translation id="3895926599014793903">Ямар ч тохиолдолд томруулан харуулах</translation>
 <translation id="3908308510347173149"><ph name="PRODUCT_NAME" />-г шинэчлэх</translation>
 <translation id="3909763690984331376">Аюулгүй байдлын шалгалт <ph name="BEGIN_NEW" />Шинэ<ph name="END_NEW" /></translation>
-<translation id="3912508018559818924">Вэбээс шилдэг илэрцийг хайж байна…</translation>
+<translation id="3912508018559818924">Вебээс шилдэг илэрцийг хайж байна…</translation>
 <translation id="3924911262913579434"><ph name="SAFE_BROWSING_MODE" /> идэвхтэй байна</translation>
 <translation id="3927692899758076493">Санс сериф</translation>
 <translation id="3928666092801078803">Миний өгөгдлийг нэгтгэх</translation>
@@ -412,7 +412,7 @@
 <translation id="4116038641877404294">Хуудсыг офлайн үед ашиглахын тулд татна уу</translation>
 <translation id="4135200667068010335">Таб хуваалцах төхөөрөмжийн жагсаалтыг хаалаа.</translation>
 <translation id="4141536112466364990">Chrome-г судлах</translation>
-<translation id="4149994727733219643">Вэб хуудасны хялбаршуулсан харагдац</translation>
+<translation id="4149994727733219643">Веб хуудасны хялбаршуулсан харагдац</translation>
 <translation id="4170011742729630528">Энэ үйлчилгээг авах боломжгүй байна; Та дараа дахин оролдоно уу.</translation>
 <translation id="4179980317383591987"><ph name="AMOUNT" />-г ашигласан</translation>
 <translation id="4181841719683918333">Хэл</translation>
@@ -459,7 +459,7 @@
 <translation id="4532845899244822526">Хавтас сонгох</translation>
 <translation id="4538018662093857852">Lite горимыг асаах</translation>
 <translation id="4550003330909367850">Нууц үгээ энд харах эсвэл хуулахын тулд энэ төхөөрөмжид дэлгэцийн түгжээ тохируулна уу.</translation>
-<translation id="4558311620361989323">Вэб хуудaсны товчлол</translation>
+<translation id="4558311620361989323">Веб хуудaсны товчлол</translation>
 <translation id="4561979708150884304">Холболт алга</translation>
 <translation id="4565377596337484307">Нууц үгийг нуух</translation>
 <translation id="4572422548854449519">Удирдсан бүртгэл рүү нэвтэрнэ үү</translation>
@@ -471,7 +471,7 @@
 <translation id="4634124774493850572">Нууц үг ашиглах</translation>
 <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Алдагдсан 1 нууц үг}other{Алдагдсан # нууц үг}}</translation>
 <translation id="4650364565596261010">Системийн өгөгдмөл</translation>
-<translation id="465657074423018424">Аюулгүй үзэх үйлчилгээ нь сэжигтэй вэб сайтаас таныг хамгаалдаг. Хэрэв та энэ үйлчилгээг идэвхгүй болгох бол вэб сайт үзэхдээ, ялангуяа нууц үг оруулахаасаа өмнө маш болгоомжтой байгаарай.</translation>
+<translation id="465657074423018424">Аюулгүй үзэх үйлчилгээ нь сэжигтэй вебсайтаас таныг хамгаалдаг. Хэрэв та энэ үйлчилгээг идэвхгүй болгох бол вебсайт үзэхдээ, ялангуяа нууц үг оруулахаасаа өмнө маш болгоомжтой байгаарай.</translation>
 <translation id="4662373422909645029">Хоч тоо агуулж болохгүй</translation>
 <translation id="4663499661119906179">Танд зориулсан шилдэг сайт болон мэдээ нийтлэлүүдийг үзээрэй</translation>
 <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> хавчуурга устгасан</translation>
@@ -528,7 +528,7 @@
 <translation id="4943872375798546930">Илэрц байхгүй байна</translation>
 <translation id="4961107849584082341">Энэ хуудсыг дурын хэл рүү орчуулна уу</translation>
 <translation id="4970824347203572753">Таны байршилд боломжгүй байна</translation>
-<translation id="4971735654804503942">Аюултай вэб сайт, таталт болон өргөтгөлийн эсрэг илүү хурдан, идэвхтэй хамгаалалт. Танд нууц үгний зөрчлийн тухай анхааруулга өгдөг. Хайлтын өгөгдлийг Google-д илгээхийг шаарддаг.</translation>
+<translation id="4971735654804503942">Аюултай вебсайт, таталт болон өргөтгөлийн эсрэг илүү хурдан, идэвхтэй хамгаалалт. Танд нууц үгний зөрчлийн тухай анхааруулга өгдөг. Хайлтын өгөгдлийг Google-д илгээхийг шаарддаг.</translation>
 <translation id="497421865427891073">Цаашаа явах</translation>
 <translation id="4988210275050210843">Файлыг татаж байна (<ph name="MEGABYTES" />).</translation>
 <translation id="4988526792673242964">Хуудас</translation>
@@ -619,7 +619,7 @@
 <translation id="5687809546194252819"><ph name="APP_NAME" /> нь дахин эхлэхдээ <ph name="LANGUAGE" /> ашиглана.</translation>
 <translation id="5691211010013816086">Танд <ph name="READING_LIST_COUNT" /> хуудас байна</translation>
 <translation id="569536719314091526">Энэ хуудсыг Бусад сонголт гэсэн товчлуураас дурын хэл рүү орчуулна уу</translation>
-<translation id="5696597120588531049">Chrome таныг өгөгдлийн зөрчил, аюултай вэб сайт болон бусад зүйлээс хамгаалахад туслах боломжтой</translation>
+<translation id="5696597120588531049">Chrome таныг өгөгдлийн зөрчил, аюултай вебсайт болон бусад зүйлээс хамгаалахад туслах боломжтой</translation>
 <translation id="5697688514913266141">Таны файлыг <ph name="BEGIN_BOLD" /><ph name="DIRECTORY" /><ph name="END_BOLD" />-д хадгална. <ph name="BEGIN_LINK2" />Засах<ph name="END_LINK2" />.</translation>
 <translation id="570347048394355941">Таб руу сэлгэх</translation>
 <translation id="572328651809341494">Саяхан нээсэн табууд</translation>
@@ -682,7 +682,7 @@
 <translation id="604996488070107836">Үл мэдэгдэх алдааны улмаас <ph name="FILE_NAME" />-г татаж чадсангүй.</translation>
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">Мэдээ, нийтлэл болон үйл ажиллагаагаа энд хянана уу</translation>
-<translation id="6085886413119427067">Вэб сайтуудтай аюулгүй холболтоор хэрхэн холбогдохыг шийддэг</translation>
+<translation id="6085886413119427067">Веб сайтуудтай аюулгүй холболтоор хэрхэн холбогдохыг шийддэг</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> цаг үлдсэн</translation>
 <translation id="6108923351542677676">Тохиргоо хийгдэж байна...</translation>
 <translation id="6111020039983847643">ашигласан дата</translation>
@@ -703,9 +703,9 @@
 <translation id="6211386937064921208">Энэ хуудсыг урьдчилан үзэж байна</translation>
 <translation id="6218096829563201111">Төстэй бүтээгдэхүүн хайх <ph name="BEGIN_NEW" />Шинэ<ph name="END_NEW" /></translation>
 <translation id="6221633008163990886">Нууц үгээ экспортлох бол түгжээг тайлна уу</translation>
-<translation id="6232535412751077445">"Бүү дага" тохиргоог идэвхжүүлснээр тухайн хүсэлтийг таны хайлтын хэсэгт хадгална. Гарах үр дүн нь вэб хуудаснаас тухайн хүсэлтэд хариу өгч байгаа эсэх, тухайн хүсэлтийг хэрхэн тайлбарлаж байна гэдгээс хамаарна.
+<translation id="6232535412751077445">"Бүү дага" тохиргоог идэвхжүүлснээр тухайн хүсэлтийг таны хайлтын хэсэгт хадгална. Гарах үр дүн нь веб хуудаснаас тухайн хүсэлтэд хариу өгч байгаа эсэх, тухайн хүсэлтийг хэрхэн тайлбарлаж байна гэдгээс хамаарна.
 
-Жишээ нь: зарим вэб хуудас тухайн хүсэлтэд таны өмнө нь зочилж байсан бусад вэб хуудаснаас хамаарахгүйгээр зар сурталчилгаа үзүүлэх замаар хариу өгч болно. Ихэнх вэб хуудас нь аюулгүй байдлыг сайжруулах, вэб хуудасны мэдээлэл, зар, зөвлөгөөг харуулах, мөн тайлагнах статистик мэдээлэл гаргах зорилгоор таны хөтчийн мэдээллийг цуглуулан ашиглаж магадгүй.</translation>
+Жишээ нь: зарим веб хуудас тухайн хүсэлтэд таны өмнө нь зочилж байсан бусад веб хуудаснаас хамаарахгүйгээр зар сурталчилгаа үзүүлэх замаар хариу өгч болно. Ихэнх веб хуудас нь аюулгүй байдлыг сайжруулах, веб хуудасны мэдээлэл, зар, зөвлөгөөг харуулах, мөн тайлагнах статистик мэдээлэл гаргах зорилгоор таны хөтчийн мэдээллийг цуглуулан ашиглаж магадгүй.</translation>
 <translation id="6243852395147506234">Офлайнаар ашиглахад бэлэн</translation>
 <translation id="624789221780392884">Шинэчлэлт хийхэд бэлэн</translation>
 <translation id="6255999984061454636">Агуулгын зөвлөмж</translation>
@@ -716,7 +716,7 @@
 <translation id="6297765934698848803">Таны төхөөрөмжийг удирддаг байгууллага таны камерыг унтраасан байна.</translation>
 <translation id="6301525844455696527">Унших жагсаалтаа гүйцээрэй</translation>
 <translation id="6303969859164067831">Гараад синк хийхийг унтраах</translation>
-<translation id="6312687380483398334">Вэб программууд (чимээгүй)</translation>
+<translation id="6312687380483398334">Веб программууд (чимээгүй)</translation>
 <translation id="6316139424528454185">Android-н хувилбарыг дэмжээгүй байна</translation>
 <translation id="6324034347079777476">Андройд системийн синкийг идэвхгүй болгосон</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" />-аар дамжуулан хуваалцах</translation>
@@ -729,7 +729,7 @@
 <translation id="6366047038980456022"><ph name="APP_NAME" />-д танд шаардлагатай онлайнаар аюулгүй үйлдэл хийх, үүсгэх болон судлахад шаардлагатай ухаалаг технологи, хурд бий</translation>
 <translation id="6378173571450987352">Дэлгэрэнгүй: Ашигласан датаны хэмжээгээр эрэмбэлсэн</translation>
 <translation id="6379829913050047669"><ph name="APP_NAME" />-г Chrome-д нээнэ. Үргэлжлүүлснээр та <ph name="BEGIN_LINK1" />Google-н Үйлчилгээний нөхцөл<ph name="END_LINK1" /> ба <ph name="BEGIN_LINK2" />Google Chrome болон Chrome үйлдлийн системийн Үйлчилгээний нэмэлт нөхцөлийг<ph name="END_LINK2" /> зөвшөөрч байна.</translation>
-<translation id="6381421346744604172">Вэб сайтыг бараан болгох</translation>
+<translation id="6381421346744604172">Веб сайтыг бараан болгох</translation>
 <translation id="6395288395575013217">ХОЛБООС</translation>
 <translation id="6397616442223433927">Буцаад онлайн боллоо</translation>
 <translation id="6402652558933147609"><ph name="VIOLATED_URL" /> дээрх <ph name="ERROR_CODE" /></translation>
@@ -738,7 +738,7 @@
 <translation id="6410883413783534063">Өөр хуудаснуудад нэгэн зэрэг зочлохын тулд табуудыг нээнэ үү</translation>
 <translation id="6412673304250309937">URL-г Chrome-д хадгалсан аюултай сайтын жагсаалттай харьцуулж шалгадаг. Хэрэв сайт таны нууц үгийг хулгайлах гэж оролдвол эсвэл таныг аюултай файл татах үед Chrome нь хуудасны бага зэрэг контентын хамт URL-г Аюулгүй хайлт руу мөн илгээж болзошгүй.</translation>
 <translation id="641643625718530986">Хэвлэх...</translation>
-<translation id="6427112570124116297">Вэбийг орчуулах</translation>
+<translation id="6427112570124116297">Вебийг орчуулах</translation>
 <translation id="6433501201775827830">Хайлтын системээ сонгоно уу</translation>
 <translation id="6437478888915024427">Хуудасны мэдээлэл</translation>
 <translation id="6441734959916820584">Нэр хэт урт байна</translation>
@@ -770,7 +770,7 @@
 <translation id="6595046016124923392">Танд тайлбарыг сайжруулахын тулд зургийг Google-д илгээдэг.</translation>
 <translation id="6597891566292541626">QR/бар кодыг энэ хүрээнд байрлуулна уу.</translation>
 <translation id="6600954340915313787">Chrome руу хуулсан</translation>
-<translation id="661266467055912436">Таны болон вэб дэх хүн бүрийн аюулгүй байдлыг нэмэгдүүлдэг.</translation>
+<translation id="661266467055912436">Таны болон веб дэх хүн бүрийн аюулгүй байдлыг нэмэгдүүлдэг.</translation>
 <translation id="6618554661997243500">Шилдэг сайт, мэдээ нийтлэлүүдийг үзэхийн тулд Нүүр хуудасны товчлуурыг товшино уу</translation>
 <translation id="6627583120233659107">Хавтас засах</translation>
 <translation id="663674369910034433">Нууцлал, аюулгүй байдал болон өгөгдөл цуглуулахтай холбоотой бусад тохиргоог <ph name="BEGIN_LINK1" />Синк хийх<ph name="END_LINK1" /> болон <ph name="BEGIN_LINK2" />Google-н үйлчилгээнүүд<ph name="END_LINK2" />-ээс харна уу.</translation>
@@ -805,14 +805,14 @@
 <translation id="685850645784703949">Discover by Google - унтраалттай байна</translation>
 <translation id="6864459304226931083">Зураг татах</translation>
 <translation id="6865313869410766144">Autofill дээрх мэдээлэл</translation>
-<translation id="6882836635272038266">Аюултай гэж мэдэгдсэн вэб сайт, таталт болон өргөтгөлийн эсрэг стандарт хамгаалалт.</translation>
+<translation id="6882836635272038266">Аюултай гэж мэдэгдсэн веб сайт, таталт болон өргөтгөлийн эсрэг стандарт хамгаалалт.</translation>
 <translation id="688738109438487280">Одоо байгаа өгөгдлийг <ph name="TO_ACCOUNT" />-д нэмнэ үү.</translation>
 <translation id="6891726759199484455">Нууц үгээ хуулахын тулд түгжээг тайлна уу</translation>
 <translation id="6896758677409633944">Хуулах</translation>
 <translation id="6900532703269623216">Сайжруулсан хамгаалалт</translation>
 <translation id="6903907808598579934">Синк хийхийг асаах</translation>
 <translation id="6929699136511445623">Android системийн синкийг идэвхжүүлэх</translation>
-<translation id="6941901516114974832">Нууцлалтай горимд байх үед таны үйл ажиллагаа таны зочилсон вэб сайтууд, ажил олгогч, сургууль эсвэл интернэт үйлчилгээ нийлүүлэгчид <ph name="BEGIN_BOLD1" />харагдсан хэвээр байж болзошгүй<ph name="END_BOLD1" />.
+<translation id="6941901516114974832">Нууцлалтай горимд байх үед таны үйл ажиллагаа таны зочилсон веб сайтууд, ажил олгогч, сургууль эсвэл интернэт үйлчилгээ нийлүүлэгчид <ph name="BEGIN_BOLD1" />харагдсан хэвээр байж болзошгүй<ph name="END_BOLD1" />.
 
 Таныг <ph name="BEGIN_BOLD2" />нууцлалтай бүх табыг хаах<ph name="END_BOLD2" /> үед л зөвхөн таны Нууцлалтай харилцан үйлдлийн өгөгдлийг Chrome-с устгах болно.</translation>
 <translation id="6942665639005891494">Тохиргооны цэсийн сонголтоор таталтын өгөгдмөл байршлыг дурын үед өөрчлөх</translation>
@@ -850,7 +850,7 @@
 <translation id="7187993566681480880">Таныг нэвтэрсэн үед Chrome дээр таны аюулгүй байдлыг хангадаг бөгөөд Google-н бусад апп дахь таны аюулгүй байдлыг сайжруулахын тулд ашиглагдах боломжтой.</translation>
 <translation id="7189372733857464326">Google Play үйлчилгээний шинэчлэлтийг хүлээж байна</translation>
 <translation id="7191430249889272776">Арын дэвсгэр дээр нээсэн цонх.</translation>
-<translation id="7233236755231902816">Вэбийг өөрийн хэлээр үзэхийн тулд Chrome-н хамгийн сүүлийн үеийн хувилбарыг авна уу</translation>
+<translation id="7233236755231902816">Вебийг өөрийн хэлээр үзэхийн тулд Chrome-н хамгийн сүүлийн үеийн хувилбарыг авна уу</translation>
 <translation id="7248069434667874558"><ph name="TARGET_DEVICE_NAME" /> нь Chrome дээр синк хийхийг асаасан эсэхийг шалгана уу</translation>
 <translation id="7274013316676448362">Блоклосон сайт</translation>
 <translation id="7286572596625053347"><ph name="LANGUAGE" />-г өөрчлөх үү?</translation>
@@ -1008,7 +1008,7 @@
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> болон бусад сайт</translation>
 <translation id="8327155640814342956">Хамгийн сайн хайлт хийхийн тулд Chrome-г шинэчлэхээр нээнэ үү</translation>
 <translation id="8349013245300336738">Ашигласан өгөгдлийг хэмжээгээр нь эрэмбэлэх</translation>
-<translation id="8364299278605033898">Түгээмэл хэрэглэгддэг вэб сайтыг харах</translation>
+<translation id="8364299278605033898">Түгээмэл хэрэглэгддэг веб сайтыг харах</translation>
 <translation id="8368027906805972958">Үл мэдэгдэх эсвэл дэмжигдээгүй төхөөрөмж (<ph name="DEVICE_ID" />)</translation>
 <translation id="8372925856448695381"><ph name="LANG" /> бэлэн байна.</translation>
 <translation id="8393700583063109961">Зурвас илгээх</translation>
@@ -1065,7 +1065,7 @@
 <translation id="8788265440806329501">Навигацын түүх хаалттай байна</translation>
 <translation id="8788968922598763114">Сүүлд хаасан чихтэй хуудсыг дахин нээх</translation>
 <translation id="8798449543960971550">Унших</translation>
-<translation id="8812260976093120287">Зарим вэб хуудаст та төлбөр хийхдээ таны төхөөрөмжид дэмжсэн дээрх төлбөрийн аппыг ашиглах боломжтой.</translation>
+<translation id="8812260976093120287">Зарим веб хуудаст та төлбөр хийхдээ таны төхөөрөмжид дэмжсэн дээрх төлбөрийн аппыг ашиглах боломжтой.</translation>
 <translation id="8820817407110198400">Хавчуургууд</translation>
 <translation id="883806473910249246">Агуулгыг татаж байх үед алдаа гарлаа.</translation>
 <translation id="8840953339110955557">Энэ хуудас онлайн хувилбараас өөр байж болзошгүй.</translation>
@@ -1074,7 +1074,7 @@
 <translation id="8856607253650333758">Тайлбар авах</translation>
 <translation id="8873817150012960745">Эхлүүлэхийн тулд энд товшино уу</translation>
 <translation id="889338405075704026">Chrome-н тохиргоо хэсэгт очих</translation>
-<translation id="8898822736010347272">Шинэ аюул заналыг олж илрүүлэх болон вэб дээрх бүх хүнийг хамгаалахад туслахын тулд таны зочилдог зарим хуудасны URL, системийн хязгаарлагдмал мэдээлэл болон хуудасны зарим контентыг Google рүү илгээдэг.</translation>
+<translation id="8898822736010347272">Шинэ аюул заналыг олж илрүүлэх болон веб дээрх бүх хүнийг хамгаалахад туслахын тулд таны зочилдог зарим хуудасны URL, системийн хязгаарлагдмал мэдээлэл болон хуудасны зарим контентыг Google рүү илгээдэг.</translation>
 <translation id="8909135823018751308">Мэдээллийг хуваалцах ...</translation>
 <translation id="8912362522468806198">Google Бүртгэл</translation>
 <translation id="8920114477895755567">Эцэг, эхийн мэдээллийг хүлээж байна.</translation>
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
index 940dd34..a19e6d6 100644
--- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -1237,8 +1237,17 @@
 // "//" path (on which GURL::Resolve() currently fails due to
 // https://crbug.com/1034197), and that the resulting SiteInstance has a valid
 // site URL. See https://crbug.com/1016954.
+// The navigation currently fails/results in a 404 on Windows, so it's currently
+// disabled.  TODO(crbug.com/1137323): Fix this.
+#if defined(OS_WIN)
+#define MAYBE_NavigateToAppURLWithDoubleSlashPath \
+  DISABLED_NavigateToAppURLWithDoubleSlashPath
+#else
+#define MAYBE_NavigateToAppURLWithDoubleSlashPath \
+  NavigateToAppURLWithDoubleSlashPath
+#endif
 IN_PROC_BROWSER_TEST_P(HostedAppProcessModelTest,
-                       NavigateToAppURLWithDoubleSlashPath) {
+                       MAYBE_NavigateToAppURLWithDoubleSlashPath) {
   // Set up and launch the hosted app.
   GURL app_url =
       embedded_test_server()->GetURL("app.site.com", "/frame_tree/simple.htm");
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
index 64b2c9e..7b5065d 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
@@ -20,7 +20,6 @@
 #include "ui/views/border.h"
 #include "ui/views/bubble/bubble_border.h"
 #include "ui/views/bubble/bubble_frame_view.h"
-#include "ui/views/controls/button/button.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/client_view.h"
@@ -106,14 +105,18 @@
 
 // The contents view for an App List Dialog, which covers the entire app list
 // and adds a close button.
-class AppListDialogContainer : public BaseDialogContainer,
-                               public views::ButtonListener {
+class AppListDialogContainer : public BaseDialogContainer {
  public:
   explicit AppListDialogContainer(std::unique_ptr<views::View> dialog_body)
       : BaseDialogContainer(std::move(dialog_body), base::RepeatingClosure()) {
     SetBackground(std::make_unique<AppListOverlayBackground>());
-    close_button_ =
-        AddChildView(views::BubbleFrameView::CreateCloseButton(this));
+    close_button_ = AddChildView(
+        views::BubbleFrameView::CreateCloseButton(base::BindRepeating(
+            [](AppListDialogContainer* container) {
+              container->GetWidget()->CloseWithReason(
+                  views::Widget::ClosedReason::kCloseButtonClicked);
+            },
+            base::Unretained(this))));
   }
   ~AppListDialogContainer() override {}
 
@@ -137,16 +140,6 @@
     return std::make_unique<views::NativeFrameView>(widget);
   }
 
-  // views::ButtonListener:
-  void ButtonPressed(views::Button* sender, const ui::Event& event) override {
-    if (sender == close_button_) {
-      GetWidget()->CloseWithReason(
-          views::Widget::ClosedReason::kCloseButtonClicked);
-    } else {
-      NOTREACHED();
-    }
-  }
-
   views::Button* close_button_;
 
   DISALLOW_COPY_AND_ASSIGN(AppListDialogContainer);
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc
index 536a5c0a..724e9f9 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc
@@ -62,24 +62,31 @@
   if (CanCreateShortcuts(app_)) {
     create_shortcuts_button_ =
         AddChildView(std::make_unique<views::MdTextButton>(
-            this, l10n_util::GetStringUTF16(
-                      IDS_APPLICATION_INFO_CREATE_SHORTCUTS_BUTTON_TEXT)));
+            base::BindRepeating(&AppInfoFooterPanel::CreateShortcuts,
+                                base::Unretained(this)),
+            l10n_util::GetStringUTF16(
+                IDS_APPLICATION_INFO_CREATE_SHORTCUTS_BUTTON_TEXT)));
   }
 
 #if defined(OS_CHROMEOS)
   if (CanSetPinnedToShelf(profile_, app_)) {
     pin_to_shelf_button_ = AddChildView(std::make_unique<views::MdTextButton>(
-        this, l10n_util::GetStringUTF16(IDS_APP_LIST_CONTEXT_MENU_PIN)));
+        base::BindRepeating(&AppInfoFooterPanel::SetPinnedToShelf,
+                            base::Unretained(this), true),
+        l10n_util::GetStringUTF16(IDS_APP_LIST_CONTEXT_MENU_PIN)));
     unpin_from_shelf_button_ =
         AddChildView(std::make_unique<views::MdTextButton>(
-            this, l10n_util::GetStringUTF16(IDS_APP_LIST_CONTEXT_MENU_UNPIN)));
+            base::BindRepeating(&AppInfoFooterPanel::SetPinnedToShelf,
+                                base::Unretained(this), false),
+            l10n_util::GetStringUTF16(IDS_APP_LIST_CONTEXT_MENU_UNPIN)));
     UpdatePinButtons(false);
   }
 #endif
 
   if (CanUninstallApp(profile_, app_)) {
     remove_button_ = AddChildView(std::make_unique<views::MdTextButton>(
-        this,
+        base::BindRepeating(&AppInfoFooterPanel::UninstallApp,
+                            base::Unretained(this)),
         l10n_util::GetStringUTF16(IDS_APPLICATION_INFO_UNINSTALL_BUTTON_TEXT)));
   }
 }
@@ -102,23 +109,6 @@
 }
 #endif
 
-void AppInfoFooterPanel::ButtonPressed(views::Button* sender,
-                                       const ui::Event& event) {
-  if (sender == create_shortcuts_button_) {
-    CreateShortcuts();
-#if defined(OS_CHROMEOS)
-  } else if (sender == pin_to_shelf_button_) {
-    SetPinnedToShelf(true);
-  } else if (sender == unpin_from_shelf_button_) {
-    SetPinnedToShelf(false);
-#endif
-  } else if (sender == remove_button_) {
-    UninstallApp();
-  } else {
-    NOTREACHED();
-  }
-}
-
 void AppInfoFooterPanel::OnExtensionUninstallDialogClosed(
     bool did_start_uninstall,
     const base::string16& error) {
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h b/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h
index 688e172..2a791f6 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h
@@ -12,7 +12,6 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
 #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_panel.h"
-#include "ui/views/controls/button/button.h"
 
 class Profile;
 
@@ -20,15 +19,10 @@
 class Extension;
 }
 
-namespace ui {
-class Event;
-}
-
 // A small summary panel with buttons to control the app that is displayed at
 // the bottom of the app info dialog.
 class AppInfoFooterPanel
     : public AppInfoPanel,
-      public views::ButtonListener,
       public extensions::ExtensionUninstallDialog::Delegate,
       public base::SupportsWeakPtr<AppInfoFooterPanel> {
  public:
@@ -54,9 +48,6 @@
   void UpdatePinButtons(bool focus_visible_button);
 #endif  // OS_CHROMEOS
 
-  // Overridden from views::ButtonListener:
-  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
   // Overridden from ExtensionUninstallDialog::Delegate:
   void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
                                         const base::string16& error) override;
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc
index 1017f161..a61df59 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc
@@ -28,7 +28,6 @@
 #include "ui/gfx/text_constants.h"
 #include "ui/resources/grit/ui_resources.h"
 #include "ui/views/border.h"
-#include "ui/views/controls/button/button.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
@@ -49,11 +48,11 @@
 // Creates a close button that calls |callback| on click and can be placed to
 // the right of a bullet in the permissions list. The alt-text is set to a
 // revoke message containing the given |permission_message|.
-class RevokeButton : public views::ImageButton, public views::ButtonListener {
+class RevokeButton : public views::ImageButton {
  public:
-  explicit RevokeButton(const base::Closure& callback,
+  explicit RevokeButton(PressedCallback callback,
                         base::string16 permission_message)
-      : views::ImageButton(this), callback_(callback) {
+      : views::ImageButton(std::move(callback)) {
     ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
     SetImage(views::Button::STATE_NORMAL,
              rb.GetImageNamed(IDR_DISABLE).ToImageSkia());
@@ -71,19 +70,9 @@
     SetTooltipText(l10n_util::GetStringFUTF16(
         IDS_APPLICATION_INFO_REVOKE_PERMISSION_ALT_TEXT, permission_message));
   }
-  ~RevokeButton() override {}
-
- private:
-  // Overridden from views::ButtonListener.
-  void ButtonPressed(views::Button* sender, const ui::Event& event) override {
-    DCHECK_EQ(this, sender);
-    if (!callback_.is_null())
-      callback_.Run();
-  }
-
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(RevokeButton);
+  RevokeButton(const RevokeButton&) = delete;
+  RevokeButton& operator=(const RevokeButton&) = delete;
+  ~RevokeButton() override = default;
 };
 
 // A bulleted list of permissions.
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac_browsertest.cc
index b787b0c..0cf884c 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac_browsertest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/prefs/pref_service.h"
@@ -27,8 +26,6 @@
 #include "ui/views/window/non_client_view.h"
 #include "url/gurl.h"
 
-using web_app::ProviderType;
-
 namespace {
 
 class TextChangeWaiter {
@@ -75,7 +72,7 @@
   ~BrowserNonClientFrameViewMacBrowserTest() override = default;
 };
 
-IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewMacBrowserTest, TitleUpdates) {
+IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewMacBrowserTest, TitleUpdates) {
   ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
 
   const GURL start_url = GetInstallableAppURL();
@@ -120,7 +117,7 @@
 
 // Test to make sure the WebAppToolbarFrame triggers an InvalidateLayout() when
 // toggled in fullscreen mode.
-IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewMacBrowserTest,
                        ToolbarLayoutFullscreenTransition) {
   ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
 
@@ -154,9 +151,3 @@
   // invalidation.
   EXPECT_TRUE(frame_view_test_api.needs_layout());
 }
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         BrowserNonClientFrameViewMacBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
index c55c370..7ae902e 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ui/views/web_apps/web_app_frame_toolbar_view.h"
 #include "chrome/browser/ui/views/web_apps/web_app_menu_button.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "chrome/test/permissions/permission_request_manager_test_api.h"
@@ -153,7 +152,7 @@
 
 // Test the layout and visibility of the TopContainerView and web contents when
 // a web app is put into immersive fullscreen.
-IN_PROC_BROWSER_TEST_P(ImmersiveModeControllerAshWebAppBrowserTest, Layout) {
+IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerAshWebAppBrowserTest, Layout) {
   LaunchAppBrowser();
   TabStrip* tabstrip = browser_view()->tabstrip();
   ToolbarView* toolbar = browser_view()->toolbar();
@@ -214,7 +213,7 @@
 // autohidden in tablet mode).
 
 // Crashes on Linux Chromium OS ASan LSan Tests.  http://crbug.com/1091606
-IN_PROC_BROWSER_TEST_P(ImmersiveModeControllerAshWebAppBrowserTest,
+IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerAshWebAppBrowserTest,
                        DISABLED_ImmersiveModeStatusTabletMode) {
   LaunchAppBrowser();
   ASSERT_FALSE(controller()->IsEnabled());
@@ -265,7 +264,7 @@
 
 // Verify that the frame layout is as expected when using immersive mode in
 // tablet mode.
-IN_PROC_BROWSER_TEST_P(ImmersiveModeControllerAshWebAppBrowserTest,
+IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerAshWebAppBrowserTest,
                        FrameLayoutToggleTabletMode) {
   LaunchAppBrowser();
   ASSERT_FALSE(controller()->IsEnabled());
@@ -304,7 +303,7 @@
 
 // Verify that the frame layout for new windows is as expected when using
 // immersive mode in tablet mode.
-IN_PROC_BROWSER_TEST_P(ImmersiveModeControllerAshWebAppBrowserTest,
+IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerAshWebAppBrowserTest,
                        FrameLayoutStartInTabletMode) {
   // Start in tablet mode
   ash::ShellTestApi().SetTabletModeEnabledForTest(true);
@@ -338,7 +337,7 @@
 // but still drawn. In this case, we should have a null anchor view so that the
 // bubble gets placed in the default top left corner. Regression test for
 // https://crbug.com/1087143.
-IN_PROC_BROWSER_TEST_P(ImmersiveModeControllerAshWebAppBrowserTest,
+IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerAshWebAppBrowserTest,
                        PermissionsBubbleAnchor) {
   LaunchAppBrowser();
   auto test_api =
@@ -382,9 +381,3 @@
   EXPECT_FALSE(immersive_mode_controller->IsRevealed());
   EXPECT_FALSE(bubble_dialog->GetAnchorView());
 }
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         ImmersiveModeControllerAshWebAppBrowserTest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
diff --git a/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc b/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
index c1cb10d..d6313c62 100644
--- a/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -244,7 +243,7 @@
 };
 
 // Check the custom tab bar is not instantiated for a tabbed browser window.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        IsNotCreatedInTabbedBrowser) {
   EXPECT_TRUE(browser()->is_type_normal());
   EXPECT_TRUE(browser_view_->IsBrowserTypeNormal());
@@ -252,7 +251,7 @@
 }
 
 // Check the custom tab bar is not instantiated for a popup window.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest, IsNotCreatedInPopup) {
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest, IsNotCreatedInPopup) {
   Browser* popup = OpenPopup(browser_view_->GetActiveWebContents(),
                              GURL("http://example.com"));
   EXPECT_TRUE(popup);
@@ -269,7 +268,7 @@
   EXPECT_FALSE(popup_view->toolbar()->custom_tab_bar());
 }
 
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        BackToAppButtonIsNotVisibleInOutOfScopePopups) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   const GURL out_of_scope_url = GURL("https://example.com");
@@ -295,7 +294,7 @@
 }
 
 // Check the custom tab will be used for a Desktop PWA.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest, IsUsedForDesktopPWA) {
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest, IsUsedForDesktopPWA) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   const GURL url = https_server()->GetURL("app.com", "/ssl/google.html");
@@ -315,7 +314,7 @@
 
 // Check the CustomTabBarView appears when a PWA window attempts to load
 // insecure content.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest, ShowsWithMixedContent) {
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest, ShowsWithMixedContent) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   const GURL url = https_server()->GetURL("app.com", "/ssl/google.html");
@@ -344,7 +343,7 @@
 
 // The custom tab bar should update with the title and location of the current
 // page.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest, TitleAndLocationUpdate) {
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest, TitleAndLocationUpdate) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
 
   // This url is out of scope, because the CustomTabBar is not updated when it
@@ -371,7 +370,7 @@
 }
 
 // If the page doesn't specify a title, we should use the origin.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        UsesLocationInsteadOfEmptyTitles) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   InstallPWA(app_url);
@@ -392,7 +391,7 @@
 }
 
 // Closing the CCT should take you back to the last in scope url.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        OutOfScopeUrlShouldBeClosable) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   InstallPWA(app_url);
@@ -430,7 +429,7 @@
 #else
 #define MAYBE_RightClickMenuShowsCopyUrl RightClickMenuShowsCopyUrl
 #endif
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        MAYBE_RightClickMenuShowsCopyUrl) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   InstallPWA(app_url);
@@ -463,7 +462,7 @@
 
 // Paths above the launch url should be out of scope and should be closable from
 // the CustomTabBar.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        ScopeAboveLaunchURLShouldBeOutOfScopeAndClosable) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   InstallPWA(app_url);
@@ -498,7 +497,7 @@
 
 // When there are no in scope urls to navigate back to, closing the custom tab
 // bar should navigate to the app's launch url.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     CustomTabBarViewBrowserTest,
     WhenNoHistoryIsInScopeCloseShouldNavigateToAppLaunchURL) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
@@ -530,7 +529,7 @@
   EXPECT_EQ(app_url, web_contents->GetLastCommittedURL());
 }
 
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        OriginsWithEmojiArePunyCoded) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   const GURL navigate_to = GURL("https://🔒.example/ssl/blank_page.html");
@@ -552,7 +551,7 @@
             app_view->toolbar()->custom_tab_bar()->title_for_testing());
 }
 
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        OriginsWithNonASCIICharactersDisplayNormally) {
   const GURL app_url = https_server()->GetURL("app.com", "/ssl/google.html");
   const GURL navigate_to = GURL("https://ΐ.example/ssl/blank_page.html");
@@ -574,7 +573,7 @@
             app_view->toolbar()->custom_tab_bar()->title_for_testing());
 }
 
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        BackToAppButtonIsNotVisibleInScope) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -626,7 +625,7 @@
                    ->GetVisible());
 }
 
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest,
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest,
                        BackToAppButtonIsNotVisibleInBookmarkAppOnOrigin) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -660,7 +659,7 @@
 }
 
 // Verify that interstitials that hide origin have their preference respected.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest, InterstitialCanHideOrigin) {
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest, InterstitialCanHideOrigin) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   InstallPWA(https_server()->GetURL("app.com", "/ssl/google.html"));
@@ -694,7 +693,7 @@
 }
 
 // Verify that blob URLs are displayed in the location text.
-IN_PROC_BROWSER_TEST_P(CustomTabBarViewBrowserTest, BlobUrlLocation) {
+IN_PROC_BROWSER_TEST_F(CustomTabBarViewBrowserTest, BlobUrlLocation) {
   InstallPWA(https_server()->GetURL("/simple.html"));
   EXPECT_TRUE(app_browser_);
   EXPECT_TRUE(app_browser_->is_type_app());
@@ -720,9 +719,3 @@
           base::ASCIIToUTF16("/"),
       base::ASCIIToUTF16(https_server()->GetURL("/").spec()));
 }
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         CustomTabBarViewBrowserTest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
diff --git a/chrome/browser/ui/views/web_apps/web_app_ash_interactive_ui_test.cc b/chrome/browser/ui/views/web_apps/web_app_ash_interactive_ui_test.cc
index 4652a3c..636a319 100644
--- a/chrome/browser/ui/views/web_apps/web_app_ash_interactive_ui_test.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_ash_interactive_ui_test.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/views/web_apps/web_app_frame_toolbar_view.h"
 #include "chrome/browser/ui/views/web_apps/web_app_menu_button.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "content/public/test/browser_test.h"
@@ -67,12 +66,12 @@
 };
 
 // Test that the web app menu button opens a menu on click.
-IN_PROC_BROWSER_TEST_P(WebAppAshInteractiveUITest, MenuButtonClickable) {
+IN_PROC_BROWSER_TEST_F(WebAppAshInteractiveUITest, MenuButtonClickable) {
   CheckWebAppMenuClickable();
 }
 
 // Test that the web app menu button opens a menu on click in immersive mode.
-IN_PROC_BROWSER_TEST_P(WebAppAshInteractiveUITest,
+IN_PROC_BROWSER_TEST_F(WebAppAshInteractiveUITest,
                        ImmersiveMenuButtonClickable) {
   FullscreenNotificationObserver waiter(browser());
   chrome::ToggleFullscreenMode(browser());
@@ -84,9 +83,3 @@
 
   CheckWebAppMenuClickable();
 }
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppAshInteractiveUITest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
diff --git a/chrome/browser/ui/views/web_apps/web_app_minimal_ui_test.cc b/chrome/browser/ui/views/web_apps/web_app_minimal_ui_test.cc
index 7aa2f5c..9e6a733 100644
--- a/chrome/browser/ui/views/web_apps/web_app_minimal_ui_test.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_minimal_ui_test.cc
@@ -6,7 +6,6 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "content/public/test/browser_test.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
@@ -32,7 +31,7 @@
   DISALLOW_COPY_AND_ASSIGN(WebAppMinimalUITest);
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppMinimalUITest, Standalone) {
+IN_PROC_BROWSER_TEST_F(WebAppMinimalUITest, Standalone) {
   BrowserView* browser_view =
       CreateBrowserView(blink::mojom::DisplayMode::kStandalone);
   ToolbarButtonProvider* provider = browser_view->toolbar_button_provider();
@@ -40,7 +39,7 @@
   EXPECT_FALSE(provider->GetReloadButton());
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMinimalUITest, MinimalUi) {
+IN_PROC_BROWSER_TEST_F(WebAppMinimalUITest, MinimalUi) {
   BrowserView* browser_view =
       CreateBrowserView(blink::mojom::DisplayMode::kMinimalUi);
   ToolbarButtonProvider* provider = browser_view->toolbar_button_provider();
@@ -48,10 +47,4 @@
   EXPECT_TRUE(provider->GetReloadButton());
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppMinimalUITest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
index 5ed27f3a..7c95bf8 100644
--- a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
+++ b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/web_applications/components/web_app_prefs_utils.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
 #include "chrome/browser/web_applications/test/web_app_install_observer.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "url/gurl.h"
@@ -52,7 +51,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest,
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest,
                        CreateShortcutForInstallableSite) {
   base::UserActionTester user_action_tester;
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
@@ -66,7 +65,7 @@
   EXPECT_EQ(1, user_action_tester.GetActionCount("CreateShortcut"));
 }
 
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest, InstallSourceRecorded) {
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, InstallSourceRecorded) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // LatestWebAppInstallSource should be correctly set and reported to UMA for
@@ -89,7 +88,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest,
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest,
                        CanInstallOverTabShortcutApp) {
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
   InstallShortcutAppForCurrentUrl();
@@ -103,7 +102,7 @@
             kNotPresent);
 }
 
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest,
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest,
                        CannotInstallOverWindowShortcutApp) {
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
   AppId app_id = InstallShortcutAppForCurrentUrl();
@@ -124,7 +123,7 @@
 // This simulates a case where the user has manually navigated to a page hosted
 // within an extension, then added it as a shortcut app.
 // Regression test for https://crbug.com/828233.
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest,
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest,
                        ShouldShowCustomTabBarForExtensionPage) {
   // This involves the creation of a regular (non-app) extension with a popup
   // page, and the creation of a shortcut app created from the popup page URL
@@ -152,7 +151,7 @@
 
 // Tests that Create Shortcut doesn't timeout on a page that has a delayed
 // iframe load. Context: crbug.com/1046883
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest, WorksAfterDelayedIFrameLoad) {
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, WorksAfterDelayedIFrameLoad) {
   ASSERT_TRUE(embedded_test_server()->Start());
   NavigateToURLAndWait(browser(), embedded_test_server()->GetURL(
                                       "/favicon/page_with_favicon.html"));
@@ -174,7 +173,7 @@
 
 // Tests that Create Shortcut on non-promotable sites still uses available
 // manifest data.
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest,
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest,
                        UseNonPromotableManifestData) {
   ASSERT_TRUE(embedded_test_server()->Start());
   NavigateToURLAndWait(browser(),
@@ -186,7 +185,7 @@
 }
 
 // Tests that Create Shortcut won't use manifest data that's invalid.
-IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest, IgnoreInvalidManifestData) {
+IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, IgnoreInvalidManifestData) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url = embedded_test_server()->GetURL(
       "/web_apps/invalid_start_url_manifest.html");
@@ -195,10 +194,4 @@
   EXPECT_EQ(registrar().GetAppStartUrl(app_id), url);
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         CreateShortcutBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc b/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc
index 24406f7..1f8dd96 100644
--- a/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc
+++ b/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -99,7 +98,7 @@
 
 // Tests that creating a shortcut app but not installing a PWA is available for
 // a non-installable site.
-IN_PROC_BROWSER_TEST_P(PWAMixedContentBrowserTest,
+IN_PROC_BROWSER_TEST_F(PWAMixedContentBrowserTest,
                        ShortcutMenuOptionsForNonInstallableSite) {
   EXPECT_FALSE(
       NavigateAndAwaitInstallabilityCheck(browser(), GetMixedContentAppURL()));
@@ -109,7 +108,7 @@
 }
 
 // Tests that mixed content is loaded inside PWA windows.
-IN_PROC_BROWSER_TEST_P(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
+IN_PROC_BROWSER_TEST_F(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
                        MixedContentInPWA) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -122,7 +121,7 @@
 
 // Tests that when calling OpenInChrome, mixed content can be loaded in the new
 // tab.
-IN_PROC_BROWSER_TEST_P(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
+IN_PROC_BROWSER_TEST_F(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
                        MixedContentOpenInChrome) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -159,7 +158,7 @@
 
 // Tests that when calling ReparentWebContentsIntoAppBrowser, mixed
 // content cannot be loaded in the new app window.
-IN_PROC_BROWSER_TEST_P(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
+IN_PROC_BROWSER_TEST_F(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
                        MixedContentReparentWebContentsIntoAppBrowser) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -198,7 +197,7 @@
 }
 
 // Tests that mixed content is not loaded inside iframes in PWA windows.
-IN_PROC_BROWSER_TEST_P(PWAMixedContentBrowserTest, IFrameMixedContentInPWA) {
+IN_PROC_BROWSER_TEST_F(PWAMixedContentBrowserTest, IFrameMixedContentInPWA) {
   const GURL app_url = GetSecureIFrameAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -208,7 +207,7 @@
 
 // Tests that iframes can't dynamically load mixed content in a PWA window, when
 // the iframe was created in a regular tab.
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     PWAMixedContentBrowserTestWithAutoupgradesDisabled,
     IFrameDynamicMixedContentInPWAReparentWebContentsIntoAppBrowser) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -242,7 +241,7 @@
 #define MAYBE_IFrameDynamicMixedContentInPWAOpenInChrome \
   IFrameDynamicMixedContentInPWAOpenInChrome
 #endif
-IN_PROC_BROWSER_TEST_P(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
+IN_PROC_BROWSER_TEST_F(PWAMixedContentBrowserTestWithAutoupgradesDisabled,
                        MAYBE_IFrameDynamicMixedContentInPWAOpenInChrome) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -262,16 +261,4 @@
   CheckMixedContentLoaded(browser());
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         PWAMixedContentBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         PWAMixedContentBrowserTestWithAutoupgradesDisabled,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc b/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
index 5372533..eae3acf 100644
--- a/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
+++ b/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/check_op.h"
+#include "base/debug/dump_without_crashing.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/metrics/histogram_functions.h"
@@ -18,6 +19,7 @@
 #include "chrome/browser/apps/app_service/app_service_metrics.h"
 #include "chrome/browser/apps/app_service/launch_utils.h"
 #include "chrome/browser/chromeos/printing/print_management/print_management_uma.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/installable/installable_params.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_list.h"
@@ -35,10 +37,45 @@
 #include "chrome/browser/web_launch/web_launch_files_helper.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
+#include "content/public/common/content_switches.h"
 #include "third_party/blink/public/common/features.h"
 #include "ui/base/window_open_disposition.h"
 #include "ui/display/types/display_constants.h"
 
+namespace {
+// Returns the profile where we should launch System Web Apps into. It returns
+// the most appropriate profile for launching, if the provided |profile| is
+// unsuitable. It returns nullptr if the we can't find a suitable profile.
+Profile* GetProfileForSystemWebAppLaunch(Profile* profile) {
+  DCHECK(profile);
+
+  // We can't launch into certain profiles, and we can't find a suitable
+  // alternative.
+  if (profile->IsSystemProfile())
+    return nullptr;
+#if defined(OS_CHROMEOS)
+  if (chromeos::ProfileHelper::IsSigninProfile(profile))
+    return nullptr;
+#endif
+
+  // For a guest sessions, launch into the primary off-the-record profile, which
+  // is used for browsing in guest sessions. We do this because the "original"
+  // profile of the guest session can't create windows.
+  if (profile->IsGuestSession())
+    return profile->GetPrimaryOTRProfile();
+
+  // We don't support launching SWA in incognito profiles, use the original
+  // profile if an incognito profile is provided (with the exception of guest
+  // session, which is implemented with an incognito profile, thus it is handled
+  // above).
+  if (profile->IsIncognitoProfile())
+    return profile->GetOriginalProfile();
+
+  // Use the profile provided in other scenarios.
+  return profile;
+}
+}  // namespace
+
 namespace web_app {
 namespace {
 
@@ -122,20 +159,42 @@
                             const GURL& url,
                             base::Optional<apps::AppLaunchParams> params,
                             bool* did_create) {
-  auto* provider = WebAppProvider::Get(profile);
+  Profile* profile_for_launch = GetProfileForSystemWebAppLaunch(profile);
+  if (profile_for_launch == nullptr || profile_for_launch != profile) {
+    // The provided profile can't launch system web apps. Complain about this so
+    // we can catch the call site, and ask them to pick the right profile.
+    base::debug::DumpWithoutCrashing();
+
+    DVLOG(1) << "LaunchSystemWebApp is called on a profile that can't launch "
+                "system  web apps. Please check the profile you are using is "
+                "correct."
+             << (profile_for_launch
+                     ? "Instead, launch the app into a suitable profile "
+                       "based on your intention."
+                     : "Can't find a suitable profile based on the provided "
+                       "argument. Thus ignore the launch request.");
+
+    NOTREACHED();
+
+    if (profile_for_launch == nullptr)
+      return nullptr;
+  }
+
+  auto* provider = WebAppProvider::Get(profile_for_launch);
 
   if (!provider)
     return nullptr;
 
   if (!params) {
-    params = CreateSystemWebAppLaunchParams(profile, app_type,
+    params = CreateSystemWebAppLaunchParams(profile_for_launch, app_type,
                                             display::kInvalidDisplayId);
   }
   if (!params)
     return nullptr;
   params->override_url = url;
 
-  DCHECK_EQ(params->app_id, *GetAppIdForSystemWebApp(profile, app_type));
+  DCHECK_EQ(params->app_id,
+            *GetAppIdForSystemWebApp(profile_for_launch, app_type));
 
   // TODO(crbug/1117655): The file manager records metrics directly when opening
   // a file registered to an app, but can't tell if an SWA will ultimately be
@@ -159,7 +218,8 @@
     browser_type = Browser::TYPE_APP_POPUP;
   if (browser_type == Browser::TYPE_APP_POPUP ||
       provider->system_web_app_manager().IsSingleWindow(app_type)) {
-    browser = FindSystemWebAppBrowser(profile, app_type, browser_type);
+    browser =
+        FindSystemWebAppBrowser(profile_for_launch, app_type, browser_type);
   }
 
   // We create the app window if no existing browser found.
@@ -172,9 +232,10 @@
   // CCA supports responsive UI.
   bool can_resize = app_type != SystemAppType::CAMERA;
   if (base::FeatureList::IsEnabled(features::kDesktopPWAsWithoutExtensions)) {
-    if (!browser)
-      browser = CreateWebApplicationWindow(profile, params->app_id,
+    if (!browser) {
+      browser = CreateWebApplicationWindow(profile_for_launch, params->app_id,
                                            params->disposition, can_resize);
+    }
 
     // Navigate application window to application's |url| if necessary.
     // Help app always navigates because its url might not match the url inside
@@ -186,8 +247,10 @@
           browser, params->app_id, url, WindowOpenDisposition::CURRENT_TAB);
     }
   } else {
-    if (!browser)
-      browser = CreateApplicationWindow(profile, *params, url, can_resize);
+    if (!browser) {
+      browser =
+          CreateApplicationWindow(profile_for_launch, *params, url, can_resize);
+    }
 
     // Navigate application window to application's |url| if necessary.
     // Help app always navigates because its url might not match the url inside
diff --git a/chrome/browser/ui/web_applications/test/system_web_app_ui_browsertest.cc b/chrome/browser/ui/web_applications/test/system_web_app_ui_browsertest.cc
index 7499275b..0346e68 100644
--- a/chrome/browser/ui/web_applications/test/system_web_app_ui_browsertest.cc
+++ b/chrome/browser/ui/web_applications/test/system_web_app_ui_browsertest.cc
@@ -8,7 +8,9 @@
 #include <vector>
 
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/gtest_util.h"
 #include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
@@ -392,11 +394,19 @@
                           ->GetLastCommittedURL());
 }
 
-// TODO(crbug.com/1109594): Update this when we decide if SWAs can be
-// link-captured to standalone incognito windows. Currently, the SWA gets
-// launched into a standalone browser window in incognito profile.
+// TODO(crbug.com/1135863): Decide and formalize this behavior. This test is
+// disabled in DCHECK builds, because it hits a DCHECK in LaunchSystemWebApp. In
+// production builds, SWA is link captured to the original profile. The goal is
+// to behave reasonably, and not crashing.
+#if DCHECK_IS_ON()
+#define MAYBE_IncognitoBrowserOmniboxLinkCapture \
+  DISABLED_IncognitoBrowserOmniboxLinkCapture
+#else
+#define MAYBE_IncognitoBrowserOmniboxLinkCapture \
+  IncognitoBrowserOmniboxLinkCapture
+#endif
 IN_PROC_BROWSER_TEST_P(SystemWebAppLinkCaptureBrowserTest,
-                       IncognitoBrowserOmniboxLinkCapture) {
+                       MAYBE_IncognitoBrowserOmniboxLinkCapture) {
   WaitForTestSystemAppInstall();
 
   Browser* incognito_browser = CreateIncognitoBrowser();
@@ -410,8 +420,10 @@
       incognito_browser, maybe_installation_->GetAppUrl().spec());
   observer.Wait();
 
+  // We launch SWAs into the incognito profile's original profile.
   Browser* app_browser = FindSystemWebAppBrowser(
-      incognito_browser->profile(), maybe_installation_->GetType());
+      incognito_browser->profile()->GetOriginalProfile(),
+      maybe_installation_->GetType());
   EXPECT_TRUE(app_browser);
   EXPECT_EQ(app_browser, chrome::FindLastActive());
   EXPECT_EQ(2U, chrome::GetTotalBrowserCount());
@@ -419,7 +431,94 @@
   EXPECT_FALSE(app_browser->app_controller()->ShouldShowCustomTabBar());
 }
 
+// The following tests are disabled in DCHECK builds. LaunchSystemWebApp DCHECKs
+// if the wrong profile is used. EXPECT_DCHECK_DEATH (or its variants) aren't
+// reliable in browsertests, so we don't test this. This is okay because these
+// tests are used to verify that in release builds, LaunchSystemWebApp doesn't
+// crash and behaves reasonably (pick an appropriate profile).
+#if defined(OS_CHROMEOS) && !DCHECK_IS_ON()
+using SystemWebAppLaunchProfileBrowserTest = SystemWebAppManagerBrowserTest;
+
+IN_PROC_BROWSER_TEST_P(SystemWebAppLaunchProfileBrowserTest,
+                       LaunchFromNormalSessionIncognitoProfile) {
+  Profile* startup_profile = browser()->profile();
+  ASSERT_TRUE(startup_profile->IsRegularProfile());
+
+  WaitForTestSystemAppInstall();
+  Profile* incognito_profile = startup_profile->GetPrimaryOTRProfile();
+
+  Browser* result_browser =
+      LaunchSystemWebApp(incognito_profile, GetMockAppType(),
+                         GetStartUrl(LaunchParamsForApp(GetMockAppType())));
+  EXPECT_EQ(startup_profile, result_browser->profile());
+  EXPECT_TRUE(result_browser->profile()->IsRegularProfile());
+}
+
+IN_PROC_BROWSER_TEST_P(SystemWebAppLaunchProfileBrowserTest,
+                       LaunchFromSignInProfile) {
+  WaitForTestSystemAppInstall();
+
+  Profile* signin_profile = chromeos::ProfileHelper::GetSigninProfile();
+
+  Browser* result_browser =
+      LaunchSystemWebApp(signin_profile, GetMockAppType(),
+                         GetStartUrl(LaunchParamsForApp(GetMockAppType())));
+  EXPECT_EQ(nullptr, result_browser);
+}
+
+using SystemWebAppLaunchProfileGuestSessionBrowserTest =
+    SystemWebAppLaunchProfileBrowserTest;
+
+IN_PROC_BROWSER_TEST_P(SystemWebAppLaunchProfileGuestSessionBrowserTest,
+                       LaunchFromGuestSessionOriginalProfile) {
+  // We should start into the guest session browsing profile.
+  Profile* startup_profile = browser()->profile();
+  ASSERT_TRUE(startup_profile->IsGuestSession());
+  ASSERT_TRUE(startup_profile->IsPrimaryOTRProfile());
+
+  WaitForTestSystemAppInstall();
+
+  // We typically don't get the original profile as an argument, but it is a
+  // valid input to LaunchSystemWebApp.
+  Profile* original_profile = browser()->profile()->GetOriginalProfile();
+
+  Browser* result_browser =
+      LaunchSystemWebApp(original_profile, GetMockAppType(),
+                         GetStartUrl(LaunchParamsForApp(GetMockAppType())));
+
+  EXPECT_EQ(startup_profile, result_browser->profile());
+  EXPECT_TRUE(result_browser->profile()->IsGuestSession());
+  EXPECT_TRUE(result_browser->profile()->IsPrimaryOTRProfile());
+}
+
+IN_PROC_BROWSER_TEST_P(SystemWebAppLaunchProfileGuestSessionBrowserTest,
+                       LaunchFromGuestSessionPrimaryOTRProfile) {
+  // We should start into the guest session browsing profile.
+  Profile* startup_profile = browser()->profile();
+  ASSERT_TRUE(startup_profile->IsGuestSession());
+  ASSERT_TRUE(startup_profile->IsPrimaryOTRProfile());
+
+  WaitForTestSystemAppInstall();
+
+  Browser* result_browser =
+      LaunchSystemWebApp(startup_profile, GetMockAppType(),
+                         GetStartUrl(LaunchParamsForApp(GetMockAppType())));
+
+  EXPECT_EQ(startup_profile, result_browser->profile());
+  EXPECT_TRUE(result_browser->profile()->IsGuestSession());
+  EXPECT_TRUE(result_browser->profile()->IsPrimaryOTRProfile());
+}
+#endif  // defined(OS_CHROMEOS) && !DCHECK_IS_ON()
+
 INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_ALL_INSTALL_TYPES_P(
     SystemWebAppLinkCaptureBrowserTest);
 
+#if defined(OS_CHROMEOS) && !DCHECK_IS_ON()
+INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_ALL_INSTALL_TYPES_P(
+    SystemWebAppLaunchProfileBrowserTest);
+
+INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_GUEST_SESSION_P(
+    SystemWebAppLaunchProfileGuestSessionBrowserTest);
+#endif
+
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_badging_browsertest.cc b/chrome/browser/ui/web_applications/web_app_badging_browsertest.cc
index 161605b..9f20791 100644
--- a/chrome/browser/ui/web_applications/web_app_badging_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_badging_browsertest.cc
@@ -9,7 +9,6 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
@@ -271,7 +270,7 @@
 
 // Tests that the badge for the main frame is not affected by changing the badge
 // of a cross site subframe.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest,
                        CrossSiteFrameCannotChangeMainFrameBadge) {
   // Clearing from cross site frame should affect only the cross site app.
   ExecuteScriptAndWaitForBadgeChange("navigator.clearAppBadge()",
@@ -293,7 +292,7 @@
 
 // Tests that setting the badge to an integer will be propagated across
 // processes.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeSetToAnInteger) {
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest, BadgeCanBeSetToAnInteger) {
   ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(99)", main_frame_);
   BadgeChange badge_change;
   ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
@@ -303,7 +302,7 @@
 }
 
 // Tests that calls to |Badge.clear| are propagated across processes.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest,
                        BadgeCanBeClearedWithClearMethod) {
   ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(55)", main_frame_);
   BadgeChange badge_change;
@@ -321,7 +320,7 @@
 
 // Tests that calling Badge.set(0) is equivalent to calling |Badge.clear| and
 // that it propagates across processes.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeClearedWithZero) {
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest, BadgeCanBeClearedWithZero) {
   ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge(0)", main_frame_);
   BadgeChange badge_change;
   ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
@@ -331,7 +330,7 @@
 }
 
 // Tests that setting the badge without content is propagated across processes.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeCanBeSetWithoutAValue) {
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest, BadgeCanBeSetWithoutAValue) {
   ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge()", main_frame_);
   BadgeChange badge_change;
   ASSERT_NO_FATAL_FAILURE(GetBadgeChange(main_app_id(), &badge_change));
@@ -341,7 +340,7 @@
 }
 
 // Tests that the badge can be set and cleared from an in scope frame.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest,
                        BadgeCanBeSetAndClearedFromInScopeFrame) {
   ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge()",
                                      in_scope_frame_);
@@ -361,7 +360,7 @@
 
 // Tests that changing the badge of a subframe with an app affects the
 // subframe's app.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, SubFrameBadgeAffectsSubApp) {
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest, SubFrameBadgeAffectsSubApp) {
   ExecuteScriptAndWaitForBadgeChange("navigator.setAppBadge()", sub_app_frame_);
   BadgeChange badge_change;
   ASSERT_NO_FATAL_FAILURE(GetBadgeChange(sub_app_id(), &badge_change));
@@ -379,7 +378,7 @@
 
 // Tests that setting a badge on a subframe with an app only effects the sub
 // app.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeSubFrameAppViaNavigator) {
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest, BadgeSubFrameAppViaNavigator) {
   ExecuteScriptAndWaitForBadgeChange(
       "window['sub-app'].navigator.setAppBadge()", main_frame_);
   BadgeChange badge_change;
@@ -391,7 +390,7 @@
 
 // Tests that setting a badge on a subframe via call() craziness sets the
 // subframe app's badge.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest, BadgeSubFrameAppViaCall) {
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest, BadgeSubFrameAppViaCall) {
   ExecuteScriptAndWaitForBadgeChange(
       "const promise = "
       "  window.navigator.setAppBadge"
@@ -409,7 +408,7 @@
 // Test that badging through a service worker scoped to the sub app updates
 // badges for the sub app only.  These badge updates must not affect the main
 // app.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest,
                        SubAppServiceWorkerBadgeAffectsSubApp) {
   const uint64_t badge_value = 1u;
   SetBadgeInServiceWorkerAndWaitForChanges(sub_app_service_worker_scope_,
@@ -432,7 +431,7 @@
 // Test that badging through a service worker scoped to the main app updates
 // badges for both the main app and the sub app.  Each service worker badge
 // function call must generate 2 badge changes.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest,
                        AppServiceWorkerBadgeAffectsMultipleApps) {
   SetBadgeInServiceWorkerAndWaitForChanges(app_service_worker_scope_,
                                            base::nullopt,
@@ -462,7 +461,7 @@
 }
 
 // Tests that badging incognito windows does not cause a crash.
-IN_PROC_BROWSER_TEST_P(WebAppBadgingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBadgingBrowserTest,
                        BadgingIncognitoWindowsDoesNotCrash) {
   Browser* incognito_browser =
       OpenURLOffTheRecord(profile(), main_frame_->GetLastCommittedURL());
@@ -492,10 +491,4 @@
   ASSERT_EQ("OK", EvalJs(incognito_frame, clear_badge_script));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppBadgingBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc
index 3e886f6d..1f9a5da4 100644
--- a/chrome/browser/ui/web_applications/web_app_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -40,9 +40,7 @@
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
 #include "chrome/browser/web_applications/test/web_app_install_observer.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/sessions/core/tab_restore_service.h"
@@ -153,9 +151,8 @@
   }
 };
 
-// A dedicated test fixture for DisplayOverride, which is supported
-// only for the new web apps mode, and requires a command line switch
-// to enable manifest parsing.
+// A dedicated test fixture for DisplayOverride, which requires a command line
+// switch to enable manifest parsing.
 class WebAppBrowserTest_DisplayOverride : public WebAppBrowserTest {
  public:
   WebAppBrowserTest_DisplayOverride() {
@@ -169,7 +166,7 @@
 
 using WebAppTabRestoreBrowserTest = WebAppBrowserTest;
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ThemeColor) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ThemeColor) {
   {
     const SkColor theme_color = SkColorSetA(SK_ColorBLUE, 0xF0);
     blink::Manifest manifest;
@@ -199,12 +196,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, BackgroundColor) {
-  // This feature is intentionally not implemented for the obsolete bookmark
-  // apps.
-  if (!base::FeatureList::IsEnabled(features::kDesktopPWAsWithoutExtensions))
-    return;
-
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, BackgroundColor) {
   blink::Manifest manifest;
   manifest.start_url = GURL(kExampleURL);
   manifest.scope = GURL(kExampleURL);
@@ -217,7 +209,7 @@
   EXPECT_EQ(provider->registrar().GetAppBackgroundColor(app_id), SK_ColorBLUE);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, BackgroundColorChange) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, BackgroundColorChange) {
   const GURL app_url = GetSecureAppURL();
   auto web_app_info = std::make_unique<WebApplicationInfo>();
   web_app_info->start_url = app_url;
@@ -255,7 +247,7 @@
 
 // This tests that we don't crash when launching a PWA window with an
 // autogenerated user theme set.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, AutoGeneratedUserThemeCrash) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, AutoGeneratedUserThemeCrash) {
   ThemeServiceFactory::GetForProfile(browser()->profile())
       ->BuildAutogeneratedThemeFromColor(SK_ColorBLUE);
 
@@ -267,7 +259,7 @@
 }
 
 // Check the 'Open in Chrome' menu button for web app windows.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, OpenInChrome) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, OpenInChrome) {
   const GURL app_url(kExampleURL);
   const AppId app_id = InstallPWA(app_url);
 
@@ -298,7 +290,7 @@
 }
 
 // Check the 'App info' menu button for web app windows.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, AppInfoOpensPageInfo) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, AppInfoOpensPageInfo) {
   const GURL app_url(kExampleURL);
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowser(app_id);
@@ -318,7 +310,7 @@
 }
 
 // Check that last launch time is set after launch.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, AppLastLaunchTime) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, AppLastLaunchTime) {
   const GURL app_url(kExampleURL);
   const AppId app_id = InstallPWA(app_url);
   auto* provider = WebAppProviderBase::GetProviderBase(profile());
@@ -333,7 +325,7 @@
               before_launch);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, WithMinimalUiButtons) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, WithMinimalUiButtons) {
   EXPECT_TRUE(HasMinimalUiButtons(DisplayMode::kBrowser, base::nullopt,
                                   /*open_as_window=*/true));
   EXPECT_TRUE(HasMinimalUiButtons(DisplayMode::kMinimalUi, base::nullopt,
@@ -345,7 +337,7 @@
                                   /*open_as_window=*/false));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, WithoutMinimalUiButtons) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, WithoutMinimalUiButtons) {
   EXPECT_FALSE(HasMinimalUiButtons(DisplayMode::kStandalone, base::nullopt,
                                    /*open_as_window=*/true));
   EXPECT_FALSE(HasMinimalUiButtons(DisplayMode::kFullscreen, base::nullopt,
@@ -357,7 +349,7 @@
                                    /*open_as_window=*/false));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest_DisplayOverride, DisplayOverride) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest_DisplayOverride, DisplayOverride) {
   GURL test_url = https_server()->GetURL(
       "/banners/"
       "manifest_test_page.html?manifest=manifest_display_override.json");
@@ -374,7 +366,7 @@
   EXPECT_EQ(DisplayMode::kStandalone, app_display_mode_override[1]);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest_DisplayOverride,
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest_DisplayOverride,
                        WithMinimalUiButtons) {
   EXPECT_TRUE(HasMinimalUiButtons(DisplayMode::kStandalone,
                                   DisplayMode::kBrowser,
@@ -391,7 +383,7 @@
                                   /*open_as_window=*/false));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest_DisplayOverride,
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest_DisplayOverride,
                        WithoutMinimalUiButtons) {
   EXPECT_FALSE(HasMinimalUiButtons(DisplayMode::kMinimalUi,
                                    DisplayMode::kStandalone,
@@ -409,7 +401,7 @@
 }
 
 // Tests that desktop PWAs open links in the browser.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, DesktopPWAsOpenLinksInApp) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, DesktopPWAsOpenLinksInApp) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -420,7 +412,7 @@
 
 // Tests that desktop PWAs open links in a new tab at the end of the tabstrip of
 // the last active browser.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, DesktopPWAsOpenLinksInNewTab) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, DesktopPWAsOpenLinksInNewTab) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -453,7 +445,7 @@
 }
 
 // Tests that desktop PWAs are opened at the correct size.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, PWASizeIsCorrectlyRestored) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, PWASizeIsCorrectlyRestored) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -470,7 +462,7 @@
 }
 
 // Tests that desktop PWAs are reopened at the correct size.
-IN_PROC_BROWSER_TEST_P(WebAppTabRestoreBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppTabRestoreBrowserTest,
                        ReopenedPWASizeIsCorrectlyRestored) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
@@ -499,7 +491,7 @@
 
 // Tests that using window.open to create a popup window out of scope results in
 // a correctly sized window.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, OffScopePWAPopupsHaveCorrectSize) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, OffScopePWAPopupsHaveCorrectSize) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowser(app_id);
@@ -530,7 +522,7 @@
 
 // Tests that using window.open to create a popup window in scope results in
 // a correctly sized window.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, InScopePWAPopupsHaveCorrectSize) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, InScopePWAPopupsHaveCorrectSize) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowser(app_id);
@@ -557,7 +549,7 @@
 }
 
 // Tests that app windows are correctly restored.
-IN_PROC_BROWSER_TEST_P(WebAppTabRestoreBrowserTest, RestoreAppWindow) {
+IN_PROC_BROWSER_TEST_F(WebAppTabRestoreBrowserTest, RestoreAppWindow) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -581,7 +573,7 @@
 
 // Test navigating to an out of scope url on the same origin causes the url
 // to be shown to the user.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest,
                        LocationBarIsVisibleOffScopeOnSameOrigin) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
@@ -599,7 +591,7 @@
   ASSERT_TRUE(app_browser->app_controller()->ShouldShowCustomTabBar());
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, UpgradeWithoutCustomTabBar) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, UpgradeWithoutCustomTabBar) {
   const GURL secure_app_url =
       https_server()->GetURL("app.site.com", "/empty.html");
   GURL::Replacements rep;
@@ -618,7 +610,7 @@
   EXPECT_EQ(app_browser->app_controller()->ShouldShowCustomTabBar(), true);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, OverscrollEnabled) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, OverscrollEnabled) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -632,7 +624,7 @@
 }
 
 // Check the 'Copy URL' menu button for Web App windows.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, CopyURL) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, CopyURL) {
   const GURL app_url(kExampleURL);
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -649,7 +641,7 @@
 
 // Tests that the command for popping a tab out to a PWA window is disabled in
 // incognito.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, PopOutDisabledInIncognito) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, PopOutDisabledInIncognito) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
 
@@ -665,7 +657,7 @@
 }
 
 // Tests that web app menus don't crash when no tabs are selected.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, NoTabSelectedMenuCrash) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, NoTabSelectedMenuCrash) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -676,7 +668,7 @@
 }
 
 // Tests that PWA menus have an uninstall option.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, UninstallMenuOption) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, UninstallMenuOption) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -705,7 +697,7 @@
 
 // Tests that both installing a PWA and creating a shortcut app are disabled for
 // incognito windows.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ShortcutMenuOptionsInIncognito) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ShortcutMenuOptionsInIncognito) {
   Browser* const incognito_browser = CreateIncognitoBrowser(profile());
   EXPECT_FALSE(NavigateAndAwaitInstallabilityCheck(incognito_browser,
                                                    GetSecureAppURL()));
@@ -718,7 +710,7 @@
 
 // Tests that both installing a PWA and creating a shortcut app are disabled for
 // an error page.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ShortcutMenuOptionsForErrorPage) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ShortcutMenuOptionsForErrorPage) {
   EXPECT_FALSE(NavigateAndAwaitInstallabilityCheck(
       browser(), https_server()->GetURL("/invalid_path.html")));
 
@@ -728,7 +720,7 @@
 
 // Tests that both installing a PWA and creating a shortcut app are available
 // for an installable PWA.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest,
                        ShortcutMenuOptionsForInstallablePWA) {
   EXPECT_TRUE(
       NavigateAndAwaitInstallabilityCheck(browser(), GetInstallableAppURL()));
@@ -739,7 +731,7 @@
 
 // Tests that both installing a PWA and creating a shortcut app are disabled
 // when page crashes.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ShortcutMenuOptionsForCrashedTab) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ShortcutMenuOptionsForCrashedTab) {
   EXPECT_TRUE(
       NavigateAndAwaitInstallabilityCheck(browser(), GetInstallableAppURL()));
   content::WebContents* tab_contents =
@@ -752,7 +744,7 @@
 }
 
 // Tests that an installed PWA is not used when out of scope by one path level.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, MenuOptionsOutsideInstalledPwaScope) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, MenuOptionsOutsideInstalledPwaScope) {
   NavigateToURLAndWait(
       browser(),
       https_server()->GetURL("/banners/scope_is_start_url/index.html"));
@@ -768,7 +760,7 @@
             kNotPresent);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, InstallInstallableSite) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, InstallInstallableSite) {
   base::Time before_install_time = base::Time::Now();
   base::UserActionTester user_action_tester;
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
@@ -795,7 +787,7 @@
 #endif
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, CanInstallOverTabPwa) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, CanInstallOverTabPwa) {
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
   const AppId app_id = InstallPwaForCurrentUrl();
 
@@ -813,7 +805,7 @@
             kNotPresent);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, CannotInstallOverWindowPwa) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, CannotInstallOverWindowPwa) {
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
   InstallPwaForCurrentUrl();
 
@@ -827,7 +819,7 @@
             kEnabled);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, CannotInstallOverPolicyPwa) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, CannotInstallOverPolicyPwa) {
   ExternalInstallOptions options = CreateInstallOptions(GetInstallableAppURL());
   options.install_source = ExternalInstallSource::kExternalPolicy;
   PendingAppManagerInstall(profile(), options);
@@ -845,7 +837,7 @@
 
 // Tests that the command for OpenActiveTabInPwaWindow is available for secure
 // pages in an app's scope.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ReparentWebAppForSecureActiveTab) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ReparentWebAppForSecureActiveTab) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
 
@@ -862,7 +854,7 @@
 }
 
 // Tests that reparenting the last browser tab doesn't close the browser window.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ReparentLastBrowserTab) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ReparentLastBrowserTab) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   NavigateToURLAndWait(browser(), app_url);
@@ -875,7 +867,7 @@
 }
 
 // Tests that reparenting a shortcut app tab results in a minimal-ui app window.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, ReparentShortcutApp) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ReparentShortcutApp) {
   const GURL app_url = GetSecureAppURL();
   auto web_app_info = std::make_unique<WebApplicationInfo>();
   web_app_info->start_url = app_url;
@@ -908,7 +900,7 @@
 
 // Tests that the manifest name of the current installable site is used in the
 // installation menu text.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, InstallToShelfContainsAppName) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, InstallToShelfContainsAppName) {
   EXPECT_TRUE(
       NavigateAndAwaitInstallabilityCheck(browser(), GetInstallableAppURL()));
 
@@ -924,7 +916,7 @@
 }
 
 // Check that no assertions are hit when showing a permission request bubble.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, PermissionBubble) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, PermissionBubble) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id);
@@ -938,7 +930,7 @@
 
 // Ensure that web app windows with blank titles don't display the URL as a
 // default window title.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, EmptyTitlesDoNotDisplayUrl) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, EmptyTitlesDoNotDisplayUrl) {
   const GURL app_url = https_server()->GetURL("app.site.com", "/empty.html");
   const AppId app_id = InstallPWA(app_url);
   Browser* const app_browser = LaunchWebAppBrowser(app_id);
@@ -954,7 +946,7 @@
 
 // Ensure that web app windows display the app title instead of the page
 // title when off scope.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, OffScopeUrlsDisplayAppTitle) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, OffScopeUrlsDisplayAppTitle) {
   const GURL app_url = GetSecureAppURL();
   const base::string16 app_title = base::ASCIIToUTF16("A Web App");
 
@@ -982,7 +974,7 @@
 
 // Ensure that web app windows display the app title instead of the page
 // title when using http.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, InScopeHttpUrlsDisplayAppTitle) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, InScopeHttpUrlsDisplayAppTitle) {
   ASSERT_TRUE(embedded_test_server()->Start());
   const GURL app_url =
       embedded_test_server()->GetURL("app.site.com", "/simple.html");
@@ -1005,7 +997,7 @@
 
 // Check that a subframe on a regular web page can navigate to a URL that
 // redirects to a web app.  https://crbug.com/721949.
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, SubframeRedirectsToWebApp) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, SubframeRedirectsToWebApp) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // Set up a web app which covers app.com URLs.
@@ -1036,7 +1028,7 @@
 
 #if defined(OS_MAC)
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, NewAppWindow) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, NewAppWindow) {
   BrowserList* const browser_list = BrowserList::GetInstance();
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
@@ -1066,7 +1058,7 @@
 
 #endif
 
-IN_PROC_BROWSER_TEST_P(WebAppBrowserTest, PopupLocationBar) {
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, PopupLocationBar) {
 #if defined(OS_MAC)
   ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
 #endif
@@ -1091,22 +1083,4 @@
       popup_browser->CanSupportWindowFeature(Browser::FEATURE_LOCATIONBAR));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppTabRestoreBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
-// DisplayOverride is supported only for the new web apps mode
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppBrowserTest_DisplayOverride,
-                         ::testing::Values(ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc b/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc
index 99d6d14..2bf6532 100644
--- a/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/web_applications/components/os_integration_manager.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -98,15 +97,8 @@
 
 WebAppControllerBrowserTest::WebAppControllerBrowserTest()
     : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
-  if (GetParam() == ProviderType::kWebApps) {
-    scoped_feature_list_.InitWithFeatures(
-        {features::kDesktopPWAsWithoutExtensions},
-        {predictors::kSpeculativePreconnectFeature});
-  } else {
-    scoped_feature_list_.InitWithFeatures(
-        {}, {features::kDesktopPWAsWithoutExtensions,
-             predictors::kSpeculativePreconnectFeature});
-  }
+  scoped_feature_list_.InitAndDisableFeature(
+      predictors::kSpeculativePreconnectFeature);
 }
 
 WebAppControllerBrowserTest::~WebAppControllerBrowserTest() = default;
diff --git a/chrome/browser/ui/web_applications/web_app_controller_browsertest.h b/chrome/browser/ui/web_applications/web_app_controller_browsertest.h
index cbb2b81..df8a321 100644
--- a/chrome/browser/ui/web_applications/web_app_controller_browsertest.h
+++ b/chrome/browser/ui/web_applications/web_app_controller_browsertest.h
@@ -9,7 +9,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "content/public/test/content_mock_cert_verifier.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -28,8 +27,6 @@
 class WebAppProviderBase;
 
 // Base class for tests of user interface support for web applications.
-// ProviderType selects between use of BMO web apps and
-// Extensions-based bookmark apps.
 class WebAppControllerBrowserTestBase
     : public extensions::ExtensionBrowserTest {
  public:
@@ -67,12 +64,10 @@
   base::Optional<AppId> FindAppWithUrlInScope(const GURL& url);
 };
 
-class WebAppControllerBrowserTest
-    : public WebAppControllerBrowserTestBase,
-      public ::testing::WithParamInterface<ProviderType> {
+class WebAppControllerBrowserTest : public WebAppControllerBrowserTestBase {
  public:
   WebAppControllerBrowserTest();
-  ~WebAppControllerBrowserTest() = 0;
+  ~WebAppControllerBrowserTest() override = 0;
 
   // ExtensionBrowserTest:
   void SetUp() override;
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
index 8f93dc1..259606f 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
@@ -95,7 +95,7 @@
 
 bool CanPopOutWebApp(Profile* profile) {
   return AreWebAppsEnabled(profile) && !profile->IsGuestSession() &&
-         !profile->IsOffTheRecord();
+         !profile->IsEphemeralGuestProfile() && !profile->IsOffTheRecord();
 }
 
 void CreateWebAppFromCurrentWebContents(Browser* browser,
diff --git a/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc b/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
index ed10ed7d..1be60c8c 100644
--- a/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/web_applications/components/os_integration_manager.h"
 #include "chrome/browser/web_applications/components/web_app_prefs_utils.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/web_application_info.h"
 #include "components/embedder_support/switches.h"
 #include "content/public/test/browser_test.h"
@@ -214,7 +213,7 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingBrowserTest,
                        LaunchConsumerIsNotTriggeredWithNoFiles) {
   InstallFileHandlingPWA();
   content::WebContents* web_contents =
@@ -222,7 +221,7 @@
   EXPECT_EQ(false, content::EvalJs(web_contents, "!!window.launchParams"));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingBrowserTest,
                        PWAsCanReceiveFileLaunchParams) {
   InstallFileHandlingPWA();
   base::FilePath test_file_path = NewTestFilePath(FILE_PATH_LITERAL("txt"));
@@ -235,7 +234,7 @@
             content::EvalJs(web_contents, "window.launchParams.files[0].name"));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingBrowserTest,
                        PWAsCanReceiveFileLaunchParamsInTab) {
   InstallFileHandlingPWA();
   base::FilePath test_file_path = NewTestFilePath(FILE_PATH_LITERAL("txt"));
@@ -249,7 +248,7 @@
             content::EvalJs(web_contents, "window.launchParams.files[0].name"));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingBrowserTest,
                        PWAsDispatchOnCorrectFileHandlingURL) {
   InstallFileHandlingPWA();
 
@@ -313,7 +312,7 @@
   FakeFileHandlingExpiryService file_handling_expiry_;
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        FileHandlingIsNotAvailableUntilOriginTrialIsChecked) {
   InstallFileHandlingPWA();
 
@@ -330,7 +329,7 @@
   EXPECT_TRUE(file_handler_manager().AreFileHandlersEnabled(app_id()));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        FileHandlingOriginTrialIsCheckedAtInstallation) {
   // Navigate to the app's launch url, so the origin trial token can be checked.
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -345,7 +344,7 @@
   EXPECT_TRUE(file_handler_manager().AreFileHandlersEnabled(app_id()));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        WhenOriginTrialHasExpiredFileHandlersAreNotAvailable) {
   InstallFileHandlingPWA();
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -363,7 +362,7 @@
 // Tests that expired file handlers are cleaned up.
 // Part 1: Install a file handling app and set it's expiry time to some time in
 // the past.
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        PRE_ExpiredTrialHandlersAreCleanedUpAtLaunch) {
   InstallFileHandlingPWA();
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -376,14 +375,14 @@
 }
 
 // Part 2: Test that expired file handlers for an app are cleaned up.
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        ExpiredTrialHandlersAreCleanedUpAtLaunch) {
   EXPECT_EQ(1, file_handler_manager().TriggerFileHandlerCleanupForTesting());
 }
 
 // Tests that non expired file handlers are not cleaned up.
 // Part 1: Install an app with valid file handlers.
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        PRE_ValidFileHandlerAreNotCleanedUpAtLaunch) {
   InstallFileHandlingPWA();
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -391,12 +390,12 @@
 }
 
 // Part 2: Test that expired file handlers for an app are cleaned up.
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        ValidFileHandlerAreNotCleanedUpAtLaunch) {
   EXPECT_EQ(0, file_handler_manager().TriggerFileHandlerCleanupForTesting());
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        DisableForceEnabledFileHandlingOriginTrial) {
   InstallFileHandlingPWA();
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -418,7 +417,7 @@
   EXPECT_EQ(nullptr, file_handler_manager().GetEnabledFileHandlers(app_id()));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        ForceEnabledFileHandling_IgnoreExpiryTimeUpdate) {
   InstallFileHandlingPWA();
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -445,7 +444,7 @@
   EXPECT_TRUE(file_handler_manager().GetEnabledFileHandlers(app_id()));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialBrowserTest,
                        ForceEnabledFileHandling_IgnoreExpiryTimeInflightIPC) {
   InstallFileHandlingPWA();
   SetUpInterceptorNavigateToAppAndMaybeWait();
@@ -543,7 +542,7 @@
   std::unique_ptr<content::URLLoaderInterceptor> interceptor_;
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialTest,
                        LaunchParamsArePassedCorrectly) {
   GURL start_url;
   const web_app::AppId app_id = InstallFileHandlingWebApp(&start_url);
@@ -563,7 +562,7 @@
 // End-to-end test to ensure the file handler is registered on ChromeOS when the
 // extension system is initialized. Gives more coverage than the unit tests for
 // web_file_tasks.cc.
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialTest,
                        IsFileHandlerOnChromeOS) {
   const web_app::AppId app_id = InstallFileHandlingWebApp();
   base::FilePath test_file_path = NewTestFilePath(FILE_PATH_LITERAL("txt"));
@@ -580,7 +579,7 @@
 // Ensures correct behavior for files on "special volumes", such as file systems
 // provided by extensions. These do not have local files (i.e. backed by
 // inodes).
-IN_PROC_BROWSER_TEST_P(WebAppFileHandlingOriginTrialTest,
+IN_PROC_BROWSER_TEST_F(WebAppFileHandlingOriginTrialTest,
                        NotHandlerForNonNativeFiles) {
   const web_app::AppId app_id = InstallFileHandlingWebApp();
   base::WeakPtr<file_manager::Volume> fsp_volume =
@@ -600,21 +599,3 @@
 }
 
 #endif  // OS_CHROMEOS
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppFileHandlingBrowserTest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppFileHandlingOriginTrialBrowserTest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppFileHandlingOriginTrialTest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
diff --git a/chrome/browser/ui/web_applications/web_app_metrics_browsertest.cc b/chrome/browser/ui/web_applications/web_app_metrics_browsertest.cc
index fdd1399d..929a0bc 100644
--- a/chrome/browser/ui/web_applications/web_app_metrics_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_metrics_browsertest.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/ui/web_applications/web_app_metrics.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/daily_metrics_helper.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/test/browser_test.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
@@ -71,7 +70,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest,
                        NonInstalledWebApp_RecordsDailyInteraction) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
 
@@ -104,7 +103,7 @@
       entry, UkmEntry::kNumSessionsName));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest,
                        InstalledWebAppInTab_RecordsDailyInteraction) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
 
@@ -146,7 +145,7 @@
       entry, UkmEntry::kNumSessionsName));
 }
 
-IN_PROC_BROWSER_TEST_P(
+IN_PROC_BROWSER_TEST_F(
     WebAppMetricsBrowserTest,
     InstalledWebAppInWindow_RecordsDailyInteractionWithSessionDurations) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
@@ -189,7 +188,7 @@
                                                  UkmEntry::kNumSessionsName, 1);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest, NonWebApp_RecordsNothing) {
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest, NonWebApp_RecordsNothing) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
 
   NavigateAndAwaitInstallabilityCheck(browser(), GetNonWebAppUrl());
@@ -200,7 +199,7 @@
   ASSERT_EQ(entries.size(), 0U);
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest,
                        NavigationsWithinInstalledWebApp_RecordsOneSession) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
 
@@ -219,7 +218,7 @@
   EXPECT_THAT(metrics, Contains(Pair(UkmEntry::kNumSessionsNameHash, 1)));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest,
                        InstalledWebApp_RecordsTimeAndSessions) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
   AppId app_id = InstallWebApp();
@@ -276,7 +275,7 @@
 // Verify that the behavior with multiple web app instances is as expected, even
 // though that behavior isn't completely accurate in recording time
 // (crbug.com/1081187).
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest,
                        MultipleWebAppInstances_StillRecordsTime) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
   AppId app_id = InstallWebApp();
@@ -335,7 +334,7 @@
               Not(Contains(Key(UkmEntry::kBackgroundDurationNameHash))));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest,
                        InstalledWebApp_RecordsZeroTimeIfOverLimit) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
   AppId app_id = InstallWebApp();
@@ -377,7 +376,7 @@
   EXPECT_THAT(metrics, Contains(Pair(UkmEntry::kNumSessionsNameHash, 1)));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppMetricsBrowserTest, Suspend_FlushesSessionTimes) {
+IN_PROC_BROWSER_TEST_F(WebAppMetricsBrowserTest, Suspend_FlushesSessionTimes) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
   AppId app_id = InstallWebApp();
   Browser* app_browser;
@@ -428,10 +427,4 @@
       entry, UkmEntry::kBackgroundDurationName));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppMetricsBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc b/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc
index fdb56642..85cf94eb 100644
--- a/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_profile_deletion_browsertest.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
 #include "chrome/browser/web_applications/extensions/bookmark_app_registrar.h"
 #include "chrome/browser/web_applications/test/web_app_install_observer.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "content/public/test/browser_test.h"
 #include "url/gurl.h"
@@ -35,7 +34,7 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppProfileDeletionBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppProfileDeletionBrowserTest,
                        AppRegistrarNotifiesProfileDeletion) {
   GURL app_url(GetInstallableAppURL());
   const AppId app_id = InstallPWA(app_url);
@@ -45,17 +44,8 @@
   observer.SetWebAppProfileWillBeDeletedDelegate(
       base::BindLambdaForTesting([&](const AppId& app_to_be_uninstalled) {
         EXPECT_EQ(app_to_be_uninstalled, app_id);
-
-        if (GetParam() == ProviderType::kWebApps) {
-          EXPECT_TRUE(registrar().IsInstalled(app_id));
-          EXPECT_TRUE(registrar().AsWebAppRegistrar()->GetAppById(app_id));
-        } else if (GetParam() == ProviderType::kBookmarkApps) {
-          // IsInstalled() returns false here. This is a legacy behavior for
-          // bookmark apps:
-          EXPECT_FALSE(registrar().IsInstalled(app_id));
-          EXPECT_TRUE(
-              registrar().AsBookmarkAppRegistrar()->FindExtension(app_id));
-        }
+        EXPECT_TRUE(registrar().IsInstalled(app_id));
+        EXPECT_TRUE(registrar().AsWebAppRegistrar()->GetAppById(app_id));
 
         run_loop.Quit();
       }));
@@ -64,17 +54,7 @@
   run_loop.Run();
 
   EXPECT_FALSE(registrar().IsInstalled(app_id));
-  if (GetParam() == ProviderType::kWebApps) {
-    EXPECT_FALSE(registrar().AsWebAppRegistrar()->GetAppById(app_id));
-  } else if (GetParam() == ProviderType::kBookmarkApps) {
-    EXPECT_FALSE(registrar().AsBookmarkAppRegistrar()->FindExtension(app_id));
-  }
+  EXPECT_FALSE(registrar().AsWebAppRegistrar()->GetAppById(app_id));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppProfileDeletionBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_uninstall_browsertest.cc b/chrome/browser/ui/web_applications/web_app_uninstall_browsertest.cc
index b0737ff..69a9770 100644
--- a/chrome/browser/ui/web_applications/web_app_uninstall_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_uninstall_browsertest.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/web_applications/components/install_finalizer.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "components/sessions/core/tab_restore_service.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
@@ -48,7 +47,7 @@
 };
 
 // Tests that app windows are restored in a tab if the app is uninstalled.
-IN_PROC_BROWSER_TEST_P(WebAppUninstallBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppUninstallBrowserTest,
                        RestoreAppWindowForUninstalledApp) {
   const GURL app_url = GetSecureAppURL();
   const AppId app_id = InstallPWA(app_url);
@@ -78,7 +77,7 @@
 }
 
 // Check that uninstalling a PWA with a window opened doesn't crash.
-IN_PROC_BROWSER_TEST_P(WebAppUninstallBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppUninstallBrowserTest,
                        UninstallPwaWithWindowOpened) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -94,7 +93,7 @@
 }
 
 // PWAs moved to tabbed browsers should not get closed when uninstalled.
-IN_PROC_BROWSER_TEST_P(WebAppUninstallBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebAppUninstallBrowserTest,
                        UninstallPwaWithWindowMovedToTab) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -120,10 +119,4 @@
             GetSecureAppURL());
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppUninstallBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc b/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
index cec9d64..de1e291 100644
--- a/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
@@ -114,8 +114,9 @@
   html_source->AddResourcePath("googleg.svg",
                                IDR_ACCOUNT_MANAGER_WELCOME_GOOGLE_LOGO_SVG);
 #endif
-  html_source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  html_source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  html_source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  html_source->AddResourcePath("test_loader.html",
+                               IDR_WEBUI_HTML_TEST_LOADER_HTML);
   html_source->SetDefaultResource(IDR_ACCOUNT_MIGRATION_WELCOME_HTML);
 
   web_ui->AddMessageHandler(std::make_unique<MigrationMessageHandler>(
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
index 9a46512..15080df 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -155,8 +155,8 @@
                           IDR_CROSTINI_INSTALLER_MOJO_LITE_JS);
   source->AddResourcePath("crostini_types.mojom-lite.js",
                           IDR_CROSTINI_INSTALLER_TYPES_MOJO_LITE_JS);
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
   source->AddResourcePath("images/linux_illustration.png",
                           IDR_LINUX_ILLUSTRATION);
   source->SetDefaultResource(IDR_CROSTINI_INSTALLER_INDEX_HTML);
diff --git a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
index 960955a..728a6be4 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/crostini_upgrader/crostini_upgrader_ui.cc
@@ -116,8 +116,8 @@
                           IDR_CROSTINI_UPGRADER_BROWSER_PROXY_JS);
   source->AddResourcePath("crostini_upgrader.mojom-lite.js",
                           IDR_CROSTINI_UPGRADER_MOJO_LITE_JS);
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
   source->SetDefaultResource(IDR_CROSTINI_UPGRADER_INDEX_HTML);
   source->UseStringsJs();
   source->EnableReplaceI18nInJS();
diff --git a/chrome/browser/ui/webui/chromeos/set_time_ui.cc b/chrome/browser/ui/webui/chromeos/set_time_ui.cc
index 1bdc576..94bdbc4 100644
--- a/chrome/browser/ui/webui/chromeos/set_time_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/set_time_ui.cc
@@ -208,8 +208,8 @@
   source->AddResourcePath("set_time_dialog.js", IDR_SET_TIME_DIALOG_JS);
   source->SetDefaultResource(IDR_SET_TIME_HTML);
 
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
 
   content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
 }
diff --git a/chrome/browser/ui/webui/history/history_ui.cc b/chrome/browser/ui/webui/history/history_ui.cc
index 03f8195..bd40bcc 100644
--- a/chrome/browser/ui/webui/history/history_ui.cc
+++ b/chrome/browser/ui/webui/history/history_ui.cc
@@ -120,7 +120,8 @@
   source->AddBoolean("allowDeletingHistory", allow_deleting_history);
 
   source->AddBoolean(kShowMenuPromoKey, !MenuPromoShown(profile));
-  source->AddBoolean("isGuestSession", profile->IsGuestSession());
+  source->AddBoolean("isGuestSession", profile->IsGuestSession() ||
+                                           profile->IsEphemeralGuestProfile());
 
   source->AddBoolean(kIsUserSignedInKey, IsUserSignedIn(profile));
 
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index 4e5e4a6..4a8876a 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -210,7 +210,8 @@
   // Register images that are purposefully not inlined in the HTML and instead
   // are set in Javascript.
   static constexpr webui::ResourcePath kImages[] = {
-      {omnibox::kGoogleGIconResourceName, IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G},
+      {omnibox::kGoogleGIconResourceName,
+       IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G_PNG},
       {omnibox::kBookmarkIconResourceName, IDR_LOCAL_NTP_ICONS_BOOKMARK},
       {omnibox::kCalculatorIconResourceName, IDR_LOCAL_NTP_ICONS_CALCULATOR},
       {omnibox::kClockIconResourceName, IDR_LOCAL_NTP_ICONS_CLOCK},
@@ -226,7 +227,7 @@
       {omnibox::kExtensionAppIconResourceName,
        IDR_LOCAL_NTP_ICONS_EXTENSION_APP},
       {omnibox::kPageIconResourceName, IDR_LOCAL_NTP_ICONS_PAGE},
-      {omnibox::kSearchIconResourceName, IDR_WEBUI_IMAGES_ICON_SEARCH},
+      {omnibox::kSearchIconResourceName, IDR_WEBUI_IMAGES_ICON_SEARCH_SVG},
       {omnibox::kTrendingUpIconResourceName, IDR_LOCAL_NTP_ICONS_TRENDING_UP}};
   webui::AddResourcePathsBulk(source, kImages);
 
diff --git a/chrome/browser/ui/webui/ntp_tiles_internals_ui.cc b/chrome/browser/ui/webui/ntp_tiles_internals_ui.cc
index 2f75261..d95aef0 100644
--- a/chrome/browser/ui/webui/ntp_tiles_internals_ui.cc
+++ b/chrome/browser/ui/webui/ntp_tiles_internals_ui.cc
@@ -71,7 +71,8 @@
 
 bool ChromeNTPTilesInternalsMessageHandlerClient::SupportsNTPTiles() {
   Profile* profile = Profile::FromWebUI(web_ui());
-  return !(profile->IsGuestSession() || profile->IsOffTheRecord());
+  return !(profile->IsGuestSession() || profile->IsEphemeralGuestProfile() ||
+           profile->IsOffTheRecord());
 }
 
 bool ChromeNTPTilesInternalsMessageHandlerClient::DoesSourceExist(
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
index f324808..49bbcdff 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
@@ -287,6 +287,10 @@
        IDS_SETTINGS_MULTIDEVICE_PHONE_HUB_TASK_CONTINUATION_SUMMARY},
       {"multideviceWifiSyncItemTitle",
        IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_SECTION_TITLE},
+      {"multideviceWifiSyncChromeSyncLabel",
+       IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_CHROME_SYNC_LABEL},
+      {"multideviceWifiSyncLearnMoreLabel",
+       IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_LEARN_MORE_LABEL},
       {"multideviceNotificationAccessSetupAckTitle",
        IDS_SETTINGS_MULTIDEVICE_NOTIFICATION_ACCESS_SETUP_DIALOG_ACK_TITLE},
       {"multideviceNotificationAccessSetupConnectingTitle",
@@ -375,11 +379,12 @@
       "multideviceWifiSyncItemSummary",
       l10n_util::GetStringFUTF16(
           IDS_SETTINGS_MULTIDEVICE_WIFI_SYNC_SUMMARY,
-          // TODO(cvandermerwe) Replace with WifiSyncLearnMoreUrl once created
-          base::UTF8ToUTF16(
-              multidevice_setup::
-                  GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
-                      .spec())));
+          GetHelpUrlWithBoard(chrome::kWifiSyncLearnMoreURL)));
+  html_source->AddString(
+      "multideviceEnableWifiSyncV1ItemSummary",
+      l10n_util::GetStringFUTF16(
+          IDS_SETTINGS_MULTIDEVICE_ENABLE_WIFI_SYNC_V1_SUMMARY,
+          GetHelpUrlWithBoard(chrome::kWifiSyncLearnMoreURL)));
 
   AddEasyUnlockStrings(html_source);
   ::settings::AddNearbyShareData(html_source);
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
index 28c9679..15988e9 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
@@ -7,7 +7,6 @@
 
 #include "base/values.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -42,7 +41,7 @@
     : public web_app::WebAppControllerBrowserTest {
  public:
   ClearBrowsingDataHandlerBrowserTest() = default;
-  ~ClearBrowsingDataHandlerBrowserTest() = default;
+  ~ClearBrowsingDataHandlerBrowserTest() override = default;
 
   void SetUpOnMainThread() override {
     WebAppControllerBrowserTest::SetUpOnMainThread();
@@ -79,7 +78,7 @@
   content::TestWebUI web_ui_;
 };
 
-IN_PROC_BROWSER_TEST_P(ClearBrowsingDataHandlerBrowserTest, GetInstalledApps) {
+IN_PROC_BROWSER_TEST_F(ClearBrowsingDataHandlerBrowserTest, GetInstalledApps) {
   GURL url(https_server()->GetURL("/"));
   InstallAndLaunchApp(url);
   base::ListValue args;
@@ -99,10 +98,4 @@
   ASSERT_EQ(url.host(), *(installed_app.FindStringKey("registerableDomain")));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ClearBrowsingDataHandlerBrowserTest,
-                         ::testing::Values(web_app::ProviderType::kBookmarkApps,
-                                           web_app::ProviderType::kWebApps),
-                         web_app::ProviderTypeParamToString);
-
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
index 2ea56f5..ef36969 100644
--- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
+++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
@@ -154,10 +154,25 @@
 }
 
 base::Value DiceWebSigninInterceptHandler::GetInterceptionParametersValue() {
+  bool is_switch =
+      bubble_parameters_.interception_type ==
+      DiceWebSigninInterceptor::SigninInterceptionType::kProfileSwitch;
+  int confirmButtonStringID =
+      is_switch
+          ? IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CONFIRM_SWITCH_BUTTON_LABEL
+          : IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_NEW_PROFILE_BUTTON_LABEL;
+  int cancelButtonStringID =
+      is_switch
+          ? IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_SWITCH_BUTTON_LABEL
+          : IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_BUTTON_LABEL;
   base::Value parameters(base::Value::Type::DICTIONARY);
   parameters.SetStringKey("headerText", GetHeaderText());
   parameters.SetStringKey("bodyTitle", GetBodyTitle());
   parameters.SetStringKey("bodyText", GetBodyText());
+  parameters.SetStringKey("confirmButtonLabel",
+                          l10n_util::GetStringUTF8(confirmButtonStringID));
+  parameters.SetStringKey("cancelButtonLabel",
+                          l10n_util::GetStringUTF8(cancelButtonStringID));
   parameters.SetKey("interceptedAccount",
                     GetAccountInfoValue(intercepted_account()));
   parameters.SetStringKey("headerBackgroundColor",
@@ -194,8 +209,8 @@
       return l10n_util::GetStringUTF8(
           IDS_SIGNIN_DICE_WEB_INTERCEPT_CONSUMER_BUBBLE_TITLE);
     case DiceWebSigninInterceptor::SigninInterceptionType::kProfileSwitch:
-      // TODO: use localized string once it's available.
-      return "Switch profile";
+      return l10n_util::GetStringUTF8(
+          IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_TITLE);
   }
 }
 
@@ -222,10 +237,9 @@
           IDS_SIGNIN_DICE_WEB_INTERCEPT_CONSUMER_BUBBLE_DESC,
           base::UTF8ToUTF16(intercepted_account().given_name));
     case DiceWebSigninInterceptor::SigninInterceptionType::kProfileSwitch:
-      // TODO: use localized string once it's available.
-      return base::StringPrintf(
-          "This account is already signed in in a different profile. Would "
-          "you like to switch to %s's profile?",
-          intercepted_account().given_name.c_str());
+      return l10n_util::GetStringFUTF8(
+          IDS_SIGNIN_DICE_WEB_INTERCEPT_SWITCH_BUBBLE_DESC,
+          base::UTF8ToUTF16(intercepted_account().email),
+          base::UTF8ToUTF16(intercepted_account().given_name));
   }
 }
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc
index 43491e92..acec3422 100644
--- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc
+++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc
@@ -8,10 +8,8 @@
 #include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
 #include "chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.h"
-#include "chrome/browser/ui/webui/webui_util.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/browser_resources.h"
-#include "chrome/grit/generated_resources.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
@@ -32,24 +30,13 @@
   source->AddResourcePath("signin_shared_css.js", IDR_SIGNIN_SHARED_CSS_JS);
   source->AddResourcePath("signin_vars_css.js", IDR_SIGNIN_VARS_CSS_JS);
 
-  // Localized strings.
-  source->UseStringsJs();
-  source->EnableReplaceI18nInJS();
-  static constexpr webui::LocalizedString kLocalizedStrings[] = {
-      {"diceWebSigninInterceptAcceptLabel",
-       IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_NEW_PROFILE_BUTTON_LABEL},
-      {"diceWebSigninInterceptCancelLabel",
-       IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_CANCEL_BUTTON_LABEL},
-  };
-  webui::AddLocalizedStringsBulk(source, kLocalizedStrings);
-
   // Resources for testing.
   source->OverrideContentSecurityPolicy(
       network::mojom::CSPDirectiveName::ScriptSrc,
       "script-src chrome://resources chrome://test 'self';");
   source->DisableTrustedTypesCSP();
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
 
   content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
 }
diff --git a/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
index 82fdc451..548dde7 100644
--- a/chrome/browser/ui/webui/signin/profile_customization_ui.cc
+++ b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -51,8 +51,8 @@
       network::mojom::CSPDirectiveName::ScriptSrc,
       "script-src chrome://resources chrome://test 'self';");
   source->DisableTrustedTypesCSP();
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
 
   content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
 }
diff --git a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
index 92d8dbb..71723ea 100644
--- a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
+++ b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
@@ -74,8 +74,8 @@
       network::mojom::CSPDirectiveName::ScriptSrc,
       "script-src chrome://resources chrome://test 'self';");
   source->DisableTrustedTypesCSP();
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
 
   // Resources for the account passwords reauth.
   source->AddResourcePath(
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
index 667dbd5..14a37577 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -44,8 +44,9 @@
   source->AddResourcePath("sync_confirmation.js", IDR_SYNC_CONFIRMATION_JS);
 
   if (is_sync_allowed) {
-    source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-    source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+    source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+    source->AddResourcePath("test_loader.html",
+                            IDR_WEBUI_HTML_TEST_LOADER_HTML);
     source->OverrideContentSecurityPolicy(
         network::mojom::CSPDirectiveName::ScriptSrc,
         "script-src chrome://resources chrome://test 'self';");
diff --git a/chrome/browser/ui/webui/sync_internals_message_handler.cc b/chrome/browser/ui/webui/sync_internals_message_handler.cc
index 2c66779..cba4246 100644
--- a/chrome/browser/ui/webui/sync_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/sync_internals_message_handler.cc
@@ -20,9 +20,6 @@
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_user_settings.h"
-#include "components/sync/engine/cycle/commit_counters.h"
-#include "components/sync/engine/cycle/status_counters.h"
-#include "components/sync/engine/cycle/update_counters.h"
 #include "components/sync/engine/events/protocol_event.h"
 #include "components/sync/js/js_event_details.h"
 #include "components/sync/protocol/sync.pb.h"
@@ -97,12 +94,6 @@
                           base::Unretained(this)));
 
   web_ui()->RegisterMessageCallback(
-      syncer::sync_ui_util::kRegisterForPerTypeCounters,
-      base::BindRepeating(
-          &SyncInternalsMessageHandler::HandleRegisterForPerTypeCounters,
-          base::Unretained(this)));
-
-  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestUpdatedAboutInfo,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleRequestUpdatedAboutInfo,
@@ -183,25 +174,6 @@
   }
 }
 
-void SyncInternalsMessageHandler::HandleRegisterForPerTypeCounters(
-    const ListValue* args) {
-  DCHECK(args->empty());
-  AllowJavascript();
-
-  SyncService* service = GetSyncService();
-  if (!service)
-    return;
-
-  if (!is_registered_for_counters_) {
-    service->AddTypeDebugInfoObserver(this);
-    is_registered_for_counters_ = true;
-  } else {
-    // Re-register to ensure counters get re-emitted.
-    service->RemoveTypeDebugInfoObserver(this);
-    service->AddTypeDebugInfoObserver(this);
-  }
-}
-
 void SyncInternalsMessageHandler::HandleRequestUpdatedAboutInfo(
     const ListValue* args) {
   DCHECK(args->empty());
@@ -366,35 +338,6 @@
   DispatchEvent(syncer::sync_ui_util::kOnProtocolEvent, *value);
 }
 
-void SyncInternalsMessageHandler::OnCommitCountersUpdated(
-    syncer::ModelType type,
-    const syncer::CommitCounters& counters) {
-  EmitCounterUpdate(type, syncer::sync_ui_util::kCommit, counters.ToValue());
-}
-
-void SyncInternalsMessageHandler::OnUpdateCountersUpdated(
-    syncer::ModelType type,
-    const syncer::UpdateCounters& counters) {
-  EmitCounterUpdate(type, syncer::sync_ui_util::kUpdate, counters.ToValue());
-}
-
-void SyncInternalsMessageHandler::OnStatusCountersUpdated(
-    syncer::ModelType type,
-    const syncer::StatusCounters& counters) {
-  EmitCounterUpdate(type, syncer::sync_ui_util::kStatus, counters.ToValue());
-}
-
-void SyncInternalsMessageHandler::EmitCounterUpdate(
-    syncer::ModelType type,
-    const std::string& counter_type,
-    std::unique_ptr<DictionaryValue> value) {
-  auto details = std::make_unique<DictionaryValue>();
-  details->SetString(syncer::sync_ui_util::kModelType, ModelTypeToString(type));
-  details->SetString(syncer::sync_ui_util::kCounterType, counter_type);
-  details->Set(syncer::sync_ui_util::kCounters, std::move(value));
-  DispatchEvent(syncer::sync_ui_util::kOnCountersUpdated, *details);
-}
-
 void SyncInternalsMessageHandler::HandleJsEvent(
     const std::string& name,
     const syncer::JsEventDetails& details) {
@@ -435,9 +378,4 @@
     js_controller_ = nullptr;
     is_registered_ = false;
   }
-
-  if (is_registered_for_counters_) {
-    service->RemoveTypeDebugInfoObserver(this);
-    is_registered_for_counters_ = false;
-  }
 }
diff --git a/chrome/browser/ui/webui/sync_internals_message_handler.h b/chrome/browser/ui/webui/sync_internals_message_handler.h
index 8d99944..b099567 100644
--- a/chrome/browser/ui/webui/sync_internals_message_handler.h
+++ b/chrome/browser/ui/webui/sync_internals_message_handler.h
@@ -12,7 +12,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
 #include "components/sync/driver/sync_service_observer.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 #include "components/sync/engine/events/protocol_event_observer.h"
 #include "components/sync/js/js_controller.h"
 #include "components/sync/js/js_event_handler.h"
@@ -27,8 +26,7 @@
 class SyncInternalsMessageHandler : public content::WebUIMessageHandler,
                                     public syncer::JsEventHandler,
                                     public syncer::SyncServiceObserver,
-                                    public syncer::ProtocolEventObserver,
-                                    public syncer::TypeDebugInfoObserver {
+                                    public syncer::ProtocolEventObserver {
  public:
   SyncInternalsMessageHandler();
   ~SyncInternalsMessageHandler() override;
@@ -40,9 +38,6 @@
   // Sets up observers to receive events and forward them to the UI.
   void HandleRegisterForEvents(const base::ListValue* args);
 
-  // Sets up observers to receive per-type counters and forward them to the UI.
-  void HandleRegisterForPerTypeCounters(const base::ListValue* args);
-
   // Fires an event to send updated info back to the page.
   void HandleRequestUpdatedAboutInfo(const base::ListValue* args);
 
@@ -91,23 +86,6 @@
   // syncer::ProtocolEventObserver implementation.
   void OnProtocolEvent(const syncer::ProtocolEvent& e) override;
 
-  // syncer::TypeDebugInfoObserver implementation.
-  void OnCommitCountersUpdated(syncer::ModelType type,
-                               const syncer::CommitCounters& counters) override;
-  void OnUpdateCountersUpdated(syncer::ModelType type,
-                               const syncer::UpdateCounters& counters) override;
-  void OnStatusCountersUpdated(syncer::ModelType type,
-                               const syncer::StatusCounters& counters) override;
-
-  // Helper to emit counter updates.
-  //
-  // Used in implementation of On*CounterUpdated methods.  Emits the given
-  // dictionary value with additional data to specify the model type and
-  // counter type.
-  void EmitCounterUpdate(syncer::ModelType type,
-                         const std::string& counter_type,
-                         std::unique_ptr<base::DictionaryValue> value);
-
  protected:
   using AboutSyncDataDelegate =
       base::RepeatingCallback<std::unique_ptr<base::DictionaryValue>(
@@ -139,10 +117,6 @@
   // A flag used to prevent double-registration with ProfileSyncService.
   bool is_registered_ = false;
 
-  // A flag used to prevent double-registration as TypeDebugInfoObserver with
-  // ProfileSyncService.
-  bool is_registered_for_counters_ = false;
-
   // Whether specifics should be included when converting protocol events to a
   // human readable format.
   bool include_specifics_ = false;
diff --git a/chrome/browser/ui/webui/sync_internals_message_handler_unittest.cc b/chrome/browser/ui/webui/sync_internals_message_handler_unittest.cc
index e22011f7..14797d81 100644
--- a/chrome/browser/ui/webui/sync_internals_message_handler_unittest.cc
+++ b/chrome/browser/ui/webui/sync_internals_message_handler_unittest.cc
@@ -29,7 +29,6 @@
 using syncer::FakeUserEventService;
 using syncer::SyncService;
 using syncer::SyncServiceObserver;
-using syncer::TypeDebugInfoObserver;
 
 namespace {
 
@@ -53,14 +52,6 @@
     ++remove_observer_count_;
   }
 
-  void AddTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override {
-    ++add_type_debug_info_observer_count_;
-  }
-
-  void RemoveTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override {
-    ++remove_type_debug_info_observer_count_;
-  }
-
   base::WeakPtr<syncer::JsController> GetJsController() override {
     return js_controller_.AsWeakPtr();
   }
@@ -73,12 +64,6 @@
 
   int add_observer_count() const { return add_observer_count_; }
   int remove_observer_count() const { return remove_observer_count_; }
-  int add_type_debug_info_observer_count() const {
-    return add_type_debug_info_observer_count_;
-  }
-  int remove_type_debug_info_observer_count() const {
-    return remove_type_debug_info_observer_count_;
-  }
   base::OnceCallback<void(std::unique_ptr<base::ListValue>)>
   get_all_nodes_callback() {
     return std::move(get_all_nodes_callback_);
@@ -87,8 +72,6 @@
  private:
   int add_observer_count_ = 0;
   int remove_observer_count_ = 0;
-  int add_type_debug_info_observer_count_ = 0;
-  int remove_type_debug_info_observer_count_ = 0;
   syncer::MockJsController js_controller_;
   base::OnceCallback<void(std::unique_ptr<base::ListValue>)>
       get_all_nodes_callback_;
@@ -219,19 +202,12 @@
   handler()->HandleRegisterForEvents(&empty_list);
   EXPECT_EQ(1, test_sync_service()->add_observer_count());
 
-  EXPECT_EQ(0, test_sync_service()->add_type_debug_info_observer_count());
-  handler()->HandleRegisterForPerTypeCounters(&empty_list);
-  EXPECT_EQ(1, test_sync_service()->add_type_debug_info_observer_count());
-
   EXPECT_EQ(0, test_sync_service()->remove_observer_count());
-  EXPECT_EQ(0, test_sync_service()->remove_type_debug_info_observer_count());
   ResetHandler();
   EXPECT_EQ(1, test_sync_service()->remove_observer_count());
-  EXPECT_EQ(1, test_sync_service()->remove_type_debug_info_observer_count());
 
-  // Add calls should never have increased since the initial subscription.
+  // Add call should not have increased since the initial subscription.
   EXPECT_EQ(1, test_sync_service()->add_observer_count());
-  EXPECT_EQ(1, test_sync_service()->add_type_debug_info_observer_count());
 }
 
 TEST_F(SyncInternalsMessageHandlerTest, AddRemoveObserversDisallowJavascript) {
@@ -241,22 +217,14 @@
   handler()->HandleRegisterForEvents(&empty_list);
   EXPECT_EQ(1, test_sync_service()->add_observer_count());
 
-  EXPECT_EQ(0, test_sync_service()->add_type_debug_info_observer_count());
-  handler()->HandleRegisterForPerTypeCounters(&empty_list);
-  EXPECT_EQ(1, test_sync_service()->add_type_debug_info_observer_count());
-
   EXPECT_EQ(0, test_sync_service()->remove_observer_count());
-  EXPECT_EQ(0, test_sync_service()->remove_type_debug_info_observer_count());
   handler()->DisallowJavascript();
   EXPECT_EQ(1, test_sync_service()->remove_observer_count());
-  EXPECT_EQ(1, test_sync_service()->remove_type_debug_info_observer_count());
 
   // Deregistration should not repeat, no counts should increase.
   ResetHandler();
   EXPECT_EQ(1, test_sync_service()->add_observer_count());
-  EXPECT_EQ(1, test_sync_service()->add_type_debug_info_observer_count());
   EXPECT_EQ(1, test_sync_service()->remove_observer_count());
-  EXPECT_EQ(1, test_sync_service()->remove_type_debug_info_observer_count());
 }
 
 TEST_F(SyncInternalsMessageHandlerTest, AddRemoveObserversSyncDisabled) {
@@ -266,33 +234,12 @@
 
   ListValue empty_list;
   handler()->HandleRegisterForEvents(&empty_list);
-  handler()->HandleRegisterForPerTypeCounters(&empty_list);
   handler()->DisallowJavascript();
   // Cannot verify observer methods on sync services were not called, because
   // there is no sync service. Rather, we're just making sure the handler hasn't
   // performed any invalid operations when the sync service is missing.
 }
 
-TEST_F(SyncInternalsMessageHandlerTest,
-       RepeatedHandleRegisterForPerTypeCounters) {
-  ListValue empty_list;
-  handler()->HandleRegisterForPerTypeCounters(&empty_list);
-  EXPECT_EQ(1, test_sync_service()->add_type_debug_info_observer_count());
-  EXPECT_EQ(0, test_sync_service()->remove_type_debug_info_observer_count());
-
-  handler()->HandleRegisterForPerTypeCounters(&empty_list);
-  EXPECT_EQ(2, test_sync_service()->add_type_debug_info_observer_count());
-  EXPECT_EQ(1, test_sync_service()->remove_type_debug_info_observer_count());
-
-  handler()->HandleRegisterForPerTypeCounters(&empty_list);
-  EXPECT_EQ(3, test_sync_service()->add_type_debug_info_observer_count());
-  EXPECT_EQ(2, test_sync_service()->remove_type_debug_info_observer_count());
-
-  ResetHandler();
-  EXPECT_EQ(3, test_sync_service()->add_type_debug_info_observer_count());
-  EXPECT_EQ(3, test_sync_service()->remove_type_debug_info_observer_count());
-}
-
 TEST_F(SyncInternalsMessageHandlerTest, HandleGetAllNodes) {
   ListValue args;
   args.AppendInteger(0);
diff --git a/chrome/browser/ui/webui/sync_internals_ui.cc b/chrome/browser/ui/webui/sync_internals_ui.cc
index cd5cfc1..285dc87 100644
--- a/chrome/browser/ui/webui/sync_internals_ui.cc
+++ b/chrome/browser/ui/webui/sync_internals_ui.cc
@@ -35,7 +35,6 @@
        IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS},
       {syncer::sync_ui_util::kChromeSyncJS,
        IDR_SYNC_DRIVER_SYNC_INTERNALS_CHROME_SYNC_JS},
-      {syncer::sync_ui_util::kTypesJS, IDR_SYNC_DRIVER_SYNC_INTERNALS_TYPES_JS},
       {syncer::sync_ui_util::kSyncLogJS,
        IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_LOG_JS},
       {syncer::sync_ui_util::kSyncNodeBrowserJS,
diff --git a/chrome/browser/ui/webui/webui_util.cc b/chrome/browser/ui/webui/webui_util.cc
index 759432b..f4b8af5 100644
--- a/chrome/browser/ui/webui/webui_util.cc
+++ b/chrome/browser/ui/webui/webui_util.cc
@@ -32,8 +32,8 @@
   source->DisableTrustedTypesCSP();
   source->UseStringsJs();
   source->EnableReplaceI18nInJS();
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
 }
 
 }  // namespace
diff --git a/chrome/browser/web_applications/system_web_app_manager_browsertest.h b/chrome/browser/web_applications/system_web_app_manager_browsertest.h
index deb754f..4566248 100644
--- a/chrome/browser/web_applications/system_web_app_manager_browsertest.h
+++ b/chrome/browser/web_applications/system_web_app_manager_browsertest.h
@@ -173,4 +173,13 @@
                                    TestProfileType::kIncognito,              \
                                    TestProfileType::kGuest)))
 
+// Instantiate |SUITE| for all install types, on a Chrome OS guest session.
+#define INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_GUEST_SESSION_P(SUITE) \
+  INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_P(                           \
+      SUITE,                                                                 \
+      ::testing::Combine(                                                    \
+          ::testing::Values(web_app::InstallationType::kManifestInstall,     \
+                            web_app::InstallationType::kWebAppInfoInstall),  \
+          ::testing::Values(TestProfileType::kGuest)))
+
 #endif  // CHROME_BROWSER_WEB_APPLICATIONS_SYSTEM_WEB_APP_MANAGER_BROWSERTEST_H_
diff --git a/chrome/browser/web_applications/web_app_audio_focus_browsertest.cc b/chrome/browser/web_applications/web_app_audio_focus_browsertest.cc
index b6626ad..07f1996 100644
--- a/chrome/browser/web_applications/web_app_audio_focus_browsertest.cc
+++ b/chrome/browser/web_applications/web_app_audio_focus_browsertest.cc
@@ -9,7 +9,6 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
 #include "chrome/browser/web_applications/components/web_app_tab_helper_base.h"
-#include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
@@ -88,7 +87,7 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_P(WebAppAudioFocusBrowserTest, AppHasDifferentAudioFocus) {
+IN_PROC_BROWSER_TEST_F(WebAppAudioFocusBrowserTest, AppHasDifferentAudioFocus) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL app_url = embedded_test_server()->GetURL(kAudioFocusTestPageURL);
 
@@ -173,7 +172,7 @@
   EXPECT_EQ(group_id, GetAudioFocusGroupId(web_contents));
 }
 
-IN_PROC_BROWSER_TEST_P(WebAppAudioFocusBrowserTest, WebAppHasSameAudioFocus) {
+IN_PROC_BROWSER_TEST_F(WebAppAudioFocusBrowserTest, WebAppHasSameAudioFocus) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL app_url = embedded_test_server()->GetURL(kAudioFocusTestPageURL);
 
@@ -187,10 +186,4 @@
   EXPECT_EQ(base::UnguessableToken::Null(), GetAudioFocusGroupId(web_contents));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         WebAppAudioFocusBrowserTest,
-                         ::testing::Values(ProviderType::kBookmarkApps,
-                                           ProviderType::kWebApps),
-                         ProviderTypeParamToString);
-
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_install_manager.cc b/chrome/browser/web_applications/web_app_install_manager.cc
index 82d0610..111460c 100644
--- a/chrome/browser/web_applications/web_app_install_manager.cc
+++ b/chrome/browser/web_applications/web_app_install_manager.cc
@@ -252,7 +252,7 @@
 
   base::OnceClosure start_task = base::BindOnce(
       &WebAppInstallTask::LoadAndInstallWebAppFromManifestWithFallback,
-      base::Unretained(task.get()), start_url, EnsureWebContentsCreated(),
+      task->GetWeakPtr(), start_url, EnsureWebContentsCreated(),
       base::Unretained(url_loader_.get()), WebappInstallSource::SYNC,
       base::BindOnce(&WebAppInstallManager::OnQueuedTaskCompleted,
                      base::Unretained(this), task.get(),
@@ -284,7 +284,7 @@
       data_retriever_factory_.Run());
 
   base::OnceClosure start_task = base::BindOnce(
-      &WebAppInstallTask::UpdateWebAppFromInfo, base::Unretained(task.get()),
+      &WebAppInstallTask::UpdateWebAppFromInfo, task->GetWeakPtr(),
       EnsureWebContentsCreated(), app_id, std::move(web_application_info),
       base::BindOnce(&WebAppInstallManager::OnQueuedTaskCompleted,
                      base::Unretained(this), task.get(), std::move(callback)));
@@ -381,7 +381,7 @@
 
   base::OnceClosure start_task = base::BindOnce(
       &WebAppInstallTask::InstallWebAppFromInfoRetrieveIcons,
-      base::Unretained(task.get()), EnsureWebContentsCreated(),
+      task->GetWeakPtr(), EnsureWebContentsCreated(),
       std::move(web_application_info), finalize_options,
       base::BindOnce(&WebAppInstallManager::OnQueuedTaskCompleted,
                      base::Unretained(this), task.get(), std::move(callback)));
@@ -400,22 +400,26 @@
 
   tasks_.insert(std::move(task));
 
-  if (web_contents_ready_)
-    MaybeStartQueuedTask();
+  MaybeStartQueuedTask();
 }
 
 void WebAppInstallManager::MaybeStartQueuedTask() {
-  DCHECK(web_contents_ready_);
-  DCHECK(!task_queue_.empty());
+  DCHECK(web_contents_);
 
   if (current_queued_task_)
     return;
 
+  DCHECK(!task_queue_.empty());
   PendingTask pending_task = std::move(task_queue_.front());
   task_queue_.pop();
   current_queued_task_ = pending_task.task;
 
-  std::move(pending_task.start).Run();
+  // Load about:blank to ensure ready and clean up any left over state.
+  url_loader_->LoadUrl(
+      GURL("about:blank"), web_contents_.get(),
+      WebAppUrlLoader::UrlComparison::kExact,
+      base::BindOnce(&WebAppInstallManager::OnWebContentsReadyRunTask,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(pending_task)));
 }
 
 void WebAppInstallManager::SetDataRetrieverFactoryForTesting(
@@ -446,23 +450,13 @@
   current_queued_task_ = nullptr;
 
   OnInstallTaskCompleted(task, std::move(callback), app_id, code);
+  // |task| is now destroyed.
   task = nullptr;
 
-  // |callback| may have started another task.
-  if (current_queued_task_)
-    return;
-
-  web_contents_ready_ = false;
-  if (task_queue_.empty()) {
+  if (task_queue_.empty() && !current_queued_task_)
     web_contents_.reset();
-  } else {
-    // Load about:blank to clean up the renderer process.
-    url_loader_->LoadUrl(
-        GURL("about:blank"), web_contents_.get(),
-        WebAppUrlLoader::UrlComparison::kExact,
-        base::BindOnce(&WebAppInstallManager::OnWebContentsReady,
-                       weak_ptr_factory_.GetWeakPtr()));
-  }
+  else
+    MaybeStartQueuedTask();
 }
 
 void WebAppInstallManager::OnLoadWebAppAndCheckManifestCompleted(
@@ -499,27 +493,16 @@
 }
 
 content::WebContents* WebAppInstallManager::EnsureWebContentsCreated() {
-  if (web_contents_)
-    return web_contents_.get();
-
-  DCHECK(!web_contents_ready_);
-
-  web_contents_ = WebAppInstallTask::CreateWebContents(profile());
-
-  // Load about:blank so that the process actually starts.
-  url_loader_->LoadUrl(GURL("about:blank"), web_contents_.get(),
-                       WebAppUrlLoader::UrlComparison::kExact,
-                       base::BindOnce(&WebAppInstallManager::OnWebContentsReady,
-                                      weak_ptr_factory_.GetWeakPtr()));
-
+  if (!web_contents_)
+    web_contents_ = WebAppInstallTask::CreateWebContents(profile());
   return web_contents_.get();
 }
 
-void WebAppInstallManager::OnWebContentsReady(WebAppUrlLoader::Result result) {
+void WebAppInstallManager::OnWebContentsReadyRunTask(
+    PendingTask pending_task,
+    WebAppUrlLoader::Result result) {
   DCHECK_EQ(WebAppUrlLoader::Result::kUrlLoaded, result);
-  web_contents_ready_ = true;
-
-  MaybeStartQueuedTask();
+  std::move(pending_task.start).Run();
 }
 
 WebAppInstallManager::PendingTask::PendingTask() = default;
diff --git a/chrome/browser/web_applications/web_app_install_manager.h b/chrome/browser/web_applications/web_app_install_manager.h
index d2c60d44..df2062d 100644
--- a/chrome/browser/web_applications/web_app_install_manager.h
+++ b/chrome/browser/web_applications/web_app_install_manager.h
@@ -143,16 +143,6 @@
       InstallResultCode code);
 
   content::WebContents* EnsureWebContentsCreated();
-  void OnWebContentsReady(WebAppUrlLoader::Result result);
-
-  DataRetrieverFactory data_retriever_factory_;
-
-  std::unique_ptr<WebAppUrlLoader> url_loader_;
-
-  // All owned tasks.
-  using Tasks = base::flat_set<std::unique_ptr<WebAppInstallTask>,
-                               base::UniquePtrComparator>;
-  Tasks tasks_;
 
   // Tasks can be queued for sequential completion (to be run one at a time).
   // FIFO. This is a subset of |tasks_|.
@@ -164,6 +154,19 @@
     const WebAppInstallTask* task = nullptr;
     base::OnceClosure start;
   };
+
+  void OnWebContentsReadyRunTask(PendingTask pending_task,
+                                 WebAppUrlLoader::Result result);
+
+  DataRetrieverFactory data_retriever_factory_;
+
+  std::unique_ptr<WebAppUrlLoader> url_loader_;
+
+  // All owned tasks.
+  using Tasks = base::flat_set<std::unique_ptr<WebAppInstallTask>,
+                               base::UniquePtrComparator>;
+  Tasks tasks_;
+
   using TaskQueue = base::queue<PendingTask>;
   TaskQueue task_queue_;
   const WebAppInstallTask* current_queued_task_ = nullptr;
@@ -181,7 +184,6 @@
 
   // A single WebContents, shared between tasks in |task_queue_|.
   std::unique_ptr<content::WebContents> web_contents_;
-  bool web_contents_ready_ = false;
 
   bool started_ = false;
 
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 70e347f3..c22eb81 100644
--- a/chrome/browser/web_applications/web_app_install_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
@@ -815,7 +815,10 @@
   // Simulate if the web app publisher's website is down.
   url_loader().SetNextLoadUrlResult(
       url, WebAppUrlLoader::Result::kFailedPageTookTooLong);
-  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
+  // about:blank will be loaded twice, one for the initial attempt and one for
+  // the fallback attempt.
+  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded});
 
   install_manager().SetDataRetrieverFactoryForTesting(
       base::BindLambdaForTesting([]() {
@@ -1081,6 +1084,8 @@
   const auto url2 = GURL("https://example.org/");
 
   url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded,
                                          WebAppUrlLoader::Result::kUrlLoaded});
 
   // Induce a load failure:
@@ -1193,7 +1198,10 @@
   const GURL icon1_url{"https://example.com/path/icon1.png"};
   const GURL icon2_url{"https://example.com/path/icon2.png"};
 
-  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
+  // about:blank will be loaded twice, one for the initial attempt and one for
+  // the fallback attempt.
+  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded});
   // Induce a load failure:
   url_loader().SetNextLoadUrlResult(
       url, WebAppUrlLoader::Result::kRedirectedUrlLoaded);
@@ -1254,7 +1262,10 @@
 
   const GURL url{"https://example.com/path"};
 
-  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
+  // about:blank will be loaded twice, one for the initial attempt and one for
+  // the fallback attempt.
+  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded});
   // Induce a load failure:
   url_loader().SetNextLoadUrlResult(
       url, WebAppUrlLoader::Result::kRedirectedUrlLoaded);
@@ -1290,7 +1301,8 @@
 
   const GURL old_url{"https://example.com/path"};
 
-  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
+  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded});
   url_loader().SetNextLoadUrlResult(old_url,
                                     WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -1505,8 +1517,9 @@
   const GURL url{"https://example.com/path"};
   const AppId app_id = GenerateAppIdFromURL(url);
 
+  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded});
   // The web site url must be loaded only once.
-  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
   url_loader().AddNextLoadUrlResults(url,
                                      {WebAppUrlLoader::Result::kUrlLoaded});
 
@@ -1568,8 +1581,9 @@
   const GURL url{"https://example.com/path"};
   const AppId app_id = GenerateAppIdFromURL(url);
 
+  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded,
+                                         WebAppUrlLoader::Result::kUrlLoaded});
   // We will try to load the web site url only once.
-  url_loader().AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
   // The web site url will fail.
   url_loader().AddNextLoadUrlResults(
       url, {WebAppUrlLoader::Result::kFailedPageTookTooLong});
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc
index 13aeddd..2e5a638 100644
--- a/chrome/browser/web_applications/web_app_install_task.cc
+++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -186,7 +186,7 @@
       launch_url, contents,
       WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
       base::BindOnce(&WebAppInstallTask::OnWebAppUrlLoadedGetWebApplicationInfo,
-                     weak_ptr_factory_.GetWeakPtr()));
+                     GetWeakPtr()));
 }
 
 void WebAppInstallTask::InstallWebAppFromInfo(
@@ -277,7 +277,7 @@
       start_url, web_contents(),
       WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef,
       base::BindOnce(&WebAppInstallTask::OnWebAppUrlLoadedGetWebApplicationInfo,
-                     weak_ptr_factory_.GetWeakPtr()));
+                     GetWeakPtr()));
 }
 
 // static
@@ -293,6 +293,10 @@
   return web_contents;
 }
 
+base::WeakPtr<WebAppInstallTask> WebAppInstallTask::GetWeakPtr() {
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
 void WebAppInstallTask::WebContentsDestroyed() {
   CallInstallCallback(AppId(), InstallResultCode::kWebContentsDestroyed);
 }
@@ -555,9 +559,9 @@
           instance->IsInstallable(
               id,
               base::BindOnce(&WebAppInstallTask::OnDidCheckForIntentToPlayStore,
-                             weak_ptr_factory_.GetWeakPtr(),
-                             std::move(web_app_info), std::move(icon_urls),
-                             for_installable_site, skip_page_favicons, intent));
+                             GetWeakPtr(), std::move(web_app_info),
+                             std::move(icon_urls), for_installable_site,
+                             skip_page_favicons, intent));
           return;
         }
       }
@@ -646,8 +650,7 @@
 
   install_finalizer_->FinalizeInstall(
       *web_app_info, finalize_options,
-      base::BindOnce(&WebAppInstallTask::OnInstallFinalized,
-                     weak_ptr_factory_.GetWeakPtr()));
+      base::BindOnce(&WebAppInstallTask::OnInstallFinalized, GetWeakPtr()));
 }
 
 void WebAppInstallTask::OnIconsRetrievedShowDialog(
@@ -672,8 +675,7 @@
     DCHECK(dialog_callback_);
     std::move(dialog_callback_)
         .Run(web_contents(), std::move(web_app_info), for_installable_site,
-             base::BindOnce(&WebAppInstallTask::OnDialogCompleted,
-                            weak_ptr_factory_.GetWeakPtr(),
+             base::BindOnce(&WebAppInstallTask::OnDialogCompleted, GetWeakPtr(),
                             for_installable_site));
   }
 }
@@ -690,8 +692,8 @@
   FilterAndResizeIconsGenerateMissing(web_app_info.get(), &icons_map);
 
   install_finalizer_->FinalizeUpdate(
-      *web_app_info, base::BindOnce(&WebAppInstallTask::CallInstallCallback,
-                                    weak_ptr_factory_.GetWeakPtr()));
+      *web_app_info,
+      base::BindOnce(&WebAppInstallTask::CallInstallCallback, GetWeakPtr()));
 }
 
 void WebAppInstallTask::OnDialogCompleted(
@@ -744,7 +746,7 @@
   install_finalizer_->FinalizeInstall(
       web_app_info_copy, finalize_options,
       base::BindOnce(&WebAppInstallTask::OnInstallFinalizedCreateShortcuts,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(web_app_info)));
+                     GetWeakPtr(), std::move(web_app_info)));
 
   // Check that the finalizer hasn't called OnInstallFinalizedCreateShortcuts
   // synchronously:
@@ -799,9 +801,9 @@
   options.os_hooks[OsHookType::kFileHandlers] = true;
   options.os_hooks[OsHookType::kShortcutsMenu] = true;
 
-  auto hooks_created_callback = base::BindOnce(
-      &WebAppInstallTask::OnOsHooksCreated, weak_ptr_factory_.GetWeakPtr(),
-      web_app_info->open_as_window, app_id);
+  auto hooks_created_callback =
+      base::BindOnce(&WebAppInstallTask::OnOsHooksCreated, GetWeakPtr(),
+                     web_app_info->open_as_window, app_id);
 
   os_integration_manager_->InstallOsHooks(app_id,
                                           std::move(hooks_created_callback),
diff --git a/chrome/browser/web_applications/web_app_install_task.h b/chrome/browser/web_applications/web_app_install_task.h
index 3232a92..8a62432 100644
--- a/chrome/browser/web_applications/web_app_install_task.h
+++ b/chrome/browser/web_applications/web_app_install_task.h
@@ -152,6 +152,8 @@
   static std::unique_ptr<content::WebContents> CreateWebContents(
       Profile* profile);
 
+  base::WeakPtr<WebAppInstallTask> GetWeakPtr();
+
   // WebContentsObserver:
   void WebContentsDestroyed() override;
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 57659761..fcf16789 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1602460024-2af6533fe6c4354707f21413721100fe04991470.profdata
+chrome-linux-master-1602503558-6db36755351afd56b86dda41eeed03adf268112f.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 377e7ae..3db56c1 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1602460024-4b69636ab7ebaae5b3fa848321845968d50cbe86.profdata
+chrome-mac-master-1602503558-f6db874387e2078784a354d0f7c8c59a21bebaa6.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index b66d46cf..bf743e7 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1602448744-d06fc1e3f11f340d5ab319c12d5a6fb4491c2b6c.profdata
+chrome-win64-master-1602482293-b6c9af61d9b709e1e409c88a2a609d5546a5c2ce.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index a915b08..1088ab3 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -490,7 +490,7 @@
 #if !defined(OS_ANDROID)
 // Support sharing in Chrome OS intent handling.
 const base::Feature kIntentHandlingSharing{"IntentHandlingSharing",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+                                           base::FEATURE_ENABLED_BY_DEFAULT};
 // Allow user to have preference for PWA in the intent picker.
 const base::Feature kIntentPickerPWAPersistence{
     "IntentPickerPWAPersistence", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -700,8 +700,7 @@
     "SecurityKeyAttestationPrompt", base::FEATURE_ENABLED_BY_DEFAULT};
 
 #if defined(OS_CHROMEOS)
-const base::Feature kSharesheet{"Sharesheet",
-                                base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kSharesheet{"Sharesheet", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 #if defined(OS_MAC)
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 988a4fa..631894a 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -3086,4 +3086,11 @@
     "settings.a11y.caretbrowsing.show_dialog";
 #endif
 
+#if BUILDFLAG(IS_ASH)
+// Boolean pref indicating whether the Lacros browser is allowed. This is set by
+// a policy, and the default value for managed users is false. Admins willing to
+// give rights to use Lacros can set the policy to true.
+const char kLacrosAllowed[] = "lacros_allowed";
+#endif
+
 }  // namespace prefs
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 13f9d47..c2f1905 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -11,6 +11,7 @@
 
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/common/buildflags.h"
 #include "components/offline_pages/buildflags/buildflags.h"
 #include "extensions/buildflags/buildflags.h"
@@ -1078,6 +1079,10 @@
 extern const char kShowCaretBrowsingDialog[];
 #endif
 
+#if BUILDFLAG(IS_ASH)
+extern const char kLacrosAllowed[];
+#endif
+
 }  // namespace prefs
 
 #endif  // CHROME_COMMON_PREF_NAMES_H_
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
index 381fe049..e4ef78a 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
@@ -5,6 +5,7 @@
 <translation id="1383286653814676580">Used to run Google Credential Provider sign-in page.</translation>
 <translation id="2048923169632968961">There was a problem while synching your work account password to your Windows profile. Please contact your administrator.</translation>
 <translation id="2515346402363002066">Your session has expired. Sign in with your work account.</translation>
+<translation id="2549902055700841962">Can’t sign in to your work account. Please contact your administrator.</translation>
 <translation id="2566603360883977759">This email isn't allowed to sign in. Try again with the account that you use for work or school. If you still can't sign in, contact your administrator.</translation>
 <translation id="2844349213149998955">Signing in with a personal account on this device is not allowed. Please log in with a work account.</translation>
 <translation id="3217145568844727893">If you continue without entering your current Windows password, you might permanently lose data on this device.</translation>
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index cb152935..392475d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6799,6 +6799,8 @@
       "../browser/sync/test/integration/device_info_helper.h",
       "../browser/sync/test/integration/fake_server_invalidation_sender.cc",
       "../browser/sync/test/integration/fake_server_invalidation_sender.h",
+      "../browser/sync/test/integration/fake_server_sync_invalidation_sender.cc",
+      "../browser/sync/test/integration/fake_server_sync_invalidation_sender.h",
       "../browser/sync/test/integration/multi_client_status_change_checker.cc",
       "../browser/sync/test/integration/multi_client_status_change_checker.h",
       "../browser/sync/test/integration/profile_sync_service_harness.cc",
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 7815892..c9f00a8 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -8253,5 +8253,17 @@
         "prefs": { "browsing_data_lifetime": { "value": [{"data_types": ["browsing_history"], "time_to_live_in_hours": 2}]} }
       }
     ]
+  },
+  "LacrosAllowed": {
+    "os": ["chromeos"],
+    "can_be_recommended": false,
+    "policy_pref_mapping_test": [
+      {
+        "policies": { "LacrosAllowed": false },
+        "prefs": {
+          "lacros_allowed": { "local_state": true }
+        }
+      }
+    ]
   }
 }
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 83f55e8..8f92e716 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -303,6 +303,8 @@
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_disabled_link_tests.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/nearby_share_receive_dialog_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.m.js",
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 58681d1..906fcbba 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -55,6 +55,8 @@
     "multidevice_page_tests.js",
     "multidevice_smartlock_subpage_test.js",
     "multidevice_subpage_tests.js",
+    "multidevice_wifi_sync_disabled_link_tests.js",
+    "multidevice_wifi_sync_item_tests.js",
     "nearby_share_receive_dialog_tests.js",
     "nearby_share_subpage_tests.js",
     "network_proxy_section_test.js",
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_disabled_link_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_disabled_link_tests.js
new file mode 100644
index 0000000..49a204a
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_disabled_link_tests.js
@@ -0,0 +1,61 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// clang-format off
+// #import 'chrome://os-settings/chromeos/os_settings.js';
+
+// #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+// #import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
+// #import {assert} from 'chrome://resources/js/assert.m.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// clang-format on
+
+suite('Multidevice', function() {
+  let localizedLink = null;
+
+  setup(function() {
+    PolymerTest.clearBody();
+    localizedLink =
+        document.createElement('settings-multidevice-wifi-sync-disabled-link');
+    document.body.appendChild(localizedLink);
+    Polymer.dom.flush();
+  });
+
+  teardown(function() {
+    localizedLink.remove();
+    settings.Router.getInstance().resetRouteForTesting();
+  });
+
+  test('Contains 2 links with aria-labels', async () => {
+    const chromeSyncLink = localizedLink.$$('#chromeSyncLink');
+    assertTrue(!!chromeSyncLink);
+    assertTrue(chromeSyncLink.hasAttribute('aria-label'));
+    const learnMoreLink = localizedLink.$$('#learnMoreLink');
+    assertTrue(!!learnMoreLink);
+    assertTrue(learnMoreLink.hasAttribute('aria-label'));
+  });
+
+  test('Spans are aria-hidden', async () => {
+    const spans = localizedLink.shadowRoot.querySelectorAll('span');
+    spans.forEach((span) => {
+      assertTrue(span.hasAttribute('aria-hidden'));
+    });
+  });
+
+  test('ChromeSyncLink navigates to appropriate route', async () => {
+    const chromeSyncLink = localizedLink.$$('#chromeSyncLink');
+    chromeSyncLink.click();
+    Polymer.dom.flush();
+
+    if (loadTimeData.getBoolean('splitSettingsSyncEnabled')) {
+      assertEquals(
+          settings.Router.getInstance().getCurrentRoute(),
+          settings.routes.OS_SYNC);
+    } else {
+      assertEquals(
+          settings.Router.getInstance().getCurrentRoute(),
+          settings.routes.SYNC_ADVANCED);
+    }
+  });
+});
\ No newline at end of file
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
new file mode 100644
index 0000000..f281662
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
@@ -0,0 +1,130 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// clang-format off
+// #import 'chrome://os-settings/chromeos/os_settings.js';
+
+// #import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
+// #import {assert} from 'chrome://resources/js/assert.m.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {SyncBrowserProxyImpl, OsSyncBrowserProxyImpl} from 'chrome://os-settings/chromeos/os_settings.js';
+// #import {TestSyncBrowserProxy} from './test_os_sync_browser_proxy.m.js';
+// #import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js';
+// clang-format on
+
+function getPrefs() {
+  return {
+    wifiConfigurationsRegistered: true,
+    wifiConfigurationsSynced: true,
+  };
+}
+
+suite('Multidevice_WifiSyncItem_SplitSettingsDisabled', function() {
+  let wifiSyncItem;
+
+  setup(function() {
+    const browserProxy = new TestSyncBrowserProxy();
+    settings.SyncBrowserProxyImpl.instance_ = browserProxy;
+
+    PolymerTest.clearBody();
+    loadTimeData.overrideValues({
+      splitSettingsSyncEnabled: false,
+    });
+
+    wifiSyncItem =
+        document.createElement('settings-multidevice-wifi-sync-item');
+    document.body.appendChild(wifiSyncItem);
+    Polymer.dom.flush();
+  });
+
+  teardown(function() {
+    wifiSyncItem.remove();
+  });
+
+  test('Chrome Sync off', async () => {
+    const prefs = getPrefs();
+    prefs.wifiConfigurationsSynced = false;
+    cr.webUIListenerCallback('sync-prefs-changed', prefs);
+    Polymer.dom.flush();
+
+    assertTrue(
+        !!wifiSyncItem.$$('settings-multidevice-wifi-sync-disabled-link'));
+
+    const toggle = wifiSyncItem.$$('cr-toggle');
+    assertTrue(!!toggle);
+    assertTrue(toggle.disabled);
+    assertFalse(toggle.checked);
+  });
+
+  test('Chrome Sync on', async () => {
+    const prefs = getPrefs();
+    prefs.wifiConfigurationsSynced = true;
+    cr.webUIListenerCallback('sync-prefs-changed', prefs);
+    Polymer.dom.flush();
+
+    assertFalse(
+        !!wifiSyncItem.$$('settings-multidevice-wifi-sync-disabled-link'));
+  });
+});
+
+class TestOsSyncBrowserProxy extends TestBrowserProxy {
+  constructor() {
+    super([
+      'sendOsSyncPrefsChanged',
+    ]);
+  }
+
+  /** @override */
+  sendOsSyncPrefsChanged() {
+    this.methodCalled('sendOsSyncPrefsChanged');
+  }
+}
+
+suite('Multidevice_WifiSyncItem_SplitSettingsEnabled', function() {
+  let wifiSyncItem;
+
+  setup(function() {
+    const browserProxy = new TestOsSyncBrowserProxy();
+    settings.OsSyncBrowserProxyImpl.instance_ = browserProxy;
+
+    PolymerTest.clearBody();
+    loadTimeData.overrideValues({
+      splitSettingsSyncEnabled: true,
+    });
+
+    wifiSyncItem =
+        document.createElement('settings-multidevice-wifi-sync-item');
+    document.body.appendChild(wifiSyncItem);
+    Polymer.dom.flush();
+  });
+
+  teardown(function() {
+    wifiSyncItem.remove();
+  });
+
+  test('Chrome Sync off', async () => {
+    const prefs = getPrefs();
+    prefs.wifiConfigurationsSynced = false;
+    cr.webUIListenerCallback('os-sync-prefs-changed', false, prefs);
+    Polymer.dom.flush();
+
+    assertTrue(
+        !!wifiSyncItem.$$('settings-multidevice-wifi-sync-disabled-link'));
+
+    const toggle = wifiSyncItem.$$('cr-toggle');
+    assertTrue(!!toggle);
+    assertTrue(toggle.disabled);
+    assertFalse(toggle.checked);
+  });
+
+  test('Chrome Sync on', async () => {
+    const prefs = getPrefs();
+    prefs.wifiConfigurationsSynced = true;
+    cr.webUIListenerCallback('os-sync-prefs-changed', true, prefs);
+    Polymer.dom.flush();
+
+    assertFalse(
+        !!wifiSyncItem.$$('settings-multidevice-wifi-sync-disabled-link'));
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 80b8283b..7ea394fb 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -1116,6 +1116,55 @@
   mocha.run();
 });
 
+// Test fixture for the multidevice wifi sync disabled link.
+// eslint-disable-next-line no-var
+var OSSettingsMultideviceWifiSyncDisabledLinkTest =
+    class extends OSSettingsBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return super.browsePreload +
+        'chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.html';
+  }
+
+  /** @override */
+  get extraLibraries() {
+    return super.extraLibraries.concat([
+      BROWSER_SETTINGS_PATH + '../test_util.js',
+      'multidevice_wifi_sync_disabled_link_tests.js',
+    ]);
+  }
+};
+
+TEST_F('OSSettingsMultideviceWifiSyncDisabledLinkTest', 'AllJsTests', () => {
+  mocha.run();
+});
+
+// Test fixture for the multidevice wifi sync item.
+// eslint-disable-next-line no-var
+var OSSettingsMultideviceWifiSyncItemTest =
+    class extends OSSettingsBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return super.browsePreload +
+        'chromeos/multidevice_page/multidevice_wifi_sync_item.html';
+  }
+
+  /** @override */
+  get extraLibraries() {
+    return super.extraLibraries.concat([
+      BROWSER_SETTINGS_PATH + '../test_util.js',
+      BROWSER_SETTINGS_PATH + '../test_browser_proxy.js',
+      BROWSER_SETTINGS_PATH + 'test_sync_browser_proxy.js',
+      'multidevice_wifi_sync_item_tests.js',
+    ]);
+  }
+};
+
+TEST_F('OSSettingsMultideviceWifiSyncItemTest', 'AllJsTests', () => {
+  mocha.run();
+});
+
+
 // Test fixture for the Nearby Share receive dialog.
 // eslint-disable-next-line no-var
 var OSSettingsNearbyShareReceiveDialogTest =
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index d3fc77a..a8c8e27 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -108,6 +108,11 @@
  ['MultidevicePage', 'multidevice_page_tests.m.js'],
  ['MultideviceSmartLockSubPage', 'multidevice_smartlock_subpage_test.m.js'],
  ['MultideviceSubPage', 'multidevice_subpage_tests.m.js'],
+ [
+   'MultideviceWifiSyncDisabledLink',
+   'multidevice_wifi_sync_disabled_link_tests.m.js'
+ ],
+ ['MultideviceWifiSyncItem', 'multidevice_wifi_sync_item_tests.m.js'],
  ['NetworkProxySection', 'network_proxy_section_test.m.js'],
  ['NetworkSummary', 'network_summary_test.m.js'],
  ['NetworkSummaryItem', 'network_summary_item_test.m.js'],
diff --git a/chrome/test/data/webui/signin/BUILD.gn b/chrome/test/data/webui/signin/BUILD.gn
index 671df08..90d5150 100644
--- a/chrome/test/data/webui/signin/BUILD.gn
+++ b/chrome/test/data/webui/signin/BUILD.gn
@@ -60,6 +60,8 @@
     "..:chai_assert",
     "..:test_util.m",
     "//chrome/browser/resources/signin/profile_picker:profile_picker",
+    "//ui/webui/resources/js:cr.m",
+    "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
diff --git a/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js b/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js
index 4c1bfd7..0d2ace3 100644
--- a/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js
+++ b/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js
@@ -35,6 +35,8 @@
       headerText: 'header_text',
       bodyTitle: 'body_title',
       bodyText: 'body_text',
+      confirmButtonLabel: 'confirm_label',
+      cancelButtonLabel: 'cancel_label',
       headerTextColor: 'rgba(255, 255, 255, 1)',
       headerBackgroundColor: 'rgba(255, 0, 0, 1)',
       interceptedAccount: {isManaged: false, pictureUrl: AVATAR_URL_1},
@@ -55,13 +57,18 @@
    * @param {string} expectedBodyText
    */
   function checkTextValues(
-      expectedHeaderText, expectedBodyTitle, expectedBodyText) {
+      expectedHeaderText, expectedBodyTitle, expectedBodyText,
+      expectedConfirmLabel, expectedCancelLabel) {
     const headerTextElement = app.$$('#headerText');
     assertEquals(expectedHeaderText, headerTextElement.textContent);
     const titleElement = app.$$('#title');
     assertEquals(expectedBodyTitle, titleElement.textContent);
     const contentsElement = app.$$('#contents');
     assertEquals(expectedBodyText, contentsElement.textContent);
+    const confirmButton = app.$$('#acceptButton');
+    assertEquals(expectedConfirmLabel, confirmButton.textContent.trim());
+    const cancelButton = app.$$('#cancelButton');
+    assertEquals(expectedCancelLabel, cancelButton.textContent.trim());
   }
 
   function checkImageUrl(elementId, expectedUrl) {
@@ -84,18 +91,24 @@
 
   test('TextValues', function() {
     // Initial values.
-    checkTextValues('header_text', 'body_title', 'body_text');
+    checkTextValues(
+        'header_text', 'body_title', 'body_text', 'confirm_label',
+        'cancel_label');
 
     // Update the values.
     fireParametersChanged({
       headerText: 'new_header_text',
       bodyTitle: 'new_body_title',
       bodyText: 'new_body_text',
+      confirmButtonLabel: 'new_confirm_label',
+      cancelButtonLabel: 'new_cancel_label',
       headerTextColor: 'rgba(255, 255, 255, 1)',
       headerBackgroundColor: 'rgba(255, 0, 0, 1)',
       interceptedAccount: {isManaged: false, pictureUrl: AVATAR_URL_1},
     });
-    checkTextValues('new_header_text', 'new_body_title', 'new_body_text');
+    checkTextValues(
+        'new_header_text', 'new_body_title', 'new_body_text',
+        'new_confirm_label', 'new_cancel_label');
   });
 
   test('Avatars', function() {
@@ -107,6 +120,8 @@
       headerText: 'header_text',
       bodyTitle: 'body_title',
       bodyText: 'body_text',
+      confirmButtonLabel: 'confirm_label',
+      cancelButtonLabel: 'cancel_label',
       headerTextColor: 'rgba(255, 255, 255, 1)',
       headerBackgroundColor: 'rgba(255, 0, 0, 1)',
       interceptedAccount: {isManaged: false, pictureUrl: AVATAR_URL_2},
diff --git a/chrome/test/data/webui/signin/profile_picker_app_test.js b/chrome/test/data/webui/signin/profile_picker_app_test.js
index 811eec7c..e6e13965 100644
--- a/chrome/test/data/webui/signin/profile_picker_app_test.js
+++ b/chrome/test/data/webui/signin/profile_picker_app_test.js
@@ -3,75 +3,119 @@
 // found in the LICENSE file.
 
 import {ensureLazyLoaded, ManageProfilesBrowserProxyImpl, navigateTo, Routes} from 'chrome://profile-picker/profile_picker.js';
+import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {assertTrue} from '../chai_assert.js';
+import {assertEquals, assertTrue} from '../chai_assert.js';
 import {waitBeforeNextRender} from '../test_util.m.js';
 
 import {TestManageProfilesBrowserProxy} from './test_manage_profiles_browser_proxy.js';
 
 suite('ProfilePickerAppTest', function() {
   /** @type {!ProfilePickerAppElement} */
-  let app;
+  let testElement;
 
   /** @type {!TestManageProfilesBrowserProxy} */
   let browserProxy;
 
+  function resetTestElement(route) {
+    document.body.innerHTML = '';
+    navigateTo(route);
+    testElement = /** @type {!ProfilePickerAppElement} */ (
+        document.createElement('profile-picker-app'));
+    document.body.appendChild(testElement);
+    return waitBeforeNextRender(testElement);
+  }
+
   setup(function() {
     browserProxy = new TestManageProfilesBrowserProxy();
     ManageProfilesBrowserProxyImpl.instance_ = browserProxy;
 
-    // Reset state of the test element.
-    document.body.innerHTML = '';
-    navigateTo(Routes.MAIN);
-    app = /** @type {!ProfilePickerAppElement} */ (
-        document.createElement('profile-picker-app'));
-    document.body.appendChild(app);
+    return resetTestElement(Routes.MAIN);
   });
 
   /**
    * @return {!Promise} Promise that resolves when initialization is complete
    *     and the lazy loaded module has been loaded.
    */
-  function waitForLoad() {
+  function waitForProfileCretionLoad() {
     return Promise.all([
       browserProxy.whenCalled('getNewProfileSuggestedThemeInfo'),
       ensureLazyLoaded(),
     ]);
   }
 
-  test('signInButtonImplementation', function() {
-    navigateTo(Routes.NEW_PROFILE);
-    return waitForLoad()
-        .then(() => {
-          return waitBeforeNextRender(app);
-        })
-        .then(() => {
-          const choice = /** @type {!ProfileTypeChoiceElement} */ (
-              app.$$('profile-type-choice'));
-          assertTrue(!!choice);
-          choice.$$('#signInButton').click();
-          assertTrue(choice.$$('#signInButton').disabled);
-          assertTrue(choice.$$('#notNowButton').disabled);
-          return browserProxy.whenCalled('loadSignInProfileCreationFlow');
-        });
+  test('ProfilePickerMainView', async function() {
+    assertEquals(
+        testElement.shadowRoot.querySelectorAll('[slot=view]').length, 1);
+    const mainView = /** @type {!ProfilePickerMainViewElement} */ (
+        testElement.$$('profile-picker-main-view'));
+    assertTrue(mainView.classList.contains('active'));
+    await browserProxy.whenCalled('initializeMainView');
+    assertTrue(mainView.$$('#wrapper').hidden);
+    const profile = {
+      profilePath: 'profile1',
+      localProfileName: 'Work',
+      isSyncing: true,
+      gaiaName: 'Alice',
+      userName: 'Alice@gmail.com',
+      isManaged: false,
+      avatarIcon: 'url',
+    };
+    webUIListenerCallback('profiles-list-changed', [profile]);
+    flush();
+    assertEquals(
+        mainView.shadowRoot.querySelectorAll('profile-card').length, 1);
+    mainView.$$('#addProfile').querySelectorAll('cr-icon-button')[0].click();
+    await waitForProfileCretionLoad();
+    await waitBeforeNextRender(testElement);
+    assertEquals(
+        testElement.shadowRoot.querySelectorAll('[slot=view]').length, 2);
+    assertTrue(!mainView.classList.contains('active'));
   });
 
-  test('notNowButtonImplementation', function() {
-    navigateTo(Routes.NEW_PROFILE);
-    return waitForLoad()
-        .then(() => {
-          return waitBeforeNextRender(app);
-        })
-        .then(() => {
-          const choice = /** @type {!ProfileTypeChoiceElement} */ (
-              app.$$('profile-type-choice'));
-          assertTrue(!!choice);
-          choice.$$('#notNowButton').click();
-          const customization =
-              /** @type {!LocalProfileCustomizationElement} */ (
-                  app.$$('local-profile-customization'));
-          assertTrue(!!customization);
-          assertTrue(customization.classList.contains('active'));
-        });
+  test('SignInPromoSignIn', async function() {
+    resetTestElement(Routes.NEW_PROFILE);
+    await waitForProfileCretionLoad();
+    await waitBeforeNextRender(testElement);
+    const choice = /** @type {!ProfileTypeChoiceElement} */ (
+        testElement.$$('profile-type-choice'));
+    assertTrue(!!choice);
+    choice.$$('#signInButton').click();
+    assertTrue(choice.$$('#signInButton').disabled);
+    assertTrue(choice.$$('#notNowButton').disabled);
+    assertTrue(choice.$$('#backButton').disabled);
+    return browserProxy.whenCalled('loadSignInProfileCreationFlow');
+  });
+
+  test('SignInPromoLocalProfile', async function() {
+    resetTestElement(Routes.NEW_PROFILE);
+    await waitForProfileCretionLoad();
+    await waitBeforeNextRender(testElement);
+
+    const choice = /** @type {!ProfileTypeChoiceElement} */ (
+        testElement.$$('profile-type-choice'));
+    assertTrue(!!choice);
+    choice.$$('#notNowButton').click();
+    const customization =
+        /** @type {!LocalProfileCustomizationElement} */ (
+            testElement.$$('local-profile-customization'));
+    assertTrue(!!customization);
+    assertTrue(customization.classList.contains('active'));
+  });
+
+  test('ProfileCreationNotAllowed', async function() {
+    document.body.innerHTML = '';
+    loadTimeData.overrideValues({
+      isProfileCreationAllowed: false,
+    });
+    resetTestElement(Routes.NEW_PROFILE);
+    assertEquals(
+        testElement.shadowRoot.querySelectorAll('[slot=view]').length, 1);
+    const mainView = /** @type {!ProfilePickerMainViewElement} */ (
+        testElement.$$('profile-picker-main-view'));
+    await waitBeforeNextRender(testElement);
+    assertTrue(mainView.classList.contains('active'));
   });
 });
diff --git a/chrome/test/data/webui/signin/signin_browsertest.js b/chrome/test/data/webui/signin/signin_browsertest.js
index 8e539535..6cdf8f46 100644
--- a/chrome/test/data/webui/signin/signin_browsertest.js
+++ b/chrome/test/data/webui/signin/signin_browsertest.js
@@ -129,7 +129,7 @@
   }
 };
 
-TEST_F('ProfilePickerAppTest', 'ButtonsImplementation', function() {
+TEST_F('ProfilePickerAppTest', 'All', function() {
   mocha.run();
 });
 
diff --git a/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js b/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js
index dc66379..627883e 100644
--- a/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js
+++ b/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js
@@ -15,6 +15,8 @@
       headerText: '',
       bodyTitle: '',
       bodyText: '',
+      cancelButtonLabel: '',
+      confirmButtonLabel: '',
       headerTextColor: '',
       headerBackgroundColor: '',
       interceptedAccount: {isManaged: false, pictureUrl: ''},
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
index 43797f0..b056bb3 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -3,6 +3,7 @@
 <translationbundle lang="en-GB">
 <translation id="1276998909102132017">Gallery images</translation>
 <translation id="1430915738399379752">Print</translation>
+<translation id="1473110567575736769">Three seconds timer</translation>
 <translation id="1620510694547887537">Camera</translation>
 <translation id="1627744224761163218">4 x 4</translation>
 <translation id="1664224225747386870">Nothing recorded</translation>
@@ -30,6 +31,7 @@
 <translation id="3517926952904427380">Unable to take portrait photo</translation>
 <translation id="3569311554794739032">Do you really want to remove <ph name="FILE" />?</translation>
 <translation id="3810838688059735925">Video</translation>
+<translation id="4000398125663085899">New photos and videos will now be saved to a folder in the Files app: My files &gt; Camera</translation>
 <translation id="4118525110028899586">Pause recording</translation>
 <translation id="4279490309300973883">Mirroring</translation>
 <translation id="4329152592498422850">Switch to take square photo</translation>
@@ -62,6 +64,7 @@
 <translation id="6965382102122355670">OK</translation>
 <translation id="698156982839284926">3 seconds</translation>
 <translation id="712848772518857951">Do you really want to remove <ph name="COUNT" /> items?</translation>
+<translation id="7134221860976209830">10 seconds timer</translation>
 <translation id="7243947652761655814">Video resolution</translation>
 <translation id="7337660886763914220">File system errors.</translation>
 <translation id="7557677699350329807">Switch to next camera</translation>
diff --git a/chromeos/components/diagnostics_ui/diagnostics_ui.cc b/chromeos/components/diagnostics_ui/diagnostics_ui.cc
index 2c3e542a..13c2e4b 100644
--- a/chromeos/components/diagnostics_ui/diagnostics_ui.cc
+++ b/chromeos/components/diagnostics_ui/diagnostics_ui.cc
@@ -67,8 +67,8 @@
   }
 
   source->SetDefaultResource(default_resource);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
 }
 
 }  // namespace
diff --git a/chromeos/components/help_app_ui/help_app_untrusted_ui.cc b/chromeos/components/help_app_ui/help_app_untrusted_ui.cc
index 67abad4..7975ffb 100644
--- a/chromeos/components/help_app_ui/help_app_untrusted_ui.cc
+++ b/chromeos/components/help_app_ui/help_app_untrusted_ui.cc
@@ -25,7 +25,7 @@
   // the other paths.
   source->SetDefaultResource(IDR_HELP_APP_APP_HTML);
   source->AddResourcePath("app_bin.js", IDR_HELP_APP_APP_BIN_JS);
-  source->AddResourcePath("load_time_data.js", IDR_WEBUI_JS_LOAD_TIME_DATA);
+  source->AddResourcePath("load_time_data.js", IDR_WEBUI_JS_LOAD_TIME_DATA_JS);
   source->AddResourcePath("help_app_app_scripts.js",
                           IDR_HELP_APP_APP_SCRIPTS_JS);
   source->DisableTrustedTypesCSP();
diff --git a/chromeos/components/print_management/print_management_ui.cc b/chromeos/components/print_management/print_management_ui.cc
index 7179fa6..86ef5ec 100644
--- a/chromeos/components/print_management/print_management_ui.cc
+++ b/chromeos/components/print_management/print_management_ui.cc
@@ -38,8 +38,8 @@
     source->AddResourcePath(path, resource.value);
   }
   source->SetDefaultResource(default_resource);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
 }
 
 void AddPrintManagementStrings(content::WebUIDataSource* html_source) {
diff --git a/chromeos/components/scanning/scanning_ui.cc b/chromeos/components/scanning/scanning_ui.cc
index 9bfefd855..fb47db9 100644
--- a/chromeos/components/scanning/scanning_ui.cc
+++ b/chromeos/components/scanning/scanning_ui.cc
@@ -42,8 +42,8 @@
   }
 
   source->SetDefaultResource(default_resource);
-  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
-  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML);
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
 }
 
 void AddScanningAppStrings(content::WebUIDataSource* html_source) {
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index 57e8336..863f4568 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -79,6 +79,26 @@
   kPublicSession
 };
 
+// Device mode (e.g. enterprise enrollment state). See policy::DeviceMode.
+[Stable, Extensible]
+enum DeviceMode {
+  kUnknown = 0,
+  // Not yet set.
+  kNotSet,
+  // Locally owned as consumer device.
+  kConsumer,
+  // Enrolled as an enterprise device.
+  kEnterprise,
+  // Joined Active Directory.
+  kEnterpriseActiveDirectory,
+  // Retail kiosk device.
+  kLegacyRetailMode,
+  // Locally owned as consumer kiosk and can auto-launch a kiosk webapp.
+  kConsumerKioskAutolaunch,
+  // Demo mode, either enrolled online or setup in offline demo mode.
+  kDemo,
+};
+
 // LacrosInitParams is a set of parameters for initialization of lacros-chrome,
 // which is passed from ash-chrome to lacros-chrome. Since ash-chrome and
 // lacros-chrome may have different versions, lacros-chrome must handle this
@@ -114,9 +134,15 @@
   [MinVersion=2]
   bool ash_metrics_enabled@2;
 
-  // Type of the ash-chrome session.
+  // Type of the ash-chrome session at lacros startup time.
   [MinVersion=3]
   SessionType session_type@3;
+
+  // Device mode at lacros startup time. If lacros is running during the
+  // out-of-box experience, the device mode might change later (e.g. if the
+  // user chooses to enroll the device).
+  [MinVersion=4]
+  DeviceMode device_mode@4;
 };
 
 // LacrosChromeService defines the APIs that live in lacros-chrome and
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index 0b9bbff..68473e8 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -37,7 +37,7 @@
 <translation id="3820172043799983114">ПИН буруу байна.</translation>
 <translation id="3838338534323494292">Шинэ нууц үг</translation>
 <translation id="39823212440917567"><ph name="NUMBER_OF_DAYS" /> хоногоос дээш хугацаагаар хадгалсан хэвлэлийн ажлуудыг хасах болно</translation>
-<translation id="4003259559679196451"><ph name="ENROLLMENT_DOMAIN" /> энэ төхөөрөмжийг удирддаг бөгөөд хэрэглэгчийн зочилсон вэб хуудас, нууц үг болон имэйл зэрэг бүх үйл ажиллагаанд хандах эрхтэй.</translation>
+<translation id="4003259559679196451"><ph name="ENROLLMENT_DOMAIN" /> энэ төхөөрөмжийг удирддаг бөгөөд хэрэглэгчийн зочилсон веб хуудас, нууц үг болон имэйл зэрэг бүх үйл ажиллагаанд хандах эрхтэй.</translation>
 <translation id="4003384961948020559">Амжилтгүй болсон - Гаралт дүүрсэн</translation>
 <translation id="4027485274696301677">Энэ <ph name="DEVICE_TYPE" />-г <ph name="ENROLLMENT_DOMAIN" /> удирддаг. Администратор төхөөрөмжийг алсаас тохируулах боломжтой.</translation>
 <translation id="4034824040120875894">Хэвлэгч</translation>
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn
index c147d10..cf7a038c 100644
--- a/components/autofill_assistant/browser/BUILD.gn
+++ b/components/autofill_assistant/browser/BUILD.gn
@@ -294,6 +294,7 @@
     "basic_interactions_unittest.cc",
     "batch_element_checker_unittest.cc",
     "client_context_unittest.cc",
+    "client_settings_unittest.cc",
     "controller_unittest.cc",
     "details_unittest.cc",
     "element_area_unittest.cc",
diff --git a/components/autofill_assistant/browser/actions/action_delegate.h b/components/autofill_assistant/browser/actions/action_delegate.h
index d848368..d3cc385 100644
--- a/components/autofill_assistant/browser/actions/action_delegate.h
+++ b/components/autofill_assistant/browser/actions/action_delegate.h
@@ -231,6 +231,15 @@
       base::OnceCallback<void(const ClientStatus&, const std::string&)>
           callback) = 0;
 
+  // Get the value of a nested |attribute| from an |element| and return the
+  // result through |callback|. If the lookup fails, the value will be empty.
+  // An empty result does not mean an error.
+  virtual void GetStringAttribute(
+      const std::vector<std::string>& attributes,
+      const ElementFinder::Result& element,
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback) = 0;
+
   // Set the |value| of field |element| and return the result through
   // |callback|. If |simulate_key_presses| is true, the value will be set by
   // clicking the field and then simulating key presses, otherwise the `value`
diff --git a/components/autofill_assistant/browser/actions/mock_action_delegate.h b/components/autofill_assistant/browser/actions/mock_action_delegate.h
index 24c22cab..fa6a0bb 100644
--- a/components/autofill_assistant/browser/actions/mock_action_delegate.h
+++ b/components/autofill_assistant/browser/actions/mock_action_delegate.h
@@ -189,6 +189,12 @@
                     base::OnceCallback<void(const ClientStatus&,
                                             const std::string&)>& callback));
 
+  MOCK_METHOD3(GetStringAttribute,
+               void(const std::vector<std::string>& attributes,
+                    const ElementFinder::Result& element,
+                    base::OnceCallback<void(const ClientStatus&,
+                                            const std::string&)> callback));
+
   void SetFieldValue(const std::string& value,
                      KeyboardValueFillStrategy fill_strategy,
                      int key_press_delay_in_millisecond,
diff --git a/components/autofill_assistant/browser/client_settings.cc b/components/autofill_assistant/browser/client_settings.cc
index 89afa01a..02de395 100644
--- a/components/autofill_assistant/browser/client_settings.cc
+++ b/components/autofill_assistant/browser/client_settings.cc
@@ -4,12 +4,14 @@
 
 #include "components/autofill_assistant/browser/client_settings.h"
 #include "base/logging.h"
+#include "components/autofill_assistant/browser/view_layout.pb.h"
 
 namespace {
 
 bool IsValidOverlayImageProto(
     const autofill_assistant::OverlayImageProto& proto) {
-  if (!proto.image_url().empty() && !proto.has_image_size()) {
+  if ((proto.has_image_drawable() || !proto.image_url().empty()) &&
+      !proto.has_image_size()) {
     VLOG(1) << __func__ << ": Missing image_size in overlay_image, ignoring";
     return false;
   }
@@ -79,8 +81,18 @@
         base::TimeDelta::FromMilliseconds(proto.tap_shutdown_delay_ms());
   }
   if (proto.has_overlay_image()) {
+    // TODO(b/170202574): Add integration test and remove legacy |image_url|.
     if (IsValidOverlayImageProto(proto.overlay_image())) {
       overlay_image = proto.overlay_image();
+      // Legacy treatment for |image_url|.
+      if (!overlay_image->image_url().empty()) {
+        std::string url = overlay_image->image_url();
+        auto* bitmap_proto =
+            overlay_image->mutable_image_drawable()->mutable_bitmap();
+        bitmap_proto->set_url(url);
+        *bitmap_proto->mutable_width() = overlay_image->image_size();
+        *bitmap_proto->mutable_height() = overlay_image->image_size();
+      }
     } else {
       overlay_image.reset();
     }
diff --git a/components/autofill_assistant/browser/client_settings_unittest.cc b/components/autofill_assistant/browser/client_settings_unittest.cc
new file mode 100644
index 0000000..18fd67a
--- /dev/null
+++ b/components/autofill_assistant/browser/client_settings_unittest.cc
@@ -0,0 +1,33 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill_assistant/browser/client_settings.h"
+#include "components/autofill_assistant/browser/mock_client.h"
+
+namespace autofill_assistant {
+
+namespace {
+
+class ClientSettingsTest : public testing::Test {
+ protected:
+  ClientSettingsTest() {}
+  ~ClientSettingsTest() override {}
+};
+
+TEST_F(ClientSettingsTest, CheckLegacyOverlayImage) {
+  ClientSettingsProto proto;
+  proto.mutable_overlay_image()->set_image_url(
+      "https://www.example.com/favicon.ico");
+  proto.mutable_overlay_image()->mutable_image_size()->set_dp(32);
+
+  ClientSettings settings;
+  settings.UpdateFromProto(proto);
+
+  ASSERT_TRUE(settings.overlay_image.has_value());
+  EXPECT_EQ(settings.overlay_image->image_drawable().bitmap().url(),
+            "https://www.example.com/favicon.ico");
+}
+
+}  // namespace
+}  // namespace autofill_assistant
\ No newline at end of file
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc
index 06fa739..05fa5820 100644
--- a/components/autofill_assistant/browser/script_executor.cc
+++ b/components/autofill_assistant/browser/script_executor.cc
@@ -583,6 +583,15 @@
   delegate_->GetWebController()->GetFieldValue(selector, std::move(callback));
 }
 
+void ScriptExecutor::GetStringAttribute(
+    const std::vector<std::string>& attributes,
+    const ElementFinder::Result& element,
+    base::OnceCallback<void(const ClientStatus&, const std::string&)>
+        callback) {
+  delegate_->GetWebController()->GetStringAttribute(element, attributes,
+                                                    std::move(callback));
+}
+
 void ScriptExecutor::SetFieldValue(
     const std::string& value,
     KeyboardValueFillStrategy fill_strategy,
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h
index aa9e1892..0e25de0 100644
--- a/components/autofill_assistant/browser/script_executor.h
+++ b/components/autofill_assistant/browser/script_executor.h
@@ -185,6 +185,11 @@
       const Selector& selector,
       base::OnceCallback<void(const ClientStatus&, const std::string&)>
           callback) override;
+  void GetStringAttribute(
+      const std::vector<std::string>& attributes,
+      const ElementFinder::Result& element,
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback) override;
   void SetFieldValue(
       const std::string& value,
       KeyboardValueFillStrategy fill_strategy,
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 789a9d8c..a2a28db 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -124,8 +124,14 @@
 
 // Overlay image to be drawn on top of full overlays.
 message OverlayImageProto {
-  // The image to display. If set, |image_size| is mandatory.
-  optional string image_url = 1;
+  // TODO(b/170202574): Remove legacy |image_url|.
+  // If set, |image_size| is mandatory.
+  oneof image {
+    // Deprecated, but currently still supported. The image to display.
+    string image_url = 1;
+    // The image to display.
+    DrawableProto image_drawable = 8;
+  }
   // The size of the image to display.
   optional ClientDimensionProto image_size = 2;
   // The margin between the top of the page (anchor) and the image.
diff --git a/components/autofill_assistant/browser/web/mock_web_controller.h b/components/autofill_assistant/browser/web/mock_web_controller.h
index aab8b8d..0be7e9c5 100644
--- a/components/autofill_assistant/browser/web/mock_web_controller.h
+++ b/components/autofill_assistant/browser/web/mock_web_controller.h
@@ -77,6 +77,19 @@
                     base::OnceCallback<void(const ClientStatus&,
                                             const std::string&)>& callback));
 
+  void GetStringAttribute(
+      const ElementFinder::Result& element,
+      const std::vector<std::string>& attributes,
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback) override {
+    OnGetStringAttribute(element, attributes, callback);
+  }
+  MOCK_METHOD3(OnGetStringAttribute,
+               void(const ElementFinder::Result& element,
+                    const std::vector<std::string>& attributes,
+                    base::OnceCallback<void(const ClientStatus&,
+                                            const std::string&)>& callback));
+
   void GetVisualViewport(
       base::OnceCallback<void(bool, const RectF&)> callback) override {
     OnGetVisualViewport(callback);
diff --git a/components/autofill_assistant/browser/web/web_controller.cc b/components/autofill_assistant/browser/web/web_controller.cc
index 562e742..d96fae2 100644
--- a/components/autofill_assistant/browser/web/web_controller.cc
+++ b/components/autofill_assistant/browser/web/web_controller.cc
@@ -112,6 +112,18 @@
 const char* const kGetValueAttributeScript =
     "function () { return this.value; }";
 
+// Javascript code to retrieve the nested |attribute| of a node.
+// The function intentionally has no "has value" check, such that a bad access
+// will return an error.
+const char* const kGetElementAttributeScript =
+    R"(function (attributes) {
+        let it = this;
+        for (let i = 0; i < attributes.length; ++i) {
+          it = it[attributes[i]];
+        }
+        return it;
+      })";
+
 // Javascript code to select the current value.
 const char* const kSelectFieldValue = "function() { this.select(); }";
 
@@ -126,6 +138,8 @@
        })";
 
 // Javascript code to set an attribute of a node to a given value.
+// The function intentionally has no "has value" check, such that a bad access
+// will return an error.
 const char* const kSetAttributeScript =
     R"(function (attribute, value) {
          let receiver = this;
@@ -288,11 +302,25 @@
   ClientStatus status =
       CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
   if (!status.ok()) {
-    VLOG(1) << __func__ << " Failed JavaScript.";
+    VLOG(1) << __func__ << " Failed JavaScript with status: " << status;
   }
   std::move(callback).Run(status);
 }
 
+void WebController::OnJavaScriptResultForString(
+    base::OnceCallback<void(const ClientStatus&, const std::string&)> callback,
+    const DevtoolsClient::ReplyStatus& reply_status,
+    std::unique_ptr<runtime::CallFunctionOnResult> result) {
+  std::string value;
+  ClientStatus status =
+      CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
+  if (!status.ok()) {
+    VLOG(1) << __func__ << "Failed JavaScript with status: " << status;
+  }
+  SafeGetStringValue(result->GetResult(), &value);
+  std::move(callback).Run(status, value);
+}
+
 void WebController::ScrollIntoView(
     const ElementFinder::Result& element,
     base::OnceCallback<void(const ClientStatus&)> callback) {
@@ -902,7 +930,6 @@
     base::OnceCallback<void(const ClientStatus&, const std::string&)> callback,
     const ClientStatus& status,
     std::unique_ptr<ElementFinder::Result> element_result) {
-  const std::string object_id = element_result->object_id;
   if (!status.ok()) {
     std::move(callback).Run(status, "");
     return;
@@ -910,28 +937,44 @@
 
   devtools_client_->GetRuntime()->CallFunctionOn(
       runtime::CallFunctionOnParams::Builder()
-          .SetObjectId(object_id)
+          .SetObjectId(element_result->object_id)
           .SetFunctionDeclaration(std::string(kGetValueAttributeScript))
           .SetReturnByValue(true)
           .Build(),
       element_result->node_frame_id,
-      base::BindOnce(&WebController::OnGetValueAttribute,
+      base::BindOnce(&WebController::OnJavaScriptResultForString,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-void WebController::OnGetValueAttribute(
-    base::OnceCallback<void(const ClientStatus& element_status,
-                            const std::string&)> callback,
-    const DevtoolsClient::ReplyStatus& reply_status,
-    std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  std::string value;
-  ClientStatus status =
-      CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
-  // Read the result returned from Javascript code.
-  VLOG_IF(1, !status.ok()) << __func__
-                           << "Failed to get attribute value: " << status;
-  SafeGetStringValue(result->GetResult(), &value);
-  std::move(callback).Run(status, value);
+void WebController::GetStringAttribute(
+    const ElementFinder::Result& element,
+    const std::vector<std::string>& attributes,
+    base::OnceCallback<void(const ClientStatus&, const std::string&)>
+        callback) {
+  VLOG(3) << __func__ << " attributes=[" << base::JoinString(attributes, ",")
+          << "]";
+
+  if (attributes.empty()) {
+    std::move(callback).Run(UnexpectedErrorStatus(__FILE__, __LINE__), "");
+    return;
+  }
+  base::Value::ListStorage attribute_values;
+  for (const std::string& attribute : attributes) {
+    attribute_values.emplace_back(base::Value(attribute));
+  }
+
+  std::vector<std::unique_ptr<runtime::CallArgument>> arguments;
+  AddRuntimeCallArgument(attribute_values, &arguments);
+  devtools_client_->GetRuntime()->CallFunctionOn(
+      runtime::CallFunctionOnParams::Builder()
+          .SetObjectId(element.object_id)
+          .SetArguments(std::move(arguments))
+          .SetFunctionDeclaration(std::string(kGetElementAttributeScript))
+          .SetReturnByValue(true)
+          .Build(),
+      element.node_frame_id,
+      base::BindOnce(&WebController::OnJavaScriptResultForString,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
 void WebController::SetFieldValue(
@@ -1193,17 +1236,16 @@
     const std::vector<std::string>& attributes,
     const std::string& value,
     base::OnceCallback<void(const ClientStatus&)> callback) {
-#ifdef NDEBUG
-  VLOG(3) << __func__ << " attributes=(redacted), value=(redacted)";
-#else
   DVLOG(3) << __func__ << " attributes=[" << base::JoinString(attributes, ",")
            << "], value=" << value;
-#endif
 
-  DCHECK_GT(attributes.size(), 0u);
+  if (attributes.empty()) {
+    std::move(callback).Run(UnexpectedErrorStatus(__FILE__, __LINE__));
+    return;
+  }
   base::Value::ListStorage attribute_values;
-  for (const std::string& string : attributes) {
-    attribute_values.emplace_back(base::Value(string));
+  for (const std::string& attribute : attributes) {
+    attribute_values.emplace_back(base::Value(attribute));
   }
 
   std::vector<std::unique_ptr<runtime::CallArgument>> arguments;
@@ -1336,27 +1378,10 @@
           .SetReturnByValue(true)
           .Build(),
       element.node_frame_id,
-      base::BindOnce(&WebController::OnGetOuterHtml,
+      base::BindOnce(&WebController::OnJavaScriptResultForString,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-void WebController::OnGetOuterHtml(
-    base::OnceCallback<void(const ClientStatus&, const std::string&)> callback,
-    const DevtoolsClient::ReplyStatus& reply_status,
-    std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  ClientStatus status =
-      CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
-  if (!status.ok()) {
-    VLOG(2) << __func__ << " Failed to get HTML content for GetOuterHtml";
-    std::move(callback).Run(status, "");
-    return;
-  }
-
-  std::string value;
-  SafeGetStringValue(result->GetResult(), &value);
-  std::move(callback).Run(OkClientStatus(), value);
-}
-
 void WebController::GetElementTag(
     const ElementFinder::Result& element,
     base::OnceCallback<void(const ClientStatus&, const std::string&)>
@@ -1368,26 +1393,10 @@
           .SetReturnByValue(true)
           .Build(),
       element.node_frame_id,
-      base::BindOnce(&WebController::OnGetElementTag,
+      base::BindOnce(&WebController::OnJavaScriptResultForString,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-void WebController::OnGetElementTag(
-    base::OnceCallback<void(const ClientStatus&, const std::string&)> callback,
-    const DevtoolsClient::ReplyStatus& reply_status,
-    std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  ClientStatus status =
-      CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
-  if (!status.ok()) {
-    VLOG(2) << __func__ << " Failed to get element tag for GetElementTag";
-    std::move(callback).Run(status, "");
-    return;
-  }
-  std::string value;
-  SafeGetStringValue(result->GetResult(), &value);
-  std::move(callback).Run(OkClientStatus(), value);
-}
-
 void WebController::InternalWaitForDocumentToBecomeInteractive(
     int remaining_rounds,
     const std::string& object_id,
diff --git a/components/autofill_assistant/browser/web/web_controller.h b/components/autofill_assistant/browser/web/web_controller.h
index 37ecd7c..0edde14 100644
--- a/components/autofill_assistant/browser/web/web_controller.h
+++ b/components/autofill_assistant/browser/web/web_controller.h
@@ -151,6 +151,15 @@
       base::OnceCallback<void(const ClientStatus&, const std::string&)>
           callback);
 
+  // Get the value of a nested |attribute| from an |element| and return the
+  // result through |callback|. If the lookup fails, the value will be empty.
+  // An empty result does not mean an error.
+  virtual void GetStringAttribute(
+      const ElementFinder::Result& element,
+      const std::vector<std::string>& attributes,
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback);
+
   // Set the |value| of field |element| and return the result through
   // |callback|. The strategy used to fill the value is defined by
   // |fill_strategy|, see the proto for further explanation.
@@ -281,6 +290,11 @@
       base::OnceCallback<void(const ClientStatus&)> callback,
       const DevtoolsClient::ReplyStatus& reply_status,
       std::unique_ptr<runtime::CallFunctionOnResult> result);
+  void OnJavaScriptResultForString(
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback,
+      const DevtoolsClient::ReplyStatus& reply_status,
+      std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnWaitForDocumentToBecomeInteractive(
       base::OnceCallback<void(const ClientStatus&)> callback,
       bool result);
@@ -360,11 +374,6 @@
           callback,
       const ClientStatus& status,
       std::unique_ptr<ElementFinder::Result> element_result);
-  void OnGetValueAttribute(
-      base::OnceCallback<void(const ClientStatus&, const std::string&)>
-          callback,
-      const DevtoolsClient::ReplyStatus& reply_status,
-      std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnClearFieldForSetFieldValue(
       const ElementFinder::Result& element,
       const std::vector<UChar32>& codepoints,
@@ -420,14 +429,6 @@
       const ElementFinder::Result& element,
       const std::string& value,
       base::OnceCallback<void(const ClientStatus&)> callback);
-  void OnGetOuterHtml(base::OnceCallback<void(const ClientStatus&,
-                                              const std::string&)> callback,
-                      const DevtoolsClient::ReplyStatus& reply_status,
-                      std::unique_ptr<runtime::CallFunctionOnResult> result);
-  void OnGetElementTag(base::OnceCallback<void(const ClientStatus&,
-                                               const std::string&)> callback,
-                       const DevtoolsClient::ReplyStatus& reply_status,
-                       std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForPosition(
       base::OnceCallback<void(bool, const RectF&)> callback,
       const ClientStatus& status,
diff --git a/components/autofill_assistant/browser/web/web_controller_browsertest.cc b/components/autofill_assistant/browser/web/web_controller_browsertest.cc
index f1d4349..dbb40ec 100644
--- a/components/autofill_assistant/browser/web/web_controller_browsertest.cc
+++ b/components/autofill_assistant/browser/web/web_controller_browsertest.cc
@@ -148,6 +148,19 @@
     std::move(done_callback).Run();
   }
 
+  void ElementRetainingStringCallback(
+      std::unique_ptr<ElementFinder::Result> element,
+      base::OnceClosure done_callback,
+      ClientStatus* result_output,
+      std::string* result,
+      const ClientStatus& status,
+      const std::string& value) {
+    EXPECT_TRUE(element != nullptr);
+    *result_output = status;
+    result->assign(value);
+    std::move(done_callback).Run();
+  }
+
   void ClickOrTapElement(const Selector& selector, ClickType click_type) {
     base::RunLoop run_loop;
     ClientStatus result_output;
@@ -356,6 +369,7 @@
             html_output));
 
     run_loop.Run();
+    EXPECT_EQ(ACTION_APPLIED, result.proto_status());
     return result;
   }
 
@@ -369,22 +383,10 @@
     ASSERT_TRUE(element_result != nullptr);
     web_controller_->GetOuterHtml(
         *element_result,
-        base::BindOnce(&WebControllerBrowserTest::OnGetOuterHtml,
-                       base::Unretained(this), std::move(done_callback),
-                       result_output, html_output, std::move(element_result)));
-  }
-
-  void OnGetOuterHtml(base::OnceClosure done_callback,
-                      ClientStatus* successful_output,
-                      std::string* html_output,
-                      std::unique_ptr<ElementFinder::Result> element,
-                      const ClientStatus& status,
-                      const std::string& html) {
-    EXPECT_EQ(ACTION_APPLIED, status.proto_status());
-    EXPECT_TRUE(element != nullptr);
-    *successful_output = status;
-    *html_output = html;
-    std::move(done_callback).Run();
+        base::BindOnce(
+            &WebControllerBrowserTest::ElementRetainingStringCallback,
+            base::Unretained(this), std::move(element_result),
+            std::move(done_callback), result_output, html_output));
   }
 
   ClientStatus GetElementTag(const Selector& selector,
@@ -400,6 +402,7 @@
             element_tag_output));
 
     run_loop.Run();
+    EXPECT_EQ(ACTION_APPLIED, result.proto_status());
     return result;
   }
 
@@ -413,23 +416,10 @@
     ASSERT_TRUE(element_result != nullptr);
     web_controller_->GetElementTag(
         *element_result,
-        base::BindOnce(&WebControllerBrowserTest::OnGetElementTag,
-                       base::Unretained(this), std::move(done_callback),
-                       result_output, element_tag_output,
-                       std::move(element_result)));
-  }
-
-  void OnGetElementTag(base::OnceClosure done_callback,
-                       ClientStatus* successful_output,
-                       std::string* element_tag_output,
-                       std::unique_ptr<ElementFinder::Result> element,
-                       const ClientStatus& status,
-                       const std::string& element_tag) {
-    EXPECT_EQ(ACTION_APPLIED, status.proto_status());
-    ASSERT_TRUE(element != nullptr);
-    *successful_output = status;
-    *element_tag_output = element_tag;
-    std::move(done_callback).Run();
+        base::BindOnce(
+            &WebControllerBrowserTest::ElementRetainingStringCallback,
+            base::Unretained(this), std::move(element_result),
+            std::move(done_callback), result_output, element_tag_output));
   }
 
   void FindElement(const Selector& selector,
@@ -491,6 +481,40 @@
     EXPECT_FALSE(result.object_id.empty());
   }
 
+  ClientStatus GetStringAttribute(const Selector& selector,
+                                  const std::vector<std::string>& attributes,
+                                  std::string* value) {
+    base::RunLoop run_loop;
+    ClientStatus result;
+
+    web_controller_->FindElement(
+        selector, /* strict= */ true,
+        base::BindOnce(
+            &WebControllerBrowserTest::FindGetStringAttributeElementCallback,
+            base::Unretained(this), attributes, run_loop.QuitClosure(), &result,
+            value));
+
+    run_loop.Run();
+    return result;
+  }
+
+  void FindGetStringAttributeElementCallback(
+      const std::vector<std::string>& attributes,
+      base::OnceClosure done_callback,
+      ClientStatus* result_output,
+      std::string* value,
+      const ClientStatus& element_status,
+      std::unique_ptr<ElementFinder::Result> element_result) {
+    EXPECT_EQ(ACTION_APPLIED, element_status.proto_status());
+    ASSERT_TRUE(element_result != nullptr);
+    web_controller_->GetStringAttribute(
+        *element_result, attributes,
+        base::BindOnce(
+            &WebControllerBrowserTest::ElementRetainingStringCallback,
+            base::Unretained(this), std::move(element_result),
+            std::move(done_callback), result_output, value));
+  }
+
   void GetFieldsValue(const std::vector<Selector>& selectors,
                       const std::vector<std::string>& expected_values) {
     base::RunLoop run_loop;
@@ -553,20 +577,11 @@
     web_controller_->SetFieldValue(
         *element_result, value, fill_strategy,
         /* key_press_delay_in_millisecond= */ 0,
-        base::BindOnce(&WebControllerBrowserTest::SetFieldValueCallback,
+        base::BindOnce(&WebControllerBrowserTest::ElementRetainingCallback,
                        base::Unretained(this), std::move(element_result),
                        std::move(done_callback), result_output));
   }
 
-  void SetFieldValueCallback(std::unique_ptr<ElementFinder::Result> element,
-                             base::OnceClosure done_callback,
-                             ClientStatus* result_output,
-                             const ClientStatus& status) {
-    EXPECT_TRUE(element != nullptr);
-    *result_output = status;
-    std::move(done_callback).Run();
-  }
-
   ClientStatus SendKeyboardInput(const Selector& selector,
                                  const std::vector<UChar32>& codepoints,
                                  int delay_in_milli) {
@@ -2054,4 +2069,25 @@
   GetFieldsValue({selector}, {"email@example.com"});
 }
 
+IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetStringAttribute) {
+  std::string value;
+
+  std::vector<std::string> inner_text_attribute = {"innerText"};
+  ASSERT_EQ(ACTION_APPLIED, GetStringAttribute(Selector({"#testOuterHtml p"}),
+                                               inner_text_attribute, &value)
+                                .proto_status());
+  EXPECT_EQ("Paragraph", value);
+
+  std::vector<std::string> option_label_attribute = {"options", "2", "label"};
+  ASSERT_EQ(ACTION_APPLIED, GetStringAttribute(Selector({"#select"}),
+                                               option_label_attribute, &value)
+                                .proto_status());
+  EXPECT_EQ("Three", value);
+
+  std::vector<std::string> bad_access = {"none", "none"};
+  ASSERT_EQ(UNEXPECTED_JS_ERROR,
+            GetStringAttribute(Selector({"#button"}), bad_access, &value)
+                .proto_status());
+}
+
 }  // namespace autofill_assistant
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java
index 66c4ee1..e42bd14 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java
@@ -36,19 +36,17 @@
     private static class ResourceItem {
         private final int mIcon;
         private final int mTitle;
-        private final int mExplanation;
         private final @ContentSettingValues @Nullable Integer mDefaultEnabledValue;
         private final @ContentSettingValues @Nullable Integer mDefaultDisabledValue;
         private final int mEnabledSummary;
         private final int mDisabledSummary;
 
-        ResourceItem(int icon, int title, int explanation,
+        ResourceItem(int icon, int title,
                 @ContentSettingValues @Nullable Integer defaultEnabledValue,
                 @ContentSettingValues @Nullable Integer defaultDisabledValue, int enabledSummary,
                 int disabledSummary) {
             mIcon = icon;
             mTitle = title;
-            mExplanation = explanation;
             mDefaultEnabledValue = defaultEnabledValue;
             mDefaultDisabledValue = defaultDisabledValue;
             mEnabledSummary = enabledSummary;
@@ -63,10 +61,6 @@
             return mTitle;
         }
 
-        private int getExplanation() {
-            return mExplanation;
-        }
-
         private @ContentSettingValues @Nullable Integer getDefaultEnabledValue() {
             return mDefaultEnabledValue;
         }
@@ -99,107 +93,94 @@
             Map<Integer, ResourceItem> localMap = new HashMap<Integer, ResourceItem>();
             localMap.put(ContentSettingsType.ADS,
                     new ResourceItem(R.drawable.web_asset, R.string.ads_permission_title,
-                            R.string.ads_permission_title, ContentSettingValues.ALLOW,
-                            ContentSettingValues.BLOCK, 0,
+                            ContentSettingValues.ALLOW, ContentSettingValues.BLOCK, 0,
                             R.string.website_settings_category_ads_blocked));
             localMap.put(ContentSettingsType.AR,
                     new ResourceItem(R.drawable.vr_headset, R.string.ar_permission_title,
-                            R.string.ar_permission_title, ContentSettingValues.ASK,
-                            ContentSettingValues.BLOCK, R.string.website_settings_category_ar_ask,
+                            ContentSettingValues.ASK, ContentSettingValues.BLOCK,
+                            R.string.website_settings_category_ar_ask,
                             R.string.website_settings_category_ar_blocked));
             localMap.put(ContentSettingsType.AUTOMATIC_DOWNLOADS,
                     new ResourceItem(R.drawable.infobar_downloading,
-                            R.string.automatic_downloads_permission_title,
                             R.string.automatic_downloads_permission_title, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK, R.string.website_settings_category_ask, 0));
             localMap.put(ContentSettingsType.BACKGROUND_SYNC,
                     new ResourceItem(R.drawable.permission_background_sync,
-                            R.string.background_sync_permission_title,
                             R.string.background_sync_permission_title, ContentSettingValues.ALLOW,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_allowed_recommended, 0));
             localMap.put(ContentSettingsType.BLUETOOTH_CHOOSER_DATA,
-                    new ResourceItem(R.drawable.settings_bluetooth, 0, 0, ContentSettingValues.ASK,
+                    new ResourceItem(R.drawable.settings_bluetooth, 0, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK, 0, 0));
             localMap.put(ContentSettingsType.BLUETOOTH_GUARD,
                     new ResourceItem(R.drawable.settings_bluetooth,
-                            R.string.website_settings_bluetooth,
                             R.string.website_settings_bluetooth, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_bluetooth_ask,
                             R.string.website_settings_category_bluetooth_blocked));
             localMap.put(ContentSettingsType.BLUETOOTH_SCANNING,
                     new ResourceItem(R.drawable.ic_bluetooth_searching_black_24dp,
-                            R.string.website_settings_bluetooth_scanning,
                             R.string.website_settings_bluetooth_scanning, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_bluetooth_scanning_ask, 0));
             localMap.put(ContentSettingsType.CLIPBOARD_READ_WRITE,
                     new ResourceItem(R.drawable.ic_content_paste_grey600_24dp,
-                            R.string.clipboard_permission_title,
                             R.string.clipboard_permission_title, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_clipboard_ask,
                             R.string.website_settings_category_clipboard_blocked));
             localMap.put(ContentSettingsType.COOKIES,
                     new ResourceItem(R.drawable.permission_cookie, R.string.cookies_title,
-                            R.string.cookies_title, ContentSettingValues.ALLOW,
-                            ContentSettingValues.BLOCK,
+                            ContentSettingValues.ALLOW, ContentSettingValues.BLOCK,
                             R.string.website_settings_category_cookie_allowed, 0));
             localMap.put(ContentSettingsType.GEOLOCATION,
                     new ResourceItem(R.drawable.permission_location,
-                            R.string.website_settings_device_location,
-                            R.string.geolocation_permission_title, ContentSettingValues.ASK,
+                            R.string.website_settings_device_location, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_location_ask, 0));
             localMap.put(ContentSettingsType.IDLE_DETECTION,
                     new ResourceItem(R.drawable.permission_idle_detection,
-                            R.string.website_settings_idle_detection,
-                            R.string.idle_detection_permission_title, ContentSettingValues.ASK,
+                            R.string.website_settings_idle_detection, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_idle_detection_ask,
                             R.string.website_settings_category_idle_detection_blocked));
             localMap.put(ContentSettingsType.JAVASCRIPT,
                     new ResourceItem(R.drawable.permission_javascript,
-                            R.string.javascript_permission_title,
                             R.string.javascript_permission_title, ContentSettingValues.ALLOW,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_javascript_allowed, 0));
             localMap.put(ContentSettingsType.MEDIASTREAM_CAMERA,
                     new ResourceItem(R.drawable.ic_videocam_white_24dp,
-                            R.string.website_settings_use_camera, R.string.camera_permission_title,
-                            ContentSettingValues.ASK, ContentSettingValues.BLOCK,
+                            R.string.website_settings_use_camera, ContentSettingValues.ASK,
+                            ContentSettingValues.BLOCK,
                             R.string.website_settings_category_camera_ask, 0));
             localMap.put(ContentSettingsType.MEDIASTREAM_MIC,
                     new ResourceItem(R.drawable.permission_mic, R.string.website_settings_use_mic,
-                            R.string.mic_permission_title, ContentSettingValues.ASK,
-                            ContentSettingValues.BLOCK, R.string.website_settings_category_mic_ask,
-                            0));
+                            ContentSettingValues.ASK, ContentSettingValues.BLOCK,
+                            R.string.website_settings_category_mic_ask, 0));
             localMap.put(ContentSettingsType.MIDI_SYSEX,
-                    new ResourceItem(R.drawable.permission_midi, 0,
+                    new ResourceItem(R.drawable.permission_midi,
                             R.string.midi_sysex_permission_title, null, null, 0, 0));
             localMap.put(ContentSettingsType.NFC,
                     new ResourceItem(R.drawable.settings_nfc, R.string.nfc_permission_title,
-                            R.string.nfc_permission_title, ContentSettingValues.ASK,
-                            ContentSettingValues.BLOCK, R.string.website_settings_category_nfc_ask,
+                            ContentSettingValues.ASK, ContentSettingValues.BLOCK,
+                            R.string.website_settings_category_nfc_ask,
                             R.string.website_settings_category_nfc_blocked));
             localMap.put(ContentSettingsType.NOTIFICATIONS,
                     new ResourceItem(R.drawable.permission_push_notification,
-                            R.string.push_notifications_permission_title,
                             R.string.push_notifications_permission_title, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK,
                             R.string.website_settings_category_notifications_ask, 0));
             localMap.put(ContentSettingsType.POPUPS,
                     new ResourceItem(R.drawable.permission_popups, R.string.popup_permission_title,
-                            R.string.popup_permission_title, ContentSettingValues.ALLOW,
-                            ContentSettingValues.BLOCK, 0,
+                            ContentSettingValues.ALLOW, ContentSettingValues.BLOCK, 0,
                             R.string.website_settings_category_popups_redirects_blocked));
             // PROTECTED_MEDIA_IDENTIFIER uses 3-state preference so some values are not used.
             // If 3-state becomes more common we should update localMaps to support it better.
             localMap.put(ContentSettingsType.PROTECTED_MEDIA_IDENTIFIER,
                     new ResourceItem(R.drawable.permission_protected_media,
-                            R.string.protected_content, R.string.protected_content,
-                            ContentSettingValues.ASK, ContentSettingValues.BLOCK, 0, 0));
+                            R.string.protected_content, ContentSettingValues.ASK,
+                            ContentSettingValues.BLOCK, 0, 0));
             int sensorsPermissionTitle = R.string.motion_sensors_permission_title;
             int sensorsAllowedDescription =
                     R.string.website_settings_category_motion_sensors_allowed;
@@ -218,27 +199,26 @@
             }
             localMap.put(ContentSettingsType.SENSORS,
                     new ResourceItem(R.drawable.settings_sensors, sensorsPermissionTitle,
-                            sensorsPermissionTitle, ContentSettingValues.ALLOW,
-                            ContentSettingValues.BLOCK, sensorsAllowedDescription,
-                            sensorsBlockedDescription));
+                            ContentSettingValues.ALLOW, ContentSettingValues.BLOCK,
+                            sensorsAllowedDescription, sensorsBlockedDescription));
             localMap.put(ContentSettingsType.SOUND,
                     new ResourceItem(R.drawable.ic_volume_up_grey600_24dp,
-                            R.string.sound_permission_title, R.string.sound_permission_title,
-                            ContentSettingValues.ALLOW, ContentSettingValues.BLOCK,
+                            R.string.sound_permission_title, ContentSettingValues.ALLOW,
+                            ContentSettingValues.BLOCK,
                             R.string.website_settings_category_sound_allowed,
                             R.string.website_settings_category_sound_blocked));
             localMap.put(ContentSettingsType.USB_CHOOSER_DATA,
-                    new ResourceItem(R.drawable.settings_usb, 0, 0, ContentSettingValues.ASK,
+                    new ResourceItem(R.drawable.settings_usb, 0, ContentSettingValues.ASK,
                             ContentSettingValues.BLOCK, 0, 0));
             localMap.put(ContentSettingsType.USB_GUARD,
                     new ResourceItem(R.drawable.settings_usb, R.string.website_settings_usb,
-                            R.string.website_settings_usb, ContentSettingValues.ASK,
-                            ContentSettingValues.BLOCK, R.string.website_settings_category_usb_ask,
+                            ContentSettingValues.ASK, ContentSettingValues.BLOCK,
+                            R.string.website_settings_category_usb_ask,
                             R.string.website_settings_category_usb_blocked));
             localMap.put(ContentSettingsType.VR,
                     new ResourceItem(R.drawable.vr_headset, R.string.vr_permission_title,
-                            R.string.vr_permission_title, ContentSettingValues.ASK,
-                            ContentSettingValues.BLOCK, R.string.website_settings_category_vr_ask,
+                            ContentSettingValues.ASK, ContentSettingValues.BLOCK,
+                            R.string.website_settings_category_vr_ask,
                             R.string.website_settings_category_vr_blocked));
             sResourceInfo = localMap;
         }
@@ -279,13 +259,6 @@
         return getResourceItem(contentType).getTitle();
     }
 
-    /**
-     * Returns the resource id of the title explanation, shown on the Website Details page for
-     * a content type.
-     */
-    public static int getExplanation(int contentType) {
-        return getResourceItem(contentType).getExplanation();
-    }
 
     /**
      * Returns which ContentSetting the global default is set to, when enabled.
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
index 544cce9..9af6ec2 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
@@ -843,9 +843,9 @@
      */
     private void setUpPreferenceCommon(Preference preference) {
         int contentType = getContentSettingsTypeFromPreferenceKey(preference.getKey());
-        int explanationResourceId = ContentSettingsResources.getExplanation(contentType);
-        if (explanationResourceId != 0) {
-            preference.setTitle(explanationResourceId);
+        int titleResourceId = ContentSettingsResources.getTitle(contentType);
+        if (titleResourceId != 0) {
+            preference.setTitle(titleResourceId);
         }
         if (!preference.isEnabled()) {
             preference.setIcon(
diff --git a/components/browser_ui/strings/android/site_settings.grdp b/components/browser_ui/strings/android/site_settings.grdp
index 421dd7e9..382b4f77 100644
--- a/components/browser_ui/strings/android/site_settings.grdp
+++ b/components/browser_ui/strings/android/site_settings.grdp
@@ -289,9 +289,6 @@
   <message name="IDS_WEBSITE_SETTINGS_CATEGORY_CAMERA_ASK" desc="Summary text explaining that sites need to ask for permission before accessing the camera and that it is the recommended setting.">
     Ask first before allowing sites to use your camera (recommended)
   </message>
-  <message name="IDS_CAMERA_PERMISSION_TITLE" desc="Title text to be shown when the user has allowed/denied video access for the website [CHAR-LIMIT=32]">
-    Access your camera
-  </message>
   <message name="IDS_ANDROID_CAMERA_PERMISSION_OFF" desc="The message to show when the camera permission needs to be turned on not just in Chrome, but also in Android settings.">
     To let <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> access your camera, also turn on camera in <ph name="BEGIN_LINK">&lt;link&gt;</ph>Android Settings<ph name="END_LINK">&lt;/link&gt;</ph>.
   </message>
@@ -345,9 +342,6 @@
   </message>
 
   <!-- Idle Detection -->
-  <message name="IDS_IDLE_DETECTION_PERMISSION_TITLE" desc="Title for the permission of detecting user activity [CHAR-LIMIT=32]">
-    User presence
-  </message>
   <message name="IDS_WEBSITE_SETTINGS_CATEGORY_IDLE_DETECTION_ASK" desc="The description for the option to allow sites to ask for permission to access your activity state">
     Ask when a site wants to know when you're present
   </message>
@@ -369,9 +363,6 @@
 
   <!-- Location -->
 
-  <message name="IDS_GEOLOCATION_PERMISSION_TITLE" desc="Title for the permission of accessing the current location of a device [CHAR-LIMIT=32]">
-    Location access
-  </message>
   <message name="IDS_WEBSITE_SETTINGS_CATEGORY_LOCATION_ASK" desc="Summary text explaining that sites need to ask for permission before knowing location and that it is the recommended setting.">
     Ask before allowing sites to know your location (recommended)
   </message>
@@ -390,9 +381,6 @@
 
   <!-- Microphone -->
 
-  <message name="IDS_MIC_PERMISSION_TITLE" desc="Title text to be shown when the user has allowed/denied voice access for the website [CHAR-LIMIT=32]">
-    Access your microphone
-  </message>
   <message name="IDS_WEBSITE_SETTINGS_CATEGORY_MIC_ASK" desc="Summary text explaining that sites need to ask for permission before accessing the microphone and that it is the recommended setting.">
     Ask first before allowing sites to use your microphone (recommended)
   </message>
diff --git a/components/browser_ui/strings/android/site_settings_grdp/IDS_IDLE_DETECTION_PERMISSION_TITLE.png.sha1 b/components/browser_ui/strings/android/site_settings_grdp/IDS_IDLE_DETECTION_PERMISSION_TITLE.png.sha1
deleted file mode 100644
index 746e21b3..0000000
--- a/components/browser_ui/strings/android/site_settings_grdp/IDS_IDLE_DETECTION_PERMISSION_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-aa934c40c670cc5d531976c1277427e6f8faaa07
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
index 3c675657..6364fd39 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -7,12 +7,12 @@
 <translation id="1124772482545689468">Хэрэглэгч</translation>
 <translation id="1178581264944972037">Түр зогсоох</translation>
 <translation id="1181037720776840403">Хасах</translation>
-<translation id="1195941046451948919">Та энэ вэб сайтын бүх зөвшөөрлийг устгахдаа итгэлтэй байна уу?</translation>
+<translation id="1195941046451948919">Та энэ веб сайтын бүх зөвшөөрлийг устгахдаа итгэлтэй байна уу?</translation>
 <translation id="1201402288615127009">Дараагийнх</translation>
 <translation id="1242008676835033345"><ph name="WEBSITE_URL" />-д оруулсан</translation>
 <translation id="1272079795634619415">Зогс</translation>
 <translation id="1289742167380433257">Таны өгөгдлийг хадгалахын тулд Google энэ хуудасны зургуудыг оновчилсон байна.</translation>
-<translation id="129382876167171263">Вэб сайтын хадгалсан файлыг энд харуулна</translation>
+<translation id="129382876167171263">Веб сайтын хадгалсан файлыг энд харуулна</translation>
 <translation id="1364532808393826295"><ph name="APP_NAME" /> - <ph name="NOTIFICATION_MESSAGE" /></translation>
 <translation id="1369915414381695676">Сайт <ph name="SITE_NAME" /> нэмсэн</translation>
 <translation id="1383876407941801731">Хайлт</translation>
@@ -77,7 +77,7 @@
 <translation id="2910701580606108292">Сайтад хамгаалалттай контент тоглуулахыг зөвшөөрөхөөс өмнө асуух</translation>
 <translation id="2913331724188855103">Cookie data-г хадгалах мөн унших боломжийг сайтуудад олгох (зөвлөж байна)</translation>
 <translation id="2968755619301702150">Сертификат харагч</translation>
-<translation id="300526633675317032">Энэ нь вэб хуудасны сангийн бүх <ph name="SIZE_IN_KB" />-г устгах болно.</translation>
+<translation id="300526633675317032">Энэ нь веб хуудасны сангийн бүх <ph name="SIZE_IN_KB" />-г устгах болно.</translation>
 <translation id="3008272652534848354">Зөвшөөрлийг шинэчлэх</translation>
 <translation id="301521992641321250">Автоматаар блок хийсэн</translation>
 <translation id="3114012059975132928">Видео тоглуулагч</translation>
@@ -126,7 +126,7 @@
 <translation id="4570913071927164677">Дэлгэрэнгүй</translation>
 <translation id="4645575059429386691">Эцэг, эх нь хариуцаж байна</translation>
 <translation id="4670064810192446073">Виртуал бодит байдал</translation>
-<translation id="4708011789095599544">Та энэ вэб сайтын күүки болон бусад сайтын өгөгдлийг арилгахдаа итгэлтэй байна уу?</translation>
+<translation id="4708011789095599544">Та энэ веб сайтын күүки болон бусад сайтын өгөгдлийг арилгахдаа итгэлтэй байна уу?</translation>
 <translation id="4751476147751820511">Хөдөлгөөн эсвэл гэрэл мэдрэгч</translation>
 <translation id="4883854917563148705">Хяналттай тохиргоог шинэчлэх боломжгүй</translation>
 <translation id="4887024562049524730">Сайтуудад таны виртуал бодит байдлын төхөөрөмж болон өгөгдлийг ашиглахыг зөвшөөрөхийн өмнө асуух (санал болгосон)</translation>
@@ -243,7 +243,7 @@
 <translation id="780301667611848630">Үгүй, баярлалаа</translation>
 <translation id="7804248752222191302">Сайт таны камерыг ашиглаж байна</translation>
 <translation id="7817023149356982970">Та энэ сайтаас гарна.</translation>
-<translation id="7828557259026017104">Күүки нь таны зочилдог вэб сайтуудын үүсгэдэг файл юм. Сайтууд нь таны сонголтыг санахын тулд түүнийг ашигладаг. Гуравдагч талын күүкиг бусад сайт үүсгэдэг. Эдгээр сайт нь таны зочилдог вэб хуудсан дээрээ хардаг зар эсвэл зураг зэрэг контентын заримыг нь эзэмшдэг.</translation>
+<translation id="7828557259026017104">Күүки нь таны зочилдог веб сайтуудын үүсгэдэг файл юм. Сайтууд нь таны сонголтыг санахын тулд түүнийг ашигладаг. Гуравдагч талын күүкиг бусад сайт үүсгэдэг. Эдгээр сайт нь таны зочилдог веб хуудсан дээрээ хардаг зар эсвэл зураг зэрэг контентын заримыг нь эзэмшдэг.</translation>
 <translation id="7835852323729233924">Медиаг тоглуулж байна</translation>
 <translation id="783819812427904514">Видеоны дууг нээх</translation>
 <translation id="7846076177841592234">Сонголтыг цуцлах</translation>
diff --git a/components/heap_profiling/multi_process/test_driver.cc b/components/heap_profiling/multi_process/test_driver.cc
index fb67ecb..cf61046 100644
--- a/components/heap_profiling/multi_process/test_driver.cc
+++ b/components/heap_profiling/multi_process/test_driver.cc
@@ -17,7 +17,6 @@
 #include "base/stl_util.h"
 #include "base/test/bind_test_util.h"
 #include "base/threading/platform_thread.h"
-#include "base/trace_event/heap_profiler.h"
 #include "base/trace_event/heap_profiler_event_filter.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/components/metrics/system_memory_stats_recorder_linux.cc b/components/metrics/system_memory_stats_recorder_linux.cc
index 4833370..1d46bc70 100644
--- a/components/metrics/system_memory_stats_recorder_linux.cc
+++ b/components/metrics/system_memory_stats_recorder_linux.cc
@@ -31,57 +31,72 @@
   UMA_HISTOGRAM_LINEAR(name, sample, 2500, 50)
 
 void RecordMemoryStats(RecordMemoryStatsType type) {
-  base::SystemMemoryInfoKB memory;
-  if (!base::GetSystemMemoryInfo(&memory))
-    return;
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
   // Record graphics GEM object size in a histogram with 50 MB buckets.
-  int mem_graphics_gem_mb = 0;
-  if (memory.gem_size != -1)
-    mem_graphics_gem_mb = memory.gem_size / 1024 / 1024;
+  int mem_gpu_mb = 0;
+  bool mem_gpu_result = false;
+  base::GraphicsMemoryInfoKB gpu_memory;
+  mem_gpu_result = base::GetGraphicsMemoryInfo(&gpu_memory);
 
-  // Record shared memory (used by renderer/GPU buffers).
-  int mem_shmem_mb = memory.shmem / 1024;
+  if (mem_gpu_result) {
+    mem_gpu_mb = gpu_memory.gpu_memory_size / 1024 / 1024;
+    switch (type) {
+      case RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED:
+        UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Contents.MemGraphicsMB",
+                                       mem_gpu_mb);
+        break;
+      case RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED:
+        UMA_HISTOGRAM_MEGABYTES_LINEAR(
+            "Memory.OOMKill.Extensions.MemGraphicsMB", mem_gpu_mb);
+        break;
+    }
+  }
 #endif
 
-  // On Intel, graphics objects are in anonymous pages, but on ARM they are
-  // not. For a total "allocated count" add in graphics pages on ARM.
-  int mem_allocated_mb = (memory.active_anon + memory.inactive_anon) / 1024;
+  base::SystemMemoryInfoKB memory;
+  if (base::GetSystemMemoryInfo(&memory)) {
+    // On Intel, graphics objects are in anonymous pages, but on ARM they are
+    // not. For a total "allocated count" add in graphics pages on ARM.
+    int mem_allocated_mb = (memory.active_anon + memory.inactive_anon) / 1024;
 #if (defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)) && \
     defined(ARCH_CPU_ARM_FAMILY)
-  mem_allocated_mb += mem_graphics_gem_mb;
+    mem_allocated_mb += mem_gpu_mb;
 #endif
 
-  int mem_available_mb =
-      (memory.active_file + memory.inactive_file + memory.free) / 1024;
+    int mem_available_mb =
+        (memory.active_file + memory.inactive_file + memory.free) / 1024;
 
-  switch (type) {
-    case RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED: {
-#if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
-      UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Contents.MemGraphicsMB",
-                                     mem_graphics_gem_mb);
-      UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Contents.MemShmemMB",
-                                     mem_shmem_mb);
-#endif
-      UMA_HISTOGRAM_ALLOCATED_MEGABYTES(
-          "Memory.OOMKill.Contents.MemAllocatedMB", mem_allocated_mb);
-      UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.OOMKill.Contents.MemAvailableMB",
-                                    mem_available_mb);
-      break;
+    switch (type) {
+      case RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED: {
+        UMA_HISTOGRAM_ALLOCATED_MEGABYTES(
+            "Memory.OOMKill.Contents.MemAllocatedMB", mem_allocated_mb);
+        UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.OOMKill.Contents.MemAvailableMB",
+                                      mem_available_mb);
+        break;
+      }
+      case RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED: {
+        UMA_HISTOGRAM_ALLOCATED_MEGABYTES(
+            "Memory.OOMKill.Extensions.MemAllocatedMB", mem_allocated_mb);
+        UMA_HISTOGRAM_LARGE_MEMORY_MB(
+            "Memory.OOMKill.Extensions.MemAvailableMB", mem_available_mb);
+        break;
+      }
     }
-    case RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED: {
+
 #if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
-      UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Extensions.MemGraphicsMB",
-                                     mem_graphics_gem_mb);
-      UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Extensions.MemShmemMB",
-                                     mem_shmem_mb);
-#endif
-      UMA_HISTOGRAM_ALLOCATED_MEGABYTES(
-          "Memory.OOMKill.Extensions.MemAllocatedMB", mem_allocated_mb);
-      UMA_HISTOGRAM_LARGE_MEMORY_MB("Memory.OOMKill.Extensions.MemAvailableMB",
-                                    mem_available_mb);
-      break;
+    // Record shared memory (used by renderer/GPU buffers).
+    int mem_shmem_mb = memory.shmem / 1024;
+    switch (type) {
+      case RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED:
+        UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Contents.MemShmemMB",
+                                       mem_shmem_mb);
+        break;
+      case RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED:
+        UMA_HISTOGRAM_MEGABYTES_LINEAR("Memory.OOMKill.Extensions.MemShmemMB",
+                                       mem_shmem_mb);
+        break;
     }
+#endif
   }
 }
 
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 1be8dbe..bc93733 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -23577,7 +23577,30 @@
       The available data types are the <ph name="DATA_TYPE_BROWSING_HISTORY">'browsing_history'</ph>, <ph name="DATA_TYPE_DOWNLOAD_HISTORY">'download_history'</ph>, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA">'cookies_and_other_site_data'</ph>, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES">'cached_images_and_files'</ph>, <ph name="DATA_TYPE_PASSWORD">'password_signin'</ph>, <ph name="DATA_TYPE_AUTOFILL">'autofill'</ph>, <ph name="DATA_TYPE_SITE_SETTINGS">'site_settings'</ph> and <ph name="DATA_TYPE_HOSTED_APP_DATA">'hosted_app_data'</ph>.
       Chrome will regularly remove data of selected types that is older than <ph name="TIME_TO_LIVE_IN_HOURS">'time_to_live_in_hours'</ph>. As this deletion only happens in certain intervals, some data might live for slightly longer but never more than twice its expected <ph name="TIME_TO_LIVE_IN_HOURS">'time_to_live_in_hours'</ph>.
       '''
-    }
+    },
+    {
+      'name': 'LacrosAllowed',
+      'owners': ['igorcov@chromium.org', 'okalitova@chromium.org'],
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:88-'],
+      'features': {
+        'dynamic_refresh': False,
+        'per_profile': False,
+      },
+      'example_value': False,
+      'id': 793,
+      'default_for_enterprise_users': False,
+      'caption': '''Allow usage of Lacros''',
+      'tags': [],
+      'desc': '''This setting allows users to use the Lacros browser.
+
+      If this policy is set to false, the user cannot use Lacros.
+
+      If this policy is set to true, the user can use the Lacros browser.
+
+      If this policy is unset, the user cannot use the Lacros browser.''',
+    },
   ],
 
   'messages': {
@@ -24508,6 +24531,6 @@
   'placeholders': [],
   'deleted_policy_ids': [114, 115, 412, 476, 544, 546, 562, 569, 578],
   'deleted_atomic_policy_group_ids': [],
-  'highest_id_currently_used': 792,
+  'highest_id_currently_used': 793,
   'highest_atomic_group_id_currently_used': 40
 }
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index c6ed73e..10f8084f 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -5735,7 +5735,7 @@
 
       Si se le asigna el valor "True", la opción "Encabezado y pie de página" estará marcada en el cuadro de diálogo de la vista previa de impresión y los usuarios podrán cambiarla.</translation>
 <translation id="9213751049772256263">Inhabilitar todas las variaciones</translation>
-<translation id="9217154963008402249">Frecuencia de los paquetes de red de supervisión</translation>
+<translation id="9217154963008402249">Frecuencia de los paquetes de red de monitorización</translation>
 <translation id="922540222991413931">Configurar fuentes de instalación de secuencias de comandos de usuario, aplicaciones y extensiones</translation>
 <translation id="924557436754151212">Importar las contraseñas guardadas desde el navegador predeterminado en la primera ejecución</translation>
 <translation id="927384371566552478">Si se habilita la política o no se establece, la interfaz de usuario de exportación e importación estará disponible para los usuarios. Si se inhabilita la política, la interfaz de usuario de exportación e importación no estará disponible para los usuarios.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 1658bf09..12eef03 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1101,7 +1101,7 @@
 
       Примітка: елементи в цей список можна також додати через правила <ph name="USE_IE_SITELIST_POLICY_NAME" /> та <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="264093234299818170">Відображаються всі принтери, крім тих, які є в чорному списку.</translation>
-<translation id="264252574246191885">Не для всіх</translation>
+<translation id="264252574246191885">Не опубліковане</translation>
 <translation id="2647069081229792812">Увімкнути або вимкнути редагування закладок</translation>
 <translation id="2649896281375932517">Вирішують користувачі</translation>
 <translation id="2650049181907741121">Дія, яка має виконуватися, коли користувач закриває кришку</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 42d2f99..c40f8a6 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1082,7 +1082,7 @@
 
       如果此政策未设置,默认情况下,受管理用户将不能使用短信同步功能,不受管理的用户则可以。</translation>
 <translation id="2660846099862559570">从不使用代理</translation>
-<translation id="2664682171745499686">禁止在特定网域上针对相似域名显示警告</translation>
+<translation id="2664682171745499686">禁止在特定网域中针对相似域名显示警告</translation>
 <translation id="2665422249821137126">在登录屏幕上启用大号光标</translation>
 <translation id="2672012807430078509">控制是否允许将 NTLM 作为 SMB 装载功能的身份验证协议</translation>
 <translation id="2678503605767349615">必需的设备级客户端证书</translation>
diff --git a/components/remote_cocoa/app_shim/bridged_content_view.mm b/components/remote_cocoa/app_shim/bridged_content_view.mm
index 08a03467..d277717 100644
--- a/components/remote_cocoa/app_shim/bridged_content_view.mm
+++ b/components/remote_cocoa/app_shim/bridged_content_view.mm
@@ -58,12 +58,30 @@
                     NSHeight(content_rect) - point_in_window.y);
 }
 
-// Returns true if |event| may have triggered dismissal of an IME and would
-// otherwise be ignored by a ui::TextInputClient when inserted.
-bool IsImeTriggerEvent(NSEvent* event) {
+// Some keys are silently consumed by -[NSView interpretKeyEvents:]
+// They should not be processed as accelerators.
+// See comments at |keyDown:| for details.
+bool ShouldIgnoreAcceleratorWithMarkedText(NSEvent* event) {
   ui::KeyboardCode key = ui::KeyboardCodeFromNSEvent(event);
-  return key == ui::VKEY_RETURN || key == ui::VKEY_TAB ||
-         key == ui::VKEY_ESCAPE;
+  switch (key) {
+    // crbug/883952: Kanji IME completes composition and dismisses itself.
+    case ui::VKEY_RETURN:
+    // Kanji IME: select candidate words.
+    // Pinyin IME: change tone.
+    case ui::VKEY_TAB:
+    // Dismiss IME.
+    case ui::VKEY_ESCAPE:
+    // crbug/915924: Pinyin IME selects candidate.
+    case ui::VKEY_LEFT:
+    case ui::VKEY_RIGHT:
+    case ui::VKEY_UP:
+    case ui::VKEY_DOWN:
+    case ui::VKEY_PRIOR:
+    case ui::VKEY_NEXT:
+      return true;
+    default:
+      return false;
+  }
 }
 
 ui::TextEditCommand GetTextEditCommandForMenuAction(SEL action) {
@@ -709,14 +727,14 @@
   [self interpretKeyEvents:@[ theEvent ]];
 
   // When there is marked text, -[NSView interpretKeyEvents:] may handle the
-  // event by dismissing the IME window in a way that neither unmarks text, nor
-  // updates any composition. That is, no signal is given either to the
-  // NSTextInputClient or the NSTextInputContext that the IME changed state.
-  // However, we must ensure this key down is not processed as an accelerator.
-  // TODO(tapted): Investigate removing the IsImeTriggerEvent() check - it's
-  // probably not required, but helps tests that expect some events to always
-  // get processed (i.e. TextfieldTest.TextInputClientTest).
-  if (hadMarkedTextAtKeyDown && IsImeTriggerEvent(theEvent))
+  // event by updating the IME state without updating the composition text.
+  // That is, no signal is given either to the NSTextInputClient or the
+  // NSTextInputContext, leaving |hasUnhandledKeyDownEvent_| to be true.
+  // In such a case, the key down event should not processed as an accelerator.
+  // TODO(kerenzhu): Note it may be valid to always mark the key down event as
+  // handled by IME when there is marked text. For now, only certain keys are
+  // skipped.
+  if (hadMarkedTextAtKeyDown && ShouldIgnoreAcceleratorWithMarkedText(theEvent))
     _hasUnhandledKeyDownEvent = NO;
 
   // Even with marked text, some IMEs may follow with -insertNewLine:;
diff --git a/components/services/heap_profiling/public/cpp/profiling_client.cc b/components/services/heap_profiling/public/cpp/profiling_client.cc
index d39fdb8..ff58a17 100644
--- a/components/services/heap_profiling/public/cpp/profiling_client.cc
+++ b/components/services/heap_profiling/public/cpp/profiling_client.cc
@@ -14,7 +14,6 @@
 #include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
-#include "base/trace_event/heap_profiler_allocation_context_tracker.h"
 #include "base/trace_event/heap_profiler_event_filter.h"
 #include "base/trace_event/malloc_dump_provider.h"
 #include "base/trace_event/memory_dump_manager.h"
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index fb4f82c..1989a1c4 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -22,6 +22,7 @@
 <translation id="1058479211578257048">Saving cards...</translation>
 <translation id="10614374240317010">Never saved</translation>
 <translation id="1062160989074299343">Prc10 (Envelope)</translation>
+<translation id="1066573427009091463"><ph name="PERCENT" /> cashback</translation>
 <translation id="106701514854093668">Desktop Bookmarks</translation>
 <translation id="1068672505746868501">Never translate pages in <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="1070901266639972381">Night</translation>
@@ -496,6 +497,7 @@
 <translation id="2955913368246107853">Close find bar</translation>
 <translation id="2969319727213777354">To establish a secure connection, your clock needs to be set correctly. This is because the certificates that websites use to identify themselves are only valid for specific periods of time. Since your device's clock is incorrect, Google Chrome cannot verify these certificates.</translation>
 <translation id="2972581237482394796">&amp;Redo</translation>
+<translation id="2975775789586780239"><ph name="DISCOUNT" /> off</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />, currently selected. <ph name="ROW_CONTENT" /></translation>
 <translation id="2985306909656435243">If enabled, Chromium will store a copy of your card on this device for faster form filling.</translation>
 <translation id="2985398929374701810">Enter a valid address</translation>
@@ -1892,6 +1894,7 @@
 <translation id="8685155993131031756">Prc-16K</translation>
 <translation id="8688672835843460752">Available</translation>
 <translation id="868922510921656628">Pages per set</translation>
+<translation id="8697373104056314601">To get Chrome’s highest level of security, <ph name="BEGIN_ENHANCED_PROTECTION_LINK" />turn on enhanced protection<ph name="END_ENHANCED_PROTECTION_LINK" />.</translation>
 <translation id="869891660844655955">Expiry date</translation>
 <translation id="8699041776323235191">HID device</translation>
 <translation id="8703575177326907206">Your connection to <ph name="DOMAIN" /> is not encrypted.</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb
index 1f666d4..31f34db 100644
--- a/components/strings/components_strings_mn.xtb
+++ b/components/strings/components_strings_mn.xtb
@@ -8,7 +8,7 @@
 <translation id="1019413721762100891">Унтраалттай</translation>
 <translation id="1021110881106174305">Зөвшөөрсөн карт</translation>
 <translation id="1021753677514347426">Та эсвэл өөр хэн нэгэн таны төхөөрөмж дээр суулгасан сертификатын улмаас ийм асуудал гардаг. Сертификатыг сүлжээнд хяналт хийх болон дундаас нь өгөгдөл цуглуулахад ашигладаг гэж мэдэгдсэн бөгөөд Chromium түүнд итгэхгүй байна. Сургууль эсвэл компанийн сүлжээнд хяналт хийх зэрэг хууль ёсны зарим тохиолдол байдаг бөгөөд Chromium нь та хяналтыг зогсоож чадахгүй байсан ч хяналт хийгдэж байгаа тухай таныг мэдэж байгаа эсэхийг шалгах хүсэлтэй байна. Вэбэд ханддаг аливаа хөтөч эсвэл аппликэйшн дээр хяналт хийж болзошгүй.</translation>
-<translation id="1024111578869940408">Халдагч этгээдүүд заримдаа харахад хэцүү өөрчлөлтийг вэб хаягт оруулах замаар сайтуудыг дуурайдаг.</translation>
+<translation id="1024111578869940408">Халдагч этгээдүүд заримдаа харахад хэцүү өөрчлөлтийг веб хаягт оруулах замаар сайтуудыг дуурайдаг.</translation>
 <translation id="1030706264415084469"><ph name="URL" /> таны төхөөрөмжид том хэмжээний өгөгдлийг бүрмөсөн хадгалах хүсэлтэй байна</translation>
 <translation id="1032854598605920125">Цагийн зүүний дагуу эргүүлэх</translation>
 <translation id="1036348656032585052">Унтраа</translation>
@@ -36,7 +36,7 @@
 <translation id="1107591249535594099">Сонгосон тохиолдолд Chrome нь илүү хурдан бөглөдөг болгох зорилгоор таны картын хуулбарыг энэ төхөөрөмж дээр хадгалах болно.</translation>
 <translation id="1110994991967754504"><ph name="PERMISSION_NAME" />-д зөвшөөрөл сонгох</translation>
 <translation id="1113869188872983271">&amp; Дахин эрэмбэлэх үйлдлийг буцаах</translation>
-<translation id="1125573121925420732">Вэб сайт аюулгүй байдлаа шинэчлэх үед анхааруулга гарч ирж болзошгүй. Үүнийг удахгүй сайжруулах болно.</translation>
+<translation id="1125573121925420732">Вебсайт аюулгүй байдлаа шинэчлэх үед анхааруулга гарч ирж болзошгүй. Үүнийг удахгүй сайжруулах болно.</translation>
 <translation id="112840717907525620">Тохиргооны кэш болж байна</translation>
 <translation id="1130564665089811311">Хуудас орчуулах товч, энэ хуудсыг Google Орчуулагчаар орчуулахын тулд Enter дарна уу</translation>
 <translation id="1131264053432022307">Таны хуулсан зураг</translation>
@@ -72,11 +72,11 @@
 <translation id="124116460088058876">Бусад хэл</translation>
 <translation id="1250759482327835220">Дараагийн удаа төлбөрөө хурдан төлөхийн тулд Google Бүртгэлдээ карт, нэр болон тооцооны хаягаа хадгална уу.</translation>
 <translation id="1253921432148366685"><ph name="TYPE_1" />, <ph name="TYPE_2" /> (синк хийсэн)</translation>
-<translation id="1256368399071562588">&lt;p&gt;Хэрэв та вэбсайтад зочлохоор оролдох үед нээгдэхгүй байвал эдгээр асуудал шийдэх алхмыг дагаж алдааг засахаар оролдоно уу:&lt;/p&gt;
+<translation id="1256368399071562588">&lt;p&gt;Хэрэв та вебсайтад зочлохоор оролдох үед нээгдэхгүй байвал эдгээр асуудал шийдэх алхмыг дагаж алдааг засахаар оролдоно уу:&lt;/p&gt;
     &lt;ol&gt;
-    &lt;li&gt;Вэбийн хаягийг буруу бичсэн эсэхийг шалгана уу.&lt;/li&gt;
+    &lt;li&gt;Вебийн хаягийг буруу бичсэн эсэхийг шалгана уу.&lt;/li&gt;
     &lt;li&gt;Таны интернет холболт хэвийн ажиллаж байгаа эсэхийг шалгана уу.&lt;/li&gt;
-    &lt;li&gt;Вэбсайтыг эзэмшигчтэй холбогдоно уу.&lt;/li&gt;
+    &lt;li&gt;Вебсайтыг эзэмшигчтэй холбогдоно уу.&lt;/li&gt;
     &lt;/ol&gt;</translation>
 <translation id="1257286744552378071">Та нууц үгээ танай байгууллагын удирддаггүй сайтад оруулсан байна. Бүртгэлээ хамгаалахын тулд бусад апп болон сайтад нууц үгээ дахин бүү ашиглана уу.</translation>
 <translation id="1263231323834454256">Унших жагсаалт</translation>
@@ -98,7 +98,7 @@
 <translation id="1330449323196174374">Дээд хэсгийг дотогш нь нугалж эвхэх зүүн хаалган нугалаа</translation>
 <translation id="1333989956347591814">Таны үйл ажиллагаа дараахад <ph name="BEGIN_EMPHASIS" />харагдсан хэвээр байна<ph name="END_EMPHASIS" />:
         <ph name="BEGIN_LIST" />
-          <ph name="LIST_ITEM" />Таны зочилсон вэб хуудас
+          <ph name="LIST_ITEM" />Таны зочилсон веб хуудас
           <ph name="LIST_ITEM" />Таны ажил олгогч эсвэл сургууль
           <ph name="LIST_ITEM" />Таны интернэт үйлчилгээ нийлүүлэгч
         <ph name="END_LIST" /></translation>
@@ -170,7 +170,7 @@
       &lt;p&gt;Та &lt;strong&gt;Settings&lt;/strong&gt; апп-ын &lt;strong&gt;General&lt;/strong&gt; хэсэгт огноо, цагийг өөрчлөнө үү.&lt;/p&gt;</translation>
 <translation id="1569487616857761740">Дуусах огноог оруулна уу</translation>
 <translation id="1581080074034554886">CVC</translation>
-<translation id="1583429793053364125">Энэхүү вэб хуудсыг харуулахад ямар нэгэн алдаа гарлаа.</translation>
+<translation id="1583429793053364125">Энэхүү веб хуудсыг харуулахад ямар нэгэн алдаа гарлаа.</translation>
 <translation id="1586541204584340881">Таны ямар өргөтгөл суулгасан болох</translation>
 <translation id="1588438908519853928">Хэвийн</translation>
 <translation id="1592005682883173041">Суурин өгөгдлийн хандалт</translation>
@@ -193,7 +193,7 @@
 <translation id="1662550410081243962">Төлбөрийн хэрэгслүүдийг хадгалах болон бөглөх</translation>
 <translation id="1663943134801823270">Карт, хаягийг Chrome-с харж болно. Та тэдгээрийг <ph name="BEGIN_LINK" />Тохиргоо<ph name="END_LINK" /> хэсэгт хянах боломжтой.</translation>
 <translation id="1671391448414634642">Одооноос <ph name="SOURCE_LANGUAGE" /> хэл дээрх хуудсыг <ph name="TARGET_LANGUAGE" /> хэл рүү орчуулна.</translation>
-<translation id="1676269943528358898"><ph name="SITE" /> нь ихэвчлэн таны мэдээллийг хамгаалах зорилгоор шифр ашигладаг. Энэ удаад Google Chrome <ph name="SITE" />-тай холбогдохыг оролдоход тус вэб сайтаас хэвийн бус, буруу итгэмжлэл илгээлээ. Халдагч <ph name="SITE" /> юм шиг дүр үзүүлж байгаа эсвэл Wi-Fi-д нэвтрэх дэлгэц холболтод саад учруулсан байж болзошгүй. Google Chrome ямар нэгэн мэдээлэл солилцохоос өмнө холболтыг зогсоосон тул таны мэдээлэл аюулгүй.</translation>
+<translation id="1676269943528358898"><ph name="SITE" /> нь ихэвчлэн таны мэдээллийг хамгаалах зорилгоор шифр ашигладаг. Энэ удаад Google Chrome <ph name="SITE" />-тай холбогдохыг оролдоход тус веб сайтаас хэвийн бус, буруу итгэмжлэл илгээлээ. Халдагч <ph name="SITE" /> юм шиг дүр үзүүлж байгаа эсвэл Wi-Fi-д нэвтрэх дэлгэц холболтод саад учруулсан байж болзошгүй. Google Chrome ямар нэгэн мэдээлэл солилцохоос өмнө холболтыг зогсоосон тул таны мэдээлэл аюулгүй.</translation>
 <translation id="1682696192498422849">Эхлээд богино зах</translation>
 <translation id="168693727862418163">Энэ бодлогын утгыг схемтэй нь тулгаж баталж чадаагүй тул үүнийг үл хэрэгсэнэ.</translation>
 <translation id="168841957122794586">Серверийн гэрчилгээний криптограф түлхүүр нь аюулгүй байдлын хувьд сул байна.</translation>
@@ -208,7 +208,7 @@
 <translation id="1718029547804390981">Документ дээр тэмдэглэгээ хийхэд хэт том байна</translation>
 <translation id="1721424275792716183">* Талбарыг бөглөх шаардлагатай</translation>
 <translation id="1727741090716970331">Хүчинтэй картын дугаар оруулах</translation>
-<translation id="1728677426644403582">Та вэб хуудасны эх сурвалжийг харж байна.</translation>
+<translation id="1728677426644403582">Та веб хуудасны эх сурвалжийг харж байна.</translation>
 <translation id="173080396488393970">Энэ төрлийн аппыг дэмждэггүй</translation>
 <translation id="1734864079702812349">Amex</translation>
 <translation id="1734878702283171397">Системийн админтай холбоо барина уу.</translation>
@@ -239,7 +239,7 @@
 <translation id="1807246157184219062">Гэрэлтүүлэг</translation>
 <translation id="1807528111851433570">Эхлэлийн хүснэгт</translation>
 <translation id="1821930232296380041">Хүчин төгөлдөр бус хүсэлт болон хүсэлтийн параметрууд</translation>
-<translation id="1822540298136254167">Таны зочилсон вэб сайтууд болон тэдгээрт зарцуулсан хугацаа</translation>
+<translation id="1822540298136254167">Таны зочилсон веб сайтууд болон тэдгээрт зарцуулсан хугацаа</translation>
 <translation id="1826516787628120939">Шалгаж байна</translation>
 <translation id="1834321415901700177">Энэ сайт аюултай программ агуулж байна</translation>
 <translation id="1838374766361614909">Хайлтыг арилгах</translation>
@@ -264,7 +264,7 @@
 <translation id="192020519938775529">{COUNT,plural, =0{Байхгүй}=1{1 сайт}other{# сайт}}</translation>
 <translation id="1945968466830820669">Та байгууллагынхаа бүртгэлд хандах эрх эсвэл нууц үгээ бусдад алдаж болзошгүй. Chromium-с таныг нууц үгээ өөрчлөхийг зөвлөж байна.</translation>
 <translation id="1947454675006758438">Баруун дээд буланд үдэх</translation>
-<translation id="1959001866257244765"><ph name="BEGIN_WHITEPAPER_LINK" />Зарим зочилдог хуудасныхаа URL, системийн хязгаарлагдмал мэдээлэл болон зарим хуудасны контент<ph name="END_WHITEPAPER_LINK" />-ыг Google-д илгээж, хүн бүрд вэбийн аюулгүй байдлыг сайжруулахад тусална уу. <ph name="BEGIN_PRIVACY_PAGE_LINK" />Нууцлалын бодлого<ph name="END_PRIVACY_PAGE_LINK" /></translation>
+<translation id="1959001866257244765"><ph name="BEGIN_WHITEPAPER_LINK" />Зарим зочилдог хуудасныхаа URL, системийн хязгаарлагдмал мэдээлэл болон зарим хуудасны контент<ph name="END_WHITEPAPER_LINK" />-ыг Google-д илгээж, хүн бүрд вебийн аюулгүй байдлыг сайжруулахад тусална уу. <ph name="BEGIN_PRIVACY_PAGE_LINK" />Нууцлалын бодлого<ph name="END_PRIVACY_PAGE_LINK" /></translation>
 <translation id="1962204205936693436"><ph name="DOMAIN" /> Хавчуургууд</translation>
 <translation id="1973335181906896915">Цувралын алдаа</translation>
 <translation id="1974060860693918893">Боловсронгуй</translation>
@@ -341,11 +341,11 @@
 <translation id="2276057643614339130">Хэвлэх суурь</translation>
 <translation id="2277103315734023688">Урагшлуулах</translation>
 <translation id="2283340219607151381">Хаягийг хадгалах болон бөглөх</translation>
-<translation id="2288422996159078444">Таны бичдэг дурын зүйл, таны үздэг дурын хуудас эсвэл вэб дээрх бусад дурын үйл ажиллагааг хянан үзэж байна. Сайтуудын контентыг танд мэдэгдэлгүйгээр өөрчилж болзошгүй.</translation>
+<translation id="2288422996159078444">Таны бичдэг дурын зүйл, таны үздэг дурын хуудас эсвэл веб дээрх бусад дурын үйл ажиллагааг хянан үзэж байна. Сайтуудын контентыг танд мэдэгдэлгүйгээр өөрчилж болзошгүй.</translation>
 <translation id="2289385804009217824">Тайрах</translation>
 <translation id="2292556288342944218">Таны интернэт холболтыг блоклосон байна</translation>
-<translation id="2293443924986248631">Асаасан үед сайтууд нь таныг вэб дээр хянадаг күүкиг ашиглах боломжгүй байна. Зарим сайтын онцлогууд ажиллахгүй байж болзошгүй.</translation>
-<translation id="2295290966866883927">Таны зочилсон хуудаснуудын URL-г дүн шинжилгээ хийлгэхээр Google Cloud эсвэл гуравдагч тал руу илгээдэг. Жишээ нь тэдгээрийг аюултай вэб сайт илрүүлэхийн тулд скан хийж болно.</translation>
+<translation id="2293443924986248631">Асаасан үед сайтууд нь таныг веб дээр хянадаг күүкиг ашиглах боломжгүй байна. Зарим сайтын онцлогууд ажиллахгүй байж болзошгүй.</translation>
+<translation id="2295290966866883927">Таны зочилсон хуудаснуудын URL-г дүн шинжилгээ хийлгэхээр Google Cloud эсвэл гуравдагч тал руу илгээдэг. Жишээ нь тэдгээрийг аюултай вебсайт илрүүлэхийн тулд скан хийж болно.</translation>
 <translation id="2297722699537546652">B5 (Дугтуй)</translation>
 <translation id="2300306941146563769">Байршуулаагүй</translation>
 <translation id="2310021320168182093">Chou2 (Дугтуй)</translation>
@@ -458,10 +458,10 @@
 <translation id="2775884851269838147">Эхний хуудсыг хэвлэх</translation>
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">Холболтыг дахин сэргээлээ.</translation>
-<translation id="2792012897584536778">Энэ төхөөрөмжийн админууд таны зочилдог вэб сайтын контентыг харах боломжтой аюулгүй байдлын сертификат тохируулсан байна.</translation>
+<translation id="2792012897584536778">Энэ төхөөрөмжийн админууд таны зочилдог веб сайтын контентыг харах боломжтой аюулгүй байдлын сертификат тохируулсан байна.</translation>
 <translation id="2799020568854403057">Энэ сайт аюултай апп агуулсан байна</translation>
 <translation id="2799223571221894425">Дахин эхлүүлэх</translation>
-<translation id="2803306138276472711"><ph name="SITE" />-д <ph name="BEGIN_LINK" />вирус<ph name="END_LINK" /> байгааг Google-ийн Аюулгүй Хайлт олж ирлрүүллээ. Ихэвчлэн аюулгүй байдаг вэб сайтууд заримдаа вирусд өртөх тохиолдол байдаг.</translation>
+<translation id="2803306138276472711"><ph name="SITE" />-д <ph name="BEGIN_LINK" />вирус<ph name="END_LINK" /> байгааг Google-ийн Аюулгүй Хайлт олж ирлрүүллээ. Ихэвчлэн аюулгүй байдаг веб сайтууд заримдаа вирусд өртөх тохиолдол байдаг.</translation>
 <translation id="2807052079800581569">Y тэнхлэгийн дагуу зургийн байршил</translation>
 <translation id="2824775600643448204">Хаяг ба хайлтын цонх</translation>
 <translation id="2826760142808435982">Энэхүү холболтыг <ph name="CIPHER" /> ашиглаж шифрлэж таниулсан бөгөөд энэ нь түлхүүр солилцох  механизмын дагуу <ph name="KX" />-ыг ашигладаг.</translation>
@@ -495,7 +495,7 @@
 <translation id="2951588413176968965">Миний шуудангийн хайрцаг</translation>
 <translation id="295526156371527179">Анхааруулга: Энэ удирдамж нь толь бичиг биш тул үүнийг удирдамжид тодорхойлсны дагуу толь бичиг шиг нэгтгэж чадсангүй.</translation>
 <translation id="2955913368246107853">Хайлтын цонхыг хаах</translation>
-<translation id="2969319727213777354">Найдвартай аюулгүй холболт бий болгохын тулд та цагаа зөв тохируулах хэрэгтэй. Учир нь вэб хуудсын өөрсдийгөө таниулахад ашигладаг сертификат нь тодорхой хугацаанд л хүчинтэй байдаг юм. Таны төхөөрөмжийн цаг буруу байгаа тохиолдолд Google Chrome нь эдгээр сертификатыг баталгаажуулж чадахгүй.</translation>
+<translation id="2969319727213777354">Найдвартай аюулгүй холболт бий болгохын тулд та цагаа зөв тохируулах хэрэгтэй. Учир нь веб хуудсын өөрсдийгөө таниулахад ашигладаг сертификат нь тодорхой хугацаанд л хүчинтэй байдаг юм. Таны төхөөрөмжийн цаг буруу байгаа тохиолдолд Google Chrome нь эдгээр сертификатыг баталгаажуулж чадахгүй.</translation>
 <translation id="2972581237482394796">&amp; Дахин хийх</translation>
 <translation id="2977665033722899841">Одоогоор <ph name="ROW_NAME" />-г сонгосон байна. <ph name="ROW_CONTENT" /></translation>
 <translation id="2985306909656435243">Идэвхжүүлсэн тохиолдолд Chromium нь таны энэ төхөөрөмжийн картын хуулбарыг маягт хурдан бөглөхийн тулд хадгалах болно.</translation>
@@ -503,8 +503,8 @@
 <translation id="2986368408720340940">Энэ авах арга боломжгүй тул өөр арга сонгоно уу.</translation>
 <translation id="2987034854559945715">Таарах онцлог олдсонгүй</translation>
 <translation id="2989742184762224133">Дээд буланд хоёр удаа үдэх</translation>
-<translation id="2991174974383378012">Вэбсайтад хуваалцаж байна</translation>
-<translation id="2991571918955627853"><ph name="SITE" /> нь HSTS ашигладаг тул та одоогоор тус вэбсайтад зочлох боломжгүй байна. Сүлжээний алдаа, халдлага ихэвчлэн түр зуурынх байдаг тул энэ хуудас удахгүй хэвийн ажиллана.</translation>
+<translation id="2991174974383378012">Вебсайтад хуваалцаж байна</translation>
+<translation id="2991571918955627853"><ph name="SITE" /> нь HSTS ашигладаг тул та одоогоор тус вебсайтад зочлох боломжгүй байна. Сүлжээний алдаа, халдлага ихэвчлэн түр зуурынх байдаг тул энэ хуудас удахгүй хэвийн ажиллана.</translation>
 <translation id="2996674880327704673">Google-н зөвлөмж</translation>
 <translation id="3002501248619246229">Оролтын цаасны медиаг хянах</translation>
 <translation id="3005723025932146533">Хадгалагдсан хуулбарыг харуулах</translation>
@@ -521,7 +521,7 @@
 <translation id="3061707000357573562">Patch үйлчилгээ</translation>
 <translation id="3064966200440839136">Гадаад апп-р төлбөр хийхийн тулд нууцлалын горимоос гарах гэж байна. Үргэлжлүүлэх үү?</translation>
 <translation id="3080254622891793721">График</translation>
-<translation id="3086579638707268289">Вэб дээрх таны үйл ажиллагааг хянаж байна</translation>
+<translation id="3086579638707268289">Веб дээрх таны үйл ажиллагааг хянаж байна</translation>
 <translation id="3087734570205094154">Доод</translation>
 <translation id="3095940652251934233">Мэдэгдэл</translation>
 <translation id="3096100844101284527">Авах хаяг нэмэх</translation>
@@ -659,7 +659,7 @@
 <translation id="362276910939193118">Түүхийг бүрнээр нь харуул</translation>
 <translation id="3630155396527302611">Хэрэв энэ программ нь сүлжээнд нэвтрэх зөвшөөрөлтэй программын
           жагсаалтад орсон бол жагсаалтаас устгаад, дахин нэмнэ үү.</translation>
-<translation id="3630699740441428070">Энэ төхөөрөмжийн администраторууд таны зочилдог вэб сайтуудыг оруулаад сүлжээний ачааллыг тань харах боломжтойгоор сүлжээний холболтыг тохируулсан байна.</translation>
+<translation id="3630699740441428070">Энэ төхөөрөмжийн администраторууд таны зочилдог веб сайтуудыг оруулаад сүлжээний ачааллыг тань харах боломжтойгоор сүлжээний холболтыг тохируулсан байна.</translation>
 <translation id="3631244953324577188">Биометр</translation>
 <translation id="3633738897356909127">Chrome-г шинэчлэх товч, Chrome-н тохиргооноосоо Chrome-г шинэчлэхийн тулд Enter дарна уу</translation>
 <translation id="3634530185120165534">Гарах цаасны тавиур 5</translation>
@@ -683,7 +683,7 @@
 <translation id="3714780639079136834">Мобайл дата, эсвэл Wi-Fi-г асааж байна</translation>
 <translation id="3715597595485130451">Wi-Fi-д холбогдох</translation>
 <translation id="3717027428350673159"><ph name="BEGIN_LINK" />Прокси, галт хана болон DNS оновчилгоог шалгаж байна<ph name="END_LINK" /></translation>
-<translation id="372429172604983730">Энэ алдааг антивирус, галт хана, вэб шүүлтүүр эсвэл прокси программ хангамж зэрэг апп үүсгэх боломжтой.</translation>
+<translation id="372429172604983730">Энэ алдааг антивирус, галт хана, веб шүүлтүүр эсвэл прокси программ хангамж зэрэг апп үүсгэх боломжтой.</translation>
 <translation id="373042150751172459">B4 (Дугтуй)</translation>
 <translation id="3736520371357197498">Аюултай програмуудыг устгахаас өмнө та энэхүү <ph name="BEGIN_LINK" />сайт руу орохдоо<ph name="END_LINK" /> таны аюулгүй байдалд учирч болох эрсдлийг анхаарна уу.</translation>
 <translation id="3738166223076830879">Танай администратор хөтчийг тань удирддаг.</translation>
@@ -806,7 +806,7 @@
 <translation id="4221630205957821124">&lt;h4&gt;Алхам 1: Порталд нэвтрэх&lt;/h4&gt;
     &lt;p&gt;Кафе эсвэл онгоцны буудал зэрэг газрын Wi-Fi сүлжээ нь танаас нэвтрэхийг шаардана. Нэвтрэх хуудсыг харахын тулд &lt;code&gt;http://&lt;/code&gt;-г ашигладаг хуудсанд зочилно уу.&lt;/p&gt;
     &lt;ol&gt;
-    &lt;li&gt;&lt;a href="http://example.com" target="_blank"&gt;http://example.com&lt;/a&gt; зэрэг &lt;code&gt;http://&lt;/code&gt;-р эхэлсэн дурын вэбсайтад зочилно уу .&lt;/li&gt;
+    &lt;li&gt;&lt;a href="http://example.com" target="_blank"&gt;http://example.com&lt;/a&gt; зэрэг &lt;code&gt;http://&lt;/code&gt;-р эхэлсэн дурын вебсайтад зочилно уу .&lt;/li&gt;
     &lt;li&gt;Нээгдсэн нэвтрэх хуудсанд интернет ашиглахын тулд нэвтэрнэ үү.&lt;/li&gt;
     &lt;/ol&gt;
     &lt;h4&gt;Алхам 2: Хуудсыг нууцлалтай цонхонд нээх (зөвхөн компьютер дээр боломжтой)&lt;/h4&gt;
@@ -819,7 +819,7 @@
     &lt;p&gt;Асуудлыг засахын тулд вирусийн эсрэг программ хангамжаа унтраана уу. Хэрэв программ хангамжийг унтраасны дараа хуудас ажиллаж байвал аюулгүй сайтууд ашиглахдаа тус программ хангамжаа унтраана уу.&lt;/p&gt;
     &lt;p&gt;Дууссаныхаа дараа вирусийн эсрэг программаа буцааж асаана уу.&lt;/p&gt;
     &lt;h4&gt;Алхам 5: Нэмэлт тусламж авах&lt;/h4&gt;
-    &lt;p&gt;Хэрэв та тус алдааг харсаар байвал вэбсайтын эзэмшигчтэй холбогдоно уу.&lt;/p&gt;</translation>
+    &lt;p&gt;Хэрэв та тус алдааг харсаар байвал вебсайтын эзэмшигчтэй холбогдоно уу.&lt;/p&gt;</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Сүлжээний оношилгоог ажиллуулж үзнэ үү<ph name="END_LINK" />.</translation>
 <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> руу үргэлжлүүлэх<ph name="END_LINK" /></translation>
 <translation id="4235360514405112390">Хүчинтэй</translation>
@@ -940,7 +940,7 @@
 <translation id="4756388243121344051">&amp; Түүх</translation>
 <translation id="4758311279753947758">Харилцагчийн мэдээлэл нэмэх</translation>
 <translation id="4761104368405085019">Микрофоноо ашигла</translation>
-<translation id="4764776831041365478"><ph name="URL" /> холбоос бүхий вэб хуудас нь түр хугацаагаар ажиллахгүй эсвэл шинэ вэб хаягтай болсон байна.</translation>
+<translation id="4764776831041365478"><ph name="URL" /> холбоос бүхий веб хуудас нь түр хугацаагаар ажиллахгүй эсвэл шинэ веб хаягтай болсон байна.</translation>
 <translation id="4766713847338118463">Доод буланд хоёр удаа үдэх</translation>
 <translation id="4771973620359291008">Үл мэдэгдэх алдаа гарлаа.</translation>
 <translation id="477945296921629067">{NUM_POPUPS,plural, =1{Үзэгдэх зүйлийг блоклосон}other{# үзэгдэх зүйлийг блоклосон}}</translation>
@@ -954,7 +954,7 @@
 <translation id="4800132727771399293">Дуусах хугацаа болон CVC-гээ шалгаад дахин оролдож үзнэ үү</translation>
 <translation id="480334179571489655">Үндсэн удирдамжийн алдаа</translation>
 <translation id="4803924862070940586"><ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
-<translation id="4807049035289105102">Та <ph name="SITE" />-д хандах боломжгүй байна. Учир нь вэб сайт эмх замбараагүй мэдээлэл илгээсэн тул Google Chrome энэ мэдээллийг боловсруулж чадахгүй байна. Сүлжээний алдаа болон халдлага нь ихэвчлэн түр зуурынх байдаг бөгөөд энэ хуудас хэсэг хугацааны дараа ажиллах болно.</translation>
+<translation id="4807049035289105102">Та <ph name="SITE" />-д хандах боломжгүй байна. Учир нь веб сайт эмх замбараагүй мэдээлэл илгээсэн тул Google Chrome энэ мэдээллийг боловсруулж чадахгүй байна. Сүлжээний алдаа болон халдлага нь ихэвчлэн түр зуурынх байдаг бөгөөд энэ хуудас хэсэг хугацааны дараа ажиллах болно.</translation>
 <translation id="4809079943450490359">Таны төхөөрөмжийн администраторын зааварчилгаа:</translation>
 <translation id="4813512666221746211">Сүлжээний алдаа</translation>
 <translation id="4816492930507672669">Хуудсанд тааруулах</translation>
@@ -1123,7 +1123,7 @@
 <translation id="5481076368049295676">Энэ агуулга таны мэдээллийг хулгайлах эсвэл устгах аюултай программыг таны төхөөрөмжид суулгаж болзошгүй. <ph name="BEGIN_LINK" />Ямартай ч харуулна уу<ph name="END_LINK" /></translation>
 <translation id="54817484435770891">Хүчинтэй хаяг нэмэх</translation>
 <translation id="5490432419156082418">Хаяг болон бусад</translation>
-<translation id="5492298309214877701">Компани, байгууллага, эсвэл сургуулийн дотоод сүлжээний энэ сайт нь гадны вэбсайттай ижил URL-тай байна.
+<translation id="5492298309214877701">Компани, байгууллага, эсвэл сургуулийн дотоод сүлжээний энэ сайт нь гадны вебсайттай ижил URL-тай байна.
     <ph name="LINE_BREAK" />
     Та системийн админтайгаа холбогдоно уу.</translation>
 <translation id="549333378215107354">Хэмжээ 3</translation>
@@ -1184,7 +1184,7 @@
 <translation id="5701381305118179107">Төв</translation>
 <translation id="570530837424789914">Удирдах...</translation>
 <translation id="57094364128775171">Хүчтэй нууц үг санал болгох...</translation>
-<translation id="5710435578057952990">Энэ вэб сайтын тодорхойлолт баталгаажаагүй байна.</translation>
+<translation id="5710435578057952990">Энэ веб сайтын тодорхойлолт баталгаажаагүй байна.</translation>
 <translation id="571403275720188526">(arm64)</translation>
 <translation id="5720705177508910913">Одоогийн хэрэглэгч</translation>
 <translation id="5728056243719941842">C5 (Дугтуй)</translation>
@@ -1271,7 +1271,7 @@
 <translation id="6047233362582046994">Таны аюулгүй байдалд гарч болох эрсдлийг ойлгож байгаа бол аюултай аппыг устгахаас өмнө <ph name="BEGIN_LINK" />энэ сайтад зочилно уу<ph name="END_LINK" />.</translation>
 <translation id="6047927260846328439">Энэ агуулга танаар программ суулгуулах эсвэл таны хувийн мэдээллийг авах зорилгоор таныг мэхэлж болзошгүй. <ph name="BEGIN_LINK" />Ямартай ч харуулна уу<ph name="END_LINK" /></translation>
 <translation id="6049488691372270142">Цаасны гаралт</translation>
-<translation id="6051221802930200923"><ph name="SITE" /> нь сертификат баталгаажуулалтыг ашигладаг тул тус вэбсайтад одоогоор зочлох боломжгүй байна. Сүлжээний алдаа, халдлага нь ихэвчлэн түр зуурынх байдаг тул энэ хуудас удахгүй хэвийн ажиллана.</translation>
+<translation id="6051221802930200923"><ph name="SITE" /> нь сертификат баталгаажуулалтыг ашигладаг тул тус вебсайтад одоогоор зочлох боломжгүй байна. Сүлжээний алдаа, халдлага нь ихэвчлэн түр зуурынх байдаг тул энэ хуудас удахгүй хэвийн ажиллана.</translation>
 <translation id="6052284303005792909">•</translation>
 <translation id="6053328359599022071">Байгаа эсэхээ хуваалцах уу?</translation>
 <translation id="6057359309778282021">Таны администратор <ph name="ORIGIN_NAME" />-с <ph name="VM_NAME" />-тай хуваалцахыг блоклосон</translation>
@@ -1282,7 +1282,7 @@
 <translation id="6080696365213338172">Та админ-аас өгсөн гэрчилгээг ашиглан контент руу нэвтэрсэн байна. Таны <ph name="DOMAIN" /> руу оруулсан өгөгдлийг админаас хориглож болно.</translation>
 <translation id="6094273045989040137">Тэмдэглэгээ хийх</translation>
 <translation id="6104072995492677441">JIS B6</translation>
-<translation id="6106989379647458772"><ph name="PAGE" />-ын вэб хуудас түр хугацаанд ажиллахгүй, эсвэл шинэ хуудас болон бүрмөсөн солигдсон байж болзошгүй.</translation>
+<translation id="6106989379647458772"><ph name="PAGE" />-ын веб хуудас түр хугацаанд ажиллахгүй, эсвэл шинэ хуудас болон бүрмөсөн солигдсон байж болзошгүй.</translation>
 <translation id="6107012941649240045">руу олгосон</translation>
 <translation id="610911394827799129">Таны Google Бүртгэл <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-д хайлтын түүхийн өөр хэлбэртэй байж болзошгүй</translation>
 <translation id="6116338172782435947">Түр санах ойд хуулсан текст, зургийг харах</translation>
@@ -1300,7 +1300,7 @@
 <translation id="6203231073485539293">Та интернэтийн холболтоо шалгана уу</translation>
 <translation id="6218753634732582820">Хаягийг Chromium-с устгах уу?</translation>
 <translation id="622039917539443112">Зэрэгцээ нугалаа</translation>
-<translation id="6221345481584921695"><ph name="SITE" />-д <ph name="BEGIN_LINK" />вирус<ph name="END_LINK" /> байгааг Google-ийн Аюулгүй Хайлт олж ирлрүүллээ. Ихэвчлэн аюулгүй байдаг вэб сайтууд заримдаа вирусд өртөх тохиолдол байдаг бөгөөд энэхүү зар сурталчилгааны агуулга бүхий мэдээлэлүүд нь вирус тараагчаар танигдсан <ph name="SUBRESOURCE_HOST" />-аас ирдэг.</translation>
+<translation id="6221345481584921695"><ph name="SITE" />-д <ph name="BEGIN_LINK" />вирус<ph name="END_LINK" /> байгааг Google-ийн Аюулгүй Хайлт олж ирлрүүллээ. Ихэвчлэн аюулгүй байдаг веб сайтууд заримдаа вирусд өртөх тохиолдол байдаг бөгөөд энэхүү зар сурталчилгааны агуулга бүхий мэдээлэлүүд нь вирус тараагчаар танигдсан <ph name="SUBRESOURCE_HOST" />-аас ирдэг.</translation>
 <translation id="6234122620015464377">Документ бүрийн дараа тайрах</translation>
 <translation id="6240447795304464094">Google Pay-н лого</translation>
 <translation id="6241121617266208201">Зөвлөмжийг нуух</translation>
@@ -1328,7 +1328,7 @@
 <translation id="6293309776179964942">JIS B5</translation>
 <translation id="6302269476990306341">Chrome-н Google Туслахыг зогсоож байна</translation>
 <translation id="6305205051461490394"><ph name="URL" />-г ашиглах боломжгүй байна.</translation>
-<translation id="6312113039770857350">Вэб хуудас боломжгүй байна</translation>
+<translation id="6312113039770857350">Веб хуудас боломжгүй байна</translation>
 <translation id="6321917430147971392">DNS тохиргоогоо шалгана уу</translation>
 <translation id="6322182122604171028">Windows Hello-г ашиглаж чадсангүй</translation>
 <translation id="6328639280570009161">Сүлжээний таамаглалыг идэвхгүй болгох гээд үзээрэй</translation>
@@ -1488,7 +1488,7 @@
 <translation id="7050187094878475250">Та <ph name="DOMAIN" />-д хандах оролдлого хийсэн боловч серверээс таны оруулсан гэрчилгээний хугацаа хүчин төгөлдөр гэж үзэх хугацаанаас хэтэрхий урт хугацаанд хүчинтэй байна гэж үзсэн байна.</translation>
 <translation id="705310974202322020">{NUM_CARDS,plural, =1{Энэ картыг одоогоор хадгалах боломжгүй байна}other{Эдгээр картыг одоогоор хадгалах боломжгүй байна}}</translation>
 <translation id="7053983685419859001">Блоклох</translation>
-<translation id="7058163556978339998"><ph name="BROWSER" /> <ph name="ISSUER" />-г энэ вэб сайтын гэрчилгээг олгосон болохыг баталгаажуулсан.</translation>
+<translation id="7058163556978339998"><ph name="BROWSER" /> <ph name="ISSUER" />-г энэ веб сайтын гэрчилгээг олгосон болохыг баталгаажуулсан.</translation>
 <translation id="7062635574500127092">Номин ногоон</translation>
 <translation id="7064851114919012435">Харилцагчийн мэдээлэл</translation>
 <translation id="70705239631109039">Таны холболт бүрэн аюулгүй биш байна</translation>
@@ -1596,7 +1596,7 @@
 <translation id="7440140511386898319">Офлайн үедээ судлах</translation>
 <translation id="7441627299479586546">Буруу тохиргооны зүйл</translation>
 <translation id="7442725080345379071">Цайвар улбар шар</translation>
-<translation id="7445762425076701745">Таны холбогдсон байгаа серверийн Хувийн мэдээллийг бүрэн батлах боломжгүй. Та зөвхөн таны сүлжээнд хүчин төгөлдөр нэрийг ашиглан сервер уруу холбогддог бөгөөд энэ нь хөндлөнгийн гэрчилгээ нь эзэмшлийг батлах ямар ч боломжгүй гэсэн үг юм. Зарим гэрчилгээнүүдийн эрх нь эдгээр нэрүүдэд гэрчилгээ гаргаж өгдөг хэдий ч таныг зорьж буй вэбсайт руугаа мөн халдагч бус сүлжээ рүү холбогдсон гэдгийг батлах ямар ч арга байхгүй юм.</translation>
+<translation id="7445762425076701745">Таны холбогдсон байгаа серверийн Хувийн мэдээллийг бүрэн батлах боломжгүй. Та зөвхөн таны сүлжээнд хүчин төгөлдөр нэрийг ашиглан сервер уруу холбогддог бөгөөд энэ нь хөндлөнгийн гэрчилгээ нь эзэмшлийг батлах ямар ч боломжгүй гэсэн үг юм. Зарим гэрчилгээнүүдийн эрх нь эдгээр нэрүүдэд гэрчилгээ гаргаж өгдөг хэдий ч таныг зорьж буй вебсайт руугаа мөн халдагч бус сүлжээ рүү холбогдсон гэдгийг батлах ямар ч арга байхгүй юм.</translation>
 <translation id="7451311239929941790">Уг асуудлын талаар <ph name="BEGIN_LINK" />Дэлгэрэнгүй үзэж байна<ph name="END_LINK" />.</translation>
 <translation id="7455133967321480974">Олон нийтээр хэрэглэдэг сонголтыг сонго (Блок)</translation>
 <translation id="7460618730930299168">Дэлгэрэнгүй нь таны сонгосноос өөр байна. Үргэлжлүүлэх үү?</translation>
@@ -1612,7 +1612,7 @@
 <translation id="7508870219247277067">Авокадо ногоон</translation>
 <translation id="7511955381719512146">Таны ашиглаж буй Wi-Fi сүлжээ таныг <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />-д нэвтрэхийг шаардах магадлалтай.</translation>
 <translation id="7514365320538308">Татаж авах</translation>
-<translation id="7518003948725431193">Энэ вэб хаягаар хайхад тохирох хуудас олдсонгүй: <ph name="URL" /></translation>
+<translation id="7518003948725431193">Энэ веб хаягаар хайхад тохирох хуудас олдсонгүй: <ph name="URL" /></translation>
 <translation id="7520302887438682816">C8 (Дугтуй)</translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7521825010239864438">"<ph name="SECTION" />" хэсгийг нуусан</translation>
@@ -1623,7 +1623,7 @@
 <translation id="7542403920425041731">Таныг баталгаажуулсны дараагаар таны картын дэлгэрэнгүйг энэ сайтад хуваалцах болно.</translation>
 <translation id="7542995811387359312">Зээлийн картыг автоматиар бөглөх явц идэвхгүй байна. Учир нь энэ маягт аюулгүй холболт хэрэглэгдэггүй.</translation>
 <translation id="7548892272833184391">Холболтын алдааг засах</translation>
-<translation id="7549584377607005141">Энэ вэб хуудас нь зохих хэмжээнд гарахын тулд таны өмнө оруулсан мэдээллийг шаардаж байна. Та энэ өгөгдлийг дахин илгээж болно, гэхдээ үүнийг хийснээрээ та энэ хуудасны өмнө нь хийж байсан үйлдлийг давтах хэрэгтэй болно.</translation>
+<translation id="7549584377607005141">Энэ веб хуудас нь зохих хэмжээнд гарахын тулд таны өмнө оруулсан мэдээллийг шаардаж байна. Та энэ өгөгдлийг дахин илгээж болно, гэхдээ үүнийг хийснээрээ та энэ хуудасны өмнө нь хийж байсан үйлдлийг давтах хэрэгтэй болно.</translation>
 <translation id="7550637293666041147">Таны төхөөрөмжийн хэрэглэгчийн нэр болон Chrome хэрэглэгчийн нэр</translation>
 <translation id="7552846755917812628">Дараах зөвлөгөөг дагана уу:</translation>
 <translation id="7554791636758816595">Шинэ таб</translation>
@@ -1708,7 +1708,7 @@
 <translation id="782886543891417279">Таны ашиглаж буй Wi-Fi (<ph name="WIFI_NAME" />) сүлжээ таныг нэвтрэх хуудаст орохыг шаардах магадлалтай.</translation>
 <translation id="7836231406687464395">Postfix (Дугтуй)</translation>
 <translation id="7844689747373518809">{COUNT,plural, =0{Байхгүй}=1{1 апп (<ph name="EXAMPLE_APP_1" />)}=2{2 апп (<ph name="EXAMPLE_APP_1" />, <ph name="EXAMPLE_APP_2" />)}other{# апп (<ph name="EXAMPLE_APP_1" />, <ph name="EXAMPLE_APP_2" />, <ph name="AND_MORE" />)}}</translation>
-<translation id="785549533363645510">Та харагдаж байгаа. Нууц горимд шилжсэн ч таны хийж буй хайлтыг таны ажил олгогч, интернэтийн үйлчилгээ үзүүлэгч болон зочилсон вэбсайтаас нуух боломжгүй.</translation>
+<translation id="785549533363645510">Та харагдаж байгаа. Нууц горимд шилжсэн ч таны хийж буй хайлтыг таны ажил олгогч, интернэтийн үйлчилгээ үзүүлэгч болон зочилсон вебсайтаас нуух боломжгүй.</translation>
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">Сайтыг орхих уу?</translation>
 <translation id="7865448901209910068">Хамгийн оновчтой хурд</translation>
@@ -1846,7 +1846,7 @@
 <ph name="DEBUG_INFO" /></translation>
 <translation id="8424582179843326029"><ph name="FIRST_LABEL" /> <ph name="SECOND_LABEL" /> <ph name="THIRD_LABEL" /></translation>
 <translation id="8428213095426709021">Тохиргоо</translation>
-<translation id="8433057134996913067">Энэ сонголт нь таныг ихэнх вэб сайтаас гаргах болно.</translation>
+<translation id="8433057134996913067">Энэ сонголт нь таныг ихэнх веб сайтаас гаргах болно.</translation>
 <translation id="8437238597147034694">&amp; Зөөвөрлөх үйлдлийг буцаах</translation>
 <translation id="8438786541497918448">Камер, микрофон ашиглах уу?</translation>
 <translation id="8446884382197647889">Дэлгэрэнгүй мэдээлэл</translation>
@@ -1889,7 +1889,7 @@
 <translation id="867224526087042813">Гарын үсэг</translation>
 <translation id="8676424191133491403">Хүлээхгүй</translation>
 <translation id="8680536109547170164"><ph name="QUERY" />, хариулт, <ph name="ANSWER" /></translation>
-<translation id="8681531050781943054"><ph name="PAGE" />-ын вэб хуудсыг дараах шалтгааны улмаас ачаалж чадсангүй:</translation>
+<translation id="8681531050781943054"><ph name="PAGE" />-ын веб хуудсыг дараах шалтгааны улмаас ачаалж чадсангүй:</translation>
 <translation id="8685155993131031756">Prc-16K</translation>
 <translation id="8688672835843460752">Боломжтой</translation>
 <translation id="868922510921656628">Багц бүрийн хуудас</translation>
@@ -1906,7 +1906,7 @@
 <translation id="8730621377337864115">хийсэн</translation>
 <translation id="8731544501227493793">Нууц үг удирдах товч, Chrome-н тохиргоон дээр нууц үгээ харах, удирдахын тулд Enter дарна уу</translation>
 <translation id="8737134861345396036"><ph name="LAUNCH_INCOGNITO_FOCUSED_FRIENDLY_MATCH_TEXT" />, нууцлалтайгаар үзэхдээ Нууцлалтай цонх шинээр нээхийн тулд эхлээд Таб дээр, дараа нь Enter дарна уу</translation>
-<translation id="8738058698779197622">Найдвартай аюулгүй холболт бий болгохын тулд та цагаа зөв тохируулах хэрэгтэй. Учир нь  вэб хуудсуудын өөрсдийгөө таниулахад ашигладаг гэрчилгээ нь тодорхой хугацаанд л хүчинтэй байдаг юм. Таны төхөөрөмжийн цаг буруу байгаа тохиолдолд Chromium нь эдгээр гэрчилгээнүүдийг баталгаажуулж чадахгүй.</translation>
+<translation id="8738058698779197622">Найдвартай аюулгүй холболт бий болгохын тулд та цагаа зөв тохируулах хэрэгтэй. Учир нь  веб хуудсуудын өөрсдийгөө таниулахад ашигладаг гэрчилгээ нь тодорхой хугацаанд л хүчинтэй байдаг юм. Таны төхөөрөмжийн цаг буруу байгаа тохиолдолд Chromium нь эдгээр гэрчилгээнүүдийг баталгаажуулж чадахгүй.</translation>
 <translation id="8740359287975076522"><ph name="HOST_NAME" />-н &lt;abbr id="dnsDefinition"&gt;DNS хаяг&lt;/abbr&gt; олдсонгүй. Алдааг шалгаж байна.</translation>
 <translation id="8742371904523228557"><ph name="ONE_TIME_CODE" /> бол <ph name="ORIGIN" />-д зориулсан таны код</translation>
 <translation id="874918643257405732">Энэ табыг тэмдэглэх</translation>
@@ -1992,7 +1992,7 @@
 <translation id="9089260154716455634">Ажиллахгүй цагийн удирдамж:</translation>
 <translation id="9095388113577226029">Бусад хэл...</translation>
 <translation id="9101630580131696064">Гарах цаасны тавиур 1</translation>
-<translation id="9103872766612412690"><ph name="SITE" /> ихэвчлэн таны мэдээллийг хамгаалах зорилгоор шифр ашигладаг. Энэ удаад Chromium <ph name="SITE" />-тай холбогдохыг оролдоход тус вэб сайтаас хэвийн бус, буруу өгөгдөл илгээлээ. Халдагч <ph name="SITE" /> юм шиг дүр үзүүлж байгаа, эсвэл Wi-Fi-д нэвтрэх дэлгэц холболтод саад учруулсан байж болзошгүй. Chromium ямар нэгэн өгөгдөл солилцохоос өмнө холболтыг зогсоосон тул таны мэдээлэл аюулгүй.</translation>
+<translation id="9103872766612412690"><ph name="SITE" /> ихэвчлэн таны мэдээллийг хамгаалах зорилгоор шифр ашигладаг. Энэ удаад Chromium <ph name="SITE" />-тай холбогдохыг оролдоход тус веб сайтаас хэвийн бус, буруу өгөгдөл илгээлээ. Халдагч <ph name="SITE" /> юм шиг дүр үзүүлж байгаа, эсвэл Wi-Fi-д нэвтрэх дэлгэц холболтод саад учруулсан байж болзошгүй. Chromium ямар нэгэн өгөгдөл солилцохоос өмнө холболтыг зогсоосон тул таны мэдээлэл аюулгүй.</translation>
 <translation id="9106062320799175032">Тооцооны хаяг нэмэх</translation>
 <translation id="9114524666733003316">Картыг баталгаажуулж байна...</translation>
 <translation id="9114581008513152754">Энэ хөтчийг компани эсвэл бусад байгууллагаас удирддаггүй. Энэ төхөөрөмж дээрх үйл ажиллагааг Chrome-с гадуур удирддаг байж болзошгүй. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation>
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn
index d94d68a9..0b451a7 100644
--- a/components/sync/BUILD.gn
+++ b/components/sync/BUILD.gn
@@ -40,13 +40,10 @@
     "engine/cycle/status_counters.h",
     "engine/cycle/sync_cycle_snapshot.cc",
     "engine/cycle/sync_cycle_snapshot.h",
-    "engine/cycle/type_debug_info_observer.h",
     "engine/cycle/update_counters.cc",
     "engine/cycle/update_counters.h",
     "engine/data_type_activation_response.cc",
     "engine/data_type_activation_response.h",
-    "engine/data_type_association_stats.cc",
-    "engine/data_type_association_stats.h",
     "engine/data_type_debug_info_listener.cc",
     "engine/data_type_debug_info_listener.h",
     "engine/engine_components_factory.h",
diff --git a/components/sync/driver/about_sync_util.cc b/components/sync/driver/about_sync_util.cc
index 140c4cb..8ebd6d83 100644
--- a/components/sync/driver/about_sync_util.cc
+++ b/components/sync/driver/about_sync_util.cc
@@ -45,7 +45,6 @@
 const char kSyncLogJS[] = "sync_log.js";
 const char kSyncNodeBrowserJS[] = "sync_node_browser.js";
 const char kSyncSearchJS[] = "sync_search.js";
-const char kTypesJS[] = "types.js";
 const char kUserEventsJS[] = "user_events.js";
 const char kTrafficLogJS[] = "traffic_log.js";
 
@@ -54,7 +53,6 @@
 const char kGetAllNodes[] = "getAllNodes";
 const char kGetAllNodesCallback[] = "chrome.sync.getAllNodesCallback";
 const char kRegisterForEvents[] = "registerForEvents";
-const char kRegisterForPerTypeCounters[] = "registerForPerTypeCounters";
 const char kRequestIncludeSpecificsInitialState[] =
     "requestIncludeSpecificsInitialState";
 const char kRequestListOfTypes[] = "requestListOfTypes";
@@ -70,20 +68,13 @@
 const char kWriteUserEvent[] = "writeUserEvent";
 
 // Other strings.
-const char kCommit[] = "commit";
-const char kCounters[] = "counters";
-const char kCounterType[] = "counterType";
 const char kIncludeSpecifics[] = "includeSpecifics";
-const char kModelType[] = "modelType";
 const char kOnAboutInfoUpdated[] = "onAboutInfoUpdated";
-const char kOnCountersUpdated[] = "onCountersUpdated";
 const char kOnProtocolEvent[] = "onProtocolEvent";
 const char kOnReceivedIncludeSpecificsInitialState[] =
     "onReceivedIncludeSpecificsInitialState";
 const char kOnReceivedListOfTypes[] = "onReceivedListOfTypes";
-const char kStatus[] = "status";
 const char kTypes[] = "types";
-const char kUpdate[] = "update";
 
 namespace {
 
diff --git a/components/sync/driver/about_sync_util.h b/components/sync/driver/about_sync_util.h
index ad2b307c..c25ed39 100644
--- a/components/sync/driver/about_sync_util.h
+++ b/components/sync/driver/about_sync_util.h
@@ -36,7 +36,6 @@
 extern const char kSyncLogJS[];
 extern const char kSyncNodeBrowserJS[];
 extern const char kSyncSearchJS[];
-extern const char kTypesJS[];
 extern const char kUserEventsJS[];
 extern const char kTrafficLogJS[];
 
@@ -46,7 +45,6 @@
 extern const char kGetAllNodes[];
 extern const char kGetAllNodesCallback[];
 extern const char kRegisterForEvents[];
-extern const char kRegisterForPerTypeCounters[];
 extern const char kRequestIncludeSpecificsInitialState[];
 extern const char kRequestListOfTypes[];
 extern const char kRequestStart[];
@@ -61,20 +59,12 @@
 
 // Other strings.
 // Must match the constants used in the resource files.
-extern const char kCommit[];
-extern const char kCounters[];
-extern const char kCounterType[];
 extern const char kIncludeSpecifics[];
-extern const char kModelType[];
 extern const char kOnAboutInfoUpdated[];
-extern const char kOnCountersUpdated[];
 extern const char kOnProtocolEvent[];
 extern const char kOnReceivedIncludeSpecificsInitialState[];
 extern const char kOnReceivedListOfTypes[];
-extern const char kStatus[];
 extern const char kTypes[];
-extern const char kUpdate[];
-
 // This function returns a DictionaryValue which contains all the information
 // required to populate the 'About' tab of about:sync.
 // Note that |service| may be null.
diff --git a/components/sync/driver/data_type_controller.h b/components/sync/driver/data_type_controller.h
index 347e357..060a320 100644
--- a/components/sync/driver/data_type_controller.h
+++ b/components/sync/driver/data_type_controller.h
@@ -43,10 +43,8 @@
 
   // Returned from RegisterWithBackend.
   enum RegisterWithBackendResult {
-    // Used when RegisterWithBackend is called on an already-registered type.
-    // TODO(crbug.com/647505): Get rid of this entry entirely if possible.
-    REGISTRATION_IGNORED,
-    // Indicates that the initial download for this type is already complete.
+    // Indicates that the initial download for this type is already complete, or
+    // wasn't needed in the first place (e.g. for proxy types).
     TYPE_ALREADY_DOWNLOADED,
     // Indicates that the initial download for this type still needs to be done.
     TYPE_NOT_YET_DOWNLOADED,
@@ -130,6 +128,7 @@
   // Collects StatusCounters for this datatype and passes them to |callback|.
   // Used to display entity counts in chrome://sync-internals. Can be called
   // only if state() != NOT_RUNNING.
+  // TODO(crbug.com/1102849): Remove, not used anymore.
   virtual void GetStatusCounters(StatusCountersCallback callback) = 0;
 
   // Records entities count and estimated memory usage of the type into
diff --git a/components/sync/driver/data_type_manager_impl.cc b/components/sync/driver/data_type_manager_impl.cc
index 88de703..a33fcd5 100644
--- a/components/sync/driver/data_type_manager_impl.cc
+++ b/components/sync/driver/data_type_manager_impl.cc
@@ -206,10 +206,11 @@
       // time.
       DCHECK(!data_type_status_table_.GetFailedTypes().Has(dtc->type()));
       switch (dtc->RegisterWithBackend(configurer_)) {
-        case DataTypeController::REGISTRATION_IGNORED:
-          break;
         case DataTypeController::TYPE_ALREADY_DOWNLOADED:
-          downloaded_types_.Put(type);
+          // Proxy types (as opposed to protocol types) don't actually have any
+          // data, so keep proxy types out of |downloaded_types_|.
+          if (!IsProxyType(type))
+            downloaded_types_.Put(type);
           break;
         case DataTypeController::TYPE_NOT_YET_DOWNLOADED:
           downloaded_types_.Remove(type);
@@ -723,9 +724,7 @@
   }
 }
 
-void DataTypeManagerImpl::OnSingleDataTypeAssociationDone(
-    ModelType type,
-    const DataTypeAssociationStats& association_stats) {
+void DataTypeManagerImpl::OnSingleDataTypeAssociationDone(ModelType type) {
   DCHECK(!association_types_queue_.empty());
 
   if (!debug_info_listener_.IsInitialized())
@@ -734,7 +733,6 @@
   AssociationTypesInfo& info = association_types_queue_.front();
   configuration_stats_.push_back(DataTypeConfigurationStats());
   configuration_stats_.back().model_type = type;
-  configuration_stats_.back().association_stats = association_stats;
   if (info.types.Has(type)) {
     // Times in |info| only apply to non-slow types.
     configuration_stats_.back().download_wait_time =
diff --git a/components/sync/driver/data_type_manager_impl.h b/components/sync/driver/data_type_manager_impl.h
index 2e5f945..8a3a64d5 100644
--- a/components/sync/driver/data_type_manager_impl.h
+++ b/components/sync/driver/data_type_manager_impl.h
@@ -62,9 +62,7 @@
 
   // |ModelAssociationManagerDelegate| implementation.
   void OnAllDataTypesReadyForConfigure() override;
-  void OnSingleDataTypeAssociationDone(
-      ModelType type,
-      const DataTypeAssociationStats& association_stats) override;
+  void OnSingleDataTypeAssociationDone(ModelType type) override;
   void OnModelAssociationDone(
       const DataTypeManager::ConfigureResult& result) override;
   void OnSingleDataTypeWillStop(ModelType type,
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc
index ab543be..d07a804 100644
--- a/components/sync/driver/fake_sync_service.cc
+++ b/components/sync/driver/fake_sync_service.cc
@@ -140,12 +140,6 @@
 void FakeSyncService::RemoveProtocolEventObserver(
     ProtocolEventObserver* observer) {}
 
-void FakeSyncService::AddTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {}
-
-void FakeSyncService::RemoveTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {}
-
 base::WeakPtr<JsController> FakeSyncService::GetJsController() {
   return base::WeakPtr<JsController>();
 }
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h
index 055f05c0..6a27946 100644
--- a/components/sync/driver/fake_sync_service.h
+++ b/components/sync/driver/fake_sync_service.h
@@ -59,8 +59,6 @@
   base::Location GetUnrecoverableErrorLocationForDebugging() const override;
   void AddProtocolEventObserver(ProtocolEventObserver* observer) override;
   void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override;
-  void AddTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override;
-  void RemoveTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override;
   base::WeakPtr<JsController> GetJsController() override;
   void GetAllNodesForDebugging(
       base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback)
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc
index 4b13850..b69e925 100644
--- a/components/sync/driver/glue/sync_engine_backend.cc
+++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -21,10 +21,7 @@
 #include "components/sync/driver/configure_context.h"
 #include "components/sync/driver/model_type_controller.h"
 #include "components/sync/driver/sync_driver_switches.h"
-#include "components/sync/engine/cycle/commit_counters.h"
-#include "components/sync/engine/cycle/status_counters.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
-#include "components/sync/engine/cycle/update_counters.h"
 #include "components/sync/engine/engine_components_factory.h"
 #include "components/sync/engine/events/protocol_event.h"
 #include "components/sync/engine/net/http_post_provider_factory.h"
@@ -164,36 +161,6 @@
              status);
 }
 
-void SyncEngineBackend::OnCommitCountersUpdated(
-    ModelType type,
-    const CommitCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  host_.Call(
-      FROM_HERE,
-      &SyncEngineImpl::HandleDirectoryCommitCountersUpdatedOnFrontendLoop, type,
-      counters);
-}
-
-void SyncEngineBackend::OnUpdateCountersUpdated(
-    ModelType type,
-    const UpdateCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  host_.Call(
-      FROM_HERE,
-      &SyncEngineImpl::HandleDirectoryUpdateCountersUpdatedOnFrontendLoop, type,
-      counters);
-}
-
-void SyncEngineBackend::OnStatusCountersUpdated(
-    ModelType type,
-    const StatusCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  host_.Call(
-      FROM_HERE,
-      &SyncEngineImpl::HandleDirectoryStatusCountersUpdatedOnFrontendLoop, type,
-      counters);
-}
-
 void SyncEngineBackend::OnSyncStatusChanged(const SyncStatus& status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   host_.Call(FROM_HERE, &SyncEngineImpl::HandleSyncStatusChanged, status);
@@ -457,7 +424,6 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (sync_manager_) {
-    DisableDirectoryTypeDebugInfoForwarding();
     sync_manager_->RemoveObserver(this);
     sync_manager_->ShutdownOnSyncThread();
     sync_manager_.reset();
@@ -540,30 +506,6 @@
   forward_protocol_events_ = false;
 }
 
-void SyncEngineBackend::EnableDirectoryTypeDebugInfoForwarding() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(sync_manager_);
-
-  forward_type_info_ = true;
-
-  if (!sync_manager_->HasDirectoryTypeDebugInfoObserver(this))
-    sync_manager_->RegisterDirectoryTypeDebugInfoObserver(this);
-  sync_manager_->RequestEmitDebugInfo();
-}
-
-void SyncEngineBackend::DisableDirectoryTypeDebugInfoForwarding() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(sync_manager_);
-
-  if (!forward_type_info_)
-    return;
-
-  forward_type_info_ = false;
-
-  if (sync_manager_->HasDirectoryTypeDebugInfoObserver(this))
-    sync_manager_->UnregisterDirectoryTypeDebugInfoObserver(this);
-}
-
 void SyncEngineBackend::DoOnCookieJarChanged(bool account_mismatch,
                                              bool empty_jar,
                                              base::OnceClosure callback) {
diff --git a/components/sync/driver/glue/sync_engine_backend.h b/components/sync/driver/glue/sync_engine_backend.h
index 4617591..dd02865 100644
--- a/components/sync/driver/glue/sync_engine_backend.h
+++ b/components/sync/driver/glue/sync_engine_backend.h
@@ -21,7 +21,6 @@
 #include "components/sync/base/cancelation_signal.h"
 #include "components/sync/base/system_encryptor.h"
 #include "components/sync/driver/glue/sync_engine_impl.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 #include "components/sync/engine/model_type_configurer.h"
 #include "components/sync/engine/shutdown_reason.h"
 #include "components/sync/engine/sync_encryption_handler.h"
@@ -35,7 +34,6 @@
 
 class SyncEngineBackend : public base::RefCountedThreadSafe<SyncEngineBackend>,
                           public SyncManager::Observer,
-                          public TypeDebugInfoObserver,
                           public SyncStatusObserver {
  public:
   using AllNodesCallback =
@@ -59,14 +57,6 @@
   void OnMigrationRequested(ModelTypeSet types) override;
   void OnProtocolEvent(const ProtocolEvent& event) override;
 
-  // TypeDebugInfoObserver implementation
-  void OnCommitCountersUpdated(ModelType type,
-                               const CommitCounters& counters) override;
-  void OnUpdateCountersUpdated(ModelType type,
-                               const UpdateCounters& counters) override;
-  void OnStatusCountersUpdated(ModelType type,
-                               const StatusCounters& counters) override;
-
   // SyncStatusObserver implementation.
   void OnSyncStatusChanged(const SyncStatus& status) override;
 
@@ -149,14 +139,6 @@
   void SendBufferedProtocolEventsAndEnableForwarding();
   void DisableProtocolEventForwarding();
 
-  // Enables the forwarding of directory type debug counters to the
-  // SyncEngineHost. Also requests that updates to all counters be emitted right
-  // away to initialize any new listeners' states.
-  void EnableDirectoryTypeDebugInfoForwarding();
-
-  // Disables forwarding of directory type debug counters.
-  void DisableDirectoryTypeDebugInfoForwarding();
-
   // Notify the syncer that the cookie jar has changed.
   void DoOnCookieJarChanged(bool account_mismatch,
                             bool empty_jar,
@@ -230,9 +212,6 @@
   // Set when we've been asked to forward sync protocol events to the frontend.
   bool forward_protocol_events_ = false;
 
-  // Set when the forwarding of per-type debug counters is enabled.
-  bool forward_type_info_ = false;
-
   // A map of data type -> invalidation version to track the most recently
   // received invalidation version for each type.
   // This allows dropping any invalidations with versions older than those
diff --git a/components/sync/driver/glue/sync_engine_impl.cc b/components/sync/driver/glue/sync_engine_impl.cc
index b5e0ccb..e19cd41 100644
--- a/components/sync/driver/glue/sync_engine_impl.cc
+++ b/components/sync/driver/glue/sync_engine_impl.cc
@@ -11,6 +11,8 @@
 #include "base/feature_list.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
 #include "base/task_runner_util.h"
 #include "build/build_config.h"
 #include "components/invalidation/impl/invalidation_switches.h"
@@ -42,7 +44,10 @@
     SyncInvalidationsService* sync_invalidations_service,
     const base::WeakPtr<SyncPrefs>& sync_prefs,
     const base::FilePath& sync_data_folder)
-    : name_(name),
+    : sync_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
+          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+           base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
+      name_(name),
       sync_prefs_(sync_prefs),
       invalidator_(invalidator),
       sync_invalidations_service_(sync_invalidations_service),
@@ -61,11 +66,9 @@
 }
 
 void SyncEngineImpl::Initialize(InitParams params) {
-  DCHECK(params.sync_task_runner);
   DCHECK(params.host);
   DCHECK(params.registrar);
 
-  sync_task_runner_ = params.sync_task_runner;
   host_ = params.host;
   registrar_ = params.registrar.get();
 
@@ -284,23 +287,6 @@
                      backend_));
 }
 
-void SyncEngineImpl::EnableDirectoryTypeDebugInfoForwarding() {
-  DCHECK(IsInitialized());
-  sync_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&SyncEngineBackend::EnableDirectoryTypeDebugInfoForwarding,
-                     backend_));
-}
-
-void SyncEngineImpl::DisableDirectoryTypeDebugInfoForwarding() {
-  DCHECK(IsInitialized());
-  sync_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(
-          &SyncEngineBackend::DisableDirectoryTypeDebugInfoForwarding,
-          backend_));
-}
-
 void SyncEngineImpl::FinishConfigureDataTypesOnFrontendLoop(
     const ModelTypeSet enabled_types,
     const ModelTypeSet succeeded_configuration_types,
@@ -407,27 +393,6 @@
   host_->OnProtocolEvent(*event);
 }
 
-void SyncEngineImpl::HandleDirectoryCommitCountersUpdatedOnFrontendLoop(
-    ModelType type,
-    const CommitCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  host_->OnDirectoryTypeCommitCounterUpdated(type, counters);
-}
-
-void SyncEngineImpl::HandleDirectoryUpdateCountersUpdatedOnFrontendLoop(
-    ModelType type,
-    const UpdateCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  host_->OnDirectoryTypeUpdateCounterUpdated(type, counters);
-}
-
-void SyncEngineImpl::HandleDirectoryStatusCountersUpdatedOnFrontendLoop(
-    ModelType type,
-    const StatusCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  host_->OnDatatypeStatusCounterUpdated(type, counters);
-}
-
 void SyncEngineImpl::UpdateInvalidationVersions(
     const std::map<ModelType, int64_t>& invalidation_versions) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/sync/driver/glue/sync_engine_impl.h b/components/sync/driver/glue/sync_engine_impl.h
index bd33225..126d892 100644
--- a/components/sync/driver/glue/sync_engine_impl.h
+++ b/components/sync/driver/glue/sync_engine_impl.h
@@ -18,13 +18,13 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
+#include "base/sequenced_task_runner.h"
 #include "components/invalidation/public/invalidation_handler.h"
 #include "components/sync/base/extensions_activity.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/weak_handle.h"
 #include "components/sync/engine/configure_reason.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 #include "components/sync/engine/model_type_configurer.h"
 #include "components/sync/engine/sync_credentials.h"
 #include "components/sync/engine/sync_engine.h"
@@ -87,8 +87,6 @@
   void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) const override;
   void RequestBufferedProtocolEventsAndEnableForwarding() override;
   void DisableProtocolEventForwarding() override;
-  void EnableDirectoryTypeDebugInfoForwarding() override;
-  void DisableDirectoryTypeDebugInfoForwarding() override;
   void OnCookieJarChanged(bool account_mismatch,
                           bool empty_jar,
                           base::OnceClosure callback) override;
@@ -134,27 +132,6 @@
   // these events.
   void HandleProtocolEventOnFrontendLoop(std::unique_ptr<ProtocolEvent> event);
 
-  // Forwards a directory commit counter update to the frontend loop.  Will not
-  // be called unless a call to EnableDirectoryTypeDebugInfoForwarding()
-  // explicitly requested that we start forwarding these events.
-  void HandleDirectoryCommitCountersUpdatedOnFrontendLoop(
-      ModelType type,
-      const CommitCounters& counters);
-
-  // Forwards a directory update counter update to the frontend loop.  Will not
-  // be called unless a call to EnableDirectoryTypeDebugInfoForwarding()
-  // explicitly requested that we start forwarding these events.
-  void HandleDirectoryUpdateCountersUpdatedOnFrontendLoop(
-      ModelType type,
-      const UpdateCounters& counters);
-
-  // Forwards a directory status counter update to the frontend loop.  Will not
-  // be called unless a call to EnableDirectoryTypeDebugInfoForwarding()
-  // explicitly requested that we start forwarding these events.
-  void HandleDirectoryStatusCountersUpdatedOnFrontendLoop(
-      ModelType type,
-      const StatusCounters& counters);
-
   // Overwrites the kSyncInvalidationVersions preference with the most recent
   // set of invalidation versions for each type.
   void UpdateInvalidationVersions(
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc
index af879bd..4ece50ec 100644
--- a/components/sync/driver/glue/sync_engine_impl_unittest.cc
+++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -21,7 +21,6 @@
 #include "base/test/task_environment.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/invalidation/impl/invalidation_logger.h"
@@ -34,9 +33,6 @@
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/sync_prefs.h"
 #include "components/sync/driver/sync_driver_switches.h"
-#include "components/sync/engine/cycle/commit_counters.h"
-#include "components/sync/engine/cycle/status_counters.h"
-#include "components/sync/engine/cycle/update_counters.h"
 #include "components/sync/engine/fake_sync_manager.h"
 #include "components/sync/engine/model_safe_worker.h"
 #include "components/sync/engine/net/http_bridge.h"
@@ -183,8 +179,7 @@
 class SyncEngineImplTest : public testing::Test {
  protected:
   SyncEngineImplTest()
-      : sync_thread_("SyncThreadForTest"),
-        host_(base::BindOnce(&SyncEngineImplTest::SetEngineTypes,
+      : host_(base::BindOnce(&SyncEngineImplTest::SetEngineTypes,
                              base::Unretained(this))),
         fake_manager_(nullptr) {}
 
@@ -196,7 +191,6 @@
     SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
 
     sync_prefs_ = std::make_unique<SyncPrefs>(&pref_service_);
-    sync_thread_.StartAndWaitForTesting();
     ON_CALL(invalidator_, UpdateInterestedTopics(_, _))
         .WillByDefault(testing::Return(true));
     backend_ = std::make_unique<SyncEngineImpl>(
@@ -235,7 +229,6 @@
     host_.SetExpectSuccess(expect_success);
 
     SyncEngine::InitParams params;
-    params.sync_task_runner = sync_thread_.task_runner();
     params.host = &host_;
     params.registrar = std::make_unique<SyncBackendRegistrar>(
         std::string(), base::BindRepeating(&CreateModelWorkerForGroup));
@@ -311,7 +304,6 @@
   base::test::TaskEnvironment task_environment_;
   base::ScopedTempDir temp_dir_;
   sync_preferences::TestingPrefServiceSyncable pref_service_;
-  base::Thread sync_thread_;
   TestSyncEngineHost host_;
   std::unique_ptr<SyncPrefs> sync_prefs_;
   std::unique_ptr<SyncEngineImpl> backend_;
diff --git a/components/sync/driver/mock_sync_service.h b/components/sync/driver/mock_sync_service.h
index 315d6658..73d7856 100644
--- a/components/sync/driver/mock_sync_service.h
+++ b/components/sync/driver/mock_sync_service.h
@@ -83,9 +83,6 @@
   MOCK_METHOD1(AddProtocolEventObserver, void(ProtocolEventObserver* observer));
   MOCK_METHOD1(RemoveProtocolEventObserver,
                void(ProtocolEventObserver* observer));
-  MOCK_METHOD1(AddTypeDebugInfoObserver, void(TypeDebugInfoObserver* observer));
-  MOCK_METHOD1(RemoveTypeDebugInfoObserver,
-               void(TypeDebugInfoObserver* observer));
   MOCK_METHOD0(GetJsController, base::WeakPtr<JsController>());
   MOCK_METHOD1(GetAllNodesForDebugging,
                void(base::OnceCallback<void(std::unique_ptr<base::ListValue>)>
diff --git a/components/sync/driver/model_association_manager.cc b/components/sync/driver/model_association_manager.cc
index 81bd4a6..80ce208 100644
--- a/components/sync/driver/model_association_manager.cc
+++ b/components/sync/driver/model_association_manager.cc
@@ -68,7 +68,7 @@
       configure_status_(DataTypeManager::UNKNOWN),
       notified_about_ready_for_configure_(false) {}
 
-ModelAssociationManager::~ModelAssociationManager() {}
+ModelAssociationManager::~ModelAssociationManager() = default;
 
 void ModelAssociationManager::Initialize(ModelTypeSet desired_types,
                                          ModelTypeSet preferred_types,
@@ -185,8 +185,7 @@
 
 void ModelAssociationManager::LoadEnabledTypes() {
   // Load in kStartOrder.
-  for (size_t i = 0; i < base::size(kStartOrder); i++) {
-    ModelType type = kStartOrder[i];
+  for (ModelType type : kStartOrder) {
     if (!desired_types_.Has(type))
       continue;
 
@@ -203,6 +202,7 @@
                               weak_ptr_factory_.GetWeakPtr()));
     }
   }
+  // It's possible that all models are already loaded.
   NotifyDelegateIfReadyForConfigure();
 }
 
@@ -233,9 +233,8 @@
                base::BindOnce(&ModelAssociationManager::ModelAssociationDone,
                               weak_ptr_factory_.GetWeakPtr(), INITIALIZED));
 
-  // Start association of types that are loaded in specified order.
-  for (size_t i = 0; i < base::size(kStartOrder); i++) {
-    ModelType type = kStartOrder[i];
+  // Associate types that are already loaded in specified order.
+  for (ModelType type : kStartOrder) {
     if (!associating_types_.Has(type) || !loaded_types_.Has(type))
       continue;
 
@@ -243,7 +242,7 @@
     TRACE_EVENT_ASYNC_BEGIN1("sync", "ModelAssociation", dtc, "DataType",
                              ModelTypeToString(type));
 
-    TypeStartCallback(type);
+    MarkDataTypeAssociationDone(type);
   }
 }
 
@@ -310,26 +309,26 @@
     // MODEL_LOADED.
     // TODO(pavely): Add test for this scenario in DataTypeManagerImpl
     // unittests.
+    // TODO(crbug.com/647505): The above sounds quite broken (will
+    // MarkDataTypeAssociationDone never get called in that case?!), and also
+    // outdated (StartAssociating doesn't exist anymore). Can we just move the
+    // NotifyDelegateIfReadyForConfigure call below?
     if (dtc->state() == DataTypeController::MODEL_LOADED) {
-      TypeStartCallback(type);
+      MarkDataTypeAssociationDone(type);
     }
   }
 }
 
-void ModelAssociationManager::TypeStartCallback(ModelType type) {
-  // This happens for example if a type disables itself after initial
-  // configuration.
-  if (!desired_types_.Has(type)) {
-    // It's possible all types failed to associate, in which case association
-    // is complete.
-    if (state_ == ASSOCIATING && associating_types_.Empty())
-      ModelAssociationDone(INITIALIZED);
-    return;
-  }
-
+void ModelAssociationManager::MarkDataTypeAssociationDone(ModelType type) {
+  DCHECK(desired_types_.Has(type));
+  DCHECK(associating_types_.Has(type));
+  DCHECK(loaded_types_.Has(type));
   DCHECK(!associated_types_.Has(type));
+
   associated_types_.Put(type);
 
+  // TODO(crbug.com/647505): Should we check this *before* adding the type to
+  // |associated_types_|?
   if (state_ != ASSOCIATING)
     return;
 
@@ -339,11 +338,8 @@
 
   // Track the merge results if we succeeded or an association failure
   // occurred.
-  if (ProtocolTypes().Has(type)) {
-    // TODO(crbug.com/647505): Clean up.
-    DataTypeAssociationStats stats;
-    delegate_->OnSingleDataTypeAssociationDone(type, stats);
-  }
+  if (ProtocolTypes().Has(type))
+    delegate_->OnSingleDataTypeAssociationDone(type);
 
   associating_types_.Remove(type);
 
diff --git a/components/sync/driver/model_association_manager.h b/components/sync/driver/model_association_manager.h
index 5899c6f8..85f5dda 100644
--- a/components/sync/driver/model_association_manager.h
+++ b/components/sync/driver/model_association_manager.h
@@ -15,7 +15,6 @@
 #include "components/sync/driver/configure_context.h"
 #include "components/sync/driver/data_type_controller.h"
 #include "components/sync/driver/data_type_manager.h"
-#include "components/sync/engine/data_type_association_stats.h"
 #include "components/sync/engine/shutdown_reason.h"
 
 namespace syncer {
@@ -45,9 +44,7 @@
 
   // Called when model association (MergeDataAndStartSyncing) has completed
   // for |type|, regardless of success or failure.
-  virtual void OnSingleDataTypeAssociationDone(
-      ModelType type,
-      const DataTypeAssociationStats& association_stats) = 0;
+  virtual void OnSingleDataTypeAssociationDone(ModelType type) = 0;
 
   // Called when the ModelAssociationManager has decided it must stop |type|,
   // likely because it is no longer a desired data type or sync is shutting
@@ -107,10 +104,6 @@
                     ShutdownReason shutdown_reason,
                     SyncError error);
 
-  // This is used for TESTING PURPOSE ONLY. The test case can inspect
-  // and modify the timer.
-  // TODO(sync) : This would go away if we made this class be able to do
-  // Dependency injection. crbug.com/129212.
   base::OneShotTimer* GetTimerForTesting();
 
   State state() const { return state_; }
@@ -123,8 +116,7 @@
   // will be passed to |LoadModels| function.
   void ModelLoadCallback(ModelType type, const SyncError& error);
 
-  // TODO(crbug.com/647505): Consider removing or renaming this function.
-  void TypeStartCallback(ModelType type);
+  void MarkDataTypeAssociationDone(ModelType type);
 
   // Called when all requested types are associated or association times out.
   // Will clean up any unfinished types, and update |state_| to be |new_state|
diff --git a/components/sync/driver/model_association_manager_unittest.cc b/components/sync/driver/model_association_manager_unittest.cc
index b9adf4e..fb0f0ef 100644
--- a/components/sync/driver/model_association_manager_unittest.cc
+++ b/components/sync/driver/model_association_manager_unittest.cc
@@ -35,9 +35,7 @@
   MockModelAssociationManagerDelegate() {}
   ~MockModelAssociationManagerDelegate() override {}
   MOCK_METHOD0(OnAllDataTypesReadyForConfigure, void());
-  MOCK_METHOD2(OnSingleDataTypeAssociationDone,
-               void(ModelType type,
-                    const DataTypeAssociationStats& association_stats));
+  MOCK_METHOD1(OnSingleDataTypeAssociationDone, void(ModelType type));
   MOCK_METHOD2(OnSingleDataTypeWillStop,
                void(ModelType, const SyncError& error));
   MOCK_METHOD1(OnModelAssociationDone,
@@ -400,8 +398,8 @@
   ModelTypeSet desired_types = preferred_types;
 
   EXPECT_CALL(delegate_, OnAllDataTypesReadyForConfigure());
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS, _));
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS, _));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS));
   EXPECT_CALL(delegate_, OnModelAssociationDone(MatchesResult(
                              DataTypeManager::OK, desired_types)));
 
@@ -440,8 +438,8 @@
   ModelTypeSet desired_types = preferred_types;
 
   EXPECT_CALL(delegate_, OnAllDataTypesReadyForConfigure());
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS, _));
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS, _));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS));
   EXPECT_CALL(delegate_, OnModelAssociationDone(MatchesResult(
                              DataTypeManager::OK, desired_types)));
 
@@ -487,8 +485,8 @@
   configure_context.cache_guid = "test_cache_guid";
 
   EXPECT_CALL(delegate_, OnAllDataTypesReadyForConfigure());
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS, _));
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS, _));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS));
   EXPECT_CALL(delegate_, OnModelAssociationDone(MatchesResult(
                              DataTypeManager::OK, desired_types)));
 
@@ -510,7 +508,7 @@
   EXPECT_CALL(delegate_, OnSingleDataTypeWillStop(APPS, _));
   EXPECT_CALL(delegate_, OnSingleDataTypeWillStop(BOOKMARKS, _));
   EXPECT_CALL(delegate_, OnAllDataTypesReadyForConfigure());
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS, _));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS));
   EXPECT_CALL(delegate_, OnModelAssociationDone(MatchesResult(
                              DataTypeManager::OK, desired_types)));
 
@@ -543,8 +541,8 @@
   configure_context.cache_guid = "test_cache_guid";
 
   EXPECT_CALL(delegate_, OnAllDataTypesReadyForConfigure());
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS, _));
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS, _));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(APPS));
   EXPECT_CALL(delegate_, OnModelAssociationDone(MatchesResult(
                              DataTypeManager::OK, desired_types)));
 
@@ -566,7 +564,7 @@
   EXPECT_CALL(delegate_, OnSingleDataTypeWillStop(APPS, _));
   EXPECT_CALL(delegate_, OnSingleDataTypeWillStop(BOOKMARKS, _));
   EXPECT_CALL(delegate_, OnAllDataTypesReadyForConfigure());
-  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS, _));
+  EXPECT_CALL(delegate_, OnSingleDataTypeAssociationDone(BOOKMARKS));
   EXPECT_CALL(delegate_, OnModelAssociationDone(MatchesResult(
                              DataTypeManager::OK, desired_types)));
 
diff --git a/components/sync/driver/model_type_controller.cc b/components/sync/driver/model_type_controller.cc
index b7a24bf..15939731 100644
--- a/components/sync/driver/model_type_controller.cc
+++ b/components/sync/driver/model_type_controller.cc
@@ -61,7 +61,7 @@
                           std::move(delegate_for_transport_mode));
 }
 
-ModelTypeController::~ModelTypeController() {}
+ModelTypeController::~ModelTypeController() = default;
 
 void ModelTypeController::InitModelTypeController(
     std::unique_ptr<ModelTypeControllerDelegate> delegate_for_full_sync_mode,
@@ -82,7 +82,6 @@
   DCHECK_EQ(MODEL_LOADED, state_);
   DCHECK(activation_response_);
   state_ = RUNNING;
-  activated_ = true;  // Not relevant, but for consistency.
   return std::move(activation_response_);
 }
 
diff --git a/components/sync/driver/model_type_controller.h b/components/sync/driver/model_type_controller.h
index 77f126e..3d8ff8de 100644
--- a/components/sync/driver/model_type_controller.h
+++ b/components/sync/driver/model_type_controller.h
@@ -106,12 +106,6 @@
   // ActivateDataType is called.
   std::unique_ptr<DataTypeActivationResponse> activation_response_;
 
-  // This is a hack to prevent reconfigurations from crashing, because USS
-  // activation is not idempotent. RegisterWithBackend only needs to actually do
-  // something the first time after the type is enabled.
-  // TODO(crbug.com/647505): Remove this once the DTM handles things better.
-  bool activated_ = false;
-
   DISALLOW_COPY_AND_ASSIGN(ModelTypeController);
 };
 
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 82ec68f..6cfdad09 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -28,7 +28,6 @@
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/primary_account_mutator.h"
-#include "components/sync/base/bind_to_task_runner.h"
 #include "components/sync/base/legacy_directory_deletion.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/stop_source.h"
@@ -40,7 +39,6 @@
 #include "components/sync/driver/sync_auth_manager.h"
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_type_preference_provider.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 #include "components/sync/engine/engine_components_factory_impl.h"
 #include "components/sync/engine/net/http_bridge.h"
 #include "components/sync/engine/net/http_post_provider_factory.h"
@@ -237,9 +235,6 @@
                               base::Unretained(this)),
           &sync_prefs_,
           sync_client_->GetTrustedVaultClient()),
-      backend_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
-          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
-           base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
       network_time_update_callback_(
           std::move(init_params.network_time_update_callback)),
       url_loader_factory_(std::move(init_params.url_loader_factory)),
@@ -477,30 +472,6 @@
     observer.OnProtocolEvent(event);
 }
 
-void ProfileSyncService::OnDirectoryTypeCommitCounterUpdated(
-    ModelType type,
-    const CommitCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (auto& observer : type_debug_info_observers_)
-    observer.OnCommitCountersUpdated(type, counters);
-}
-
-void ProfileSyncService::OnDirectoryTypeUpdateCounterUpdated(
-    ModelType type,
-    const UpdateCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (auto& observer : type_debug_info_observers_)
-    observer.OnUpdateCountersUpdated(type, counters);
-}
-
-void ProfileSyncService::OnDatatypeStatusCounterUpdated(
-    ModelType type,
-    const StatusCounters& counters) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (auto& observer : type_debug_info_observers_)
-    observer.OnStatusCountersUpdated(type, counters);
-}
-
 void ProfileSyncService::OnDataTypeRequestsSyncStartup(ModelType type) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(UserTypes().Has(type));
@@ -580,7 +551,6 @@
   }
 
   SyncEngine::InitParams params;
-  params.sync_task_runner = backend_task_runner_;
   params.host = this;
   params.registrar = std::make_unique<SyncBackendRegistrar>(
       debug_identifier_,
@@ -663,8 +633,10 @@
       // certain codepaths such as the user being signed out). To avoid that,
       // SyncPrefs is used to determine whether it's worth it.
       if (!sync_prefs_.GetCacheGuid().empty()) {
-        backend_task_runner_->PostTask(
+        base::ThreadPool::PostTask(
             FROM_HERE,
+            {base::TaskPriority::USER_VISIBLE, base::MayBlock(),
+             base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
             base::BindOnce(&DeleteLegacyDirectoryFilesAndNigoriStorage,
                            sync_client_->GetSyncDataPath()));
       }
@@ -947,10 +919,6 @@
     engine_->RequestBufferedProtocolEventsAndEnableForwarding();
   }
 
-  if (type_debug_info_observers_.might_have_observers()) {
-    engine_->EnableDirectoryTypeDebugInfoForwarding();
-  }
-
   if (is_first_time_sync_configure_) {
     UpdateLastSyncedTime();
   }
@@ -1556,15 +1524,6 @@
     if (dtc_iter != data_type_controllers_.end()) {
       type_status->SetString("state", DataTypeController::StateToString(
                                           dtc_iter->second->state()));
-      if (dtc_iter->second->state() != DataTypeController::NOT_RUNNING) {
-        // We use BindToCurrentSequence() to make sure observers (i.e.
-        // |type_debug_info_observers_|) are not notified synchronously, which
-        // the UI code (chrome://sync-internals) doesn't handle well.
-        dtc_iter->second->GetStatusCounters(
-            BindToCurrentSequence(base::BindRepeating(
-                &ProfileSyncService::OnDatatypeStatusCounterUpdated,
-                base::Unretained(this))));
-      }
     }
 
     result->Append(std::move(type_status));
@@ -1683,26 +1642,6 @@
   }
 }
 
-void ProfileSyncService::AddTypeDebugInfoObserver(
-    TypeDebugInfoObserver* type_debug_info_observer) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  type_debug_info_observers_.AddObserver(type_debug_info_observer);
-  if (type_debug_info_observers_.might_have_observers() && engine_ &&
-      engine_->IsInitialized()) {
-    engine_->EnableDirectoryTypeDebugInfoForwarding();
-  }
-}
-
-void ProfileSyncService::RemoveTypeDebugInfoObserver(
-    TypeDebugInfoObserver* type_debug_info_observer) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  type_debug_info_observers_.RemoveObserver(type_debug_info_observer);
-  if (!type_debug_info_observers_.might_have_observers() && engine_ &&
-      engine_->IsInitialized()) {
-    engine_->DisableDirectoryTypeDebugInfoForwarding();
-  }
-}
-
 namespace {
 
 class GetAllNodesRequestHelper
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/profile_sync_service.h
index df08bad..a7f562f 100644
--- a/components/sync/driver/profile_sync_service.h
+++ b/components/sync/driver/profile_sync_service.h
@@ -56,10 +56,6 @@
 
 class BackendMigrator;
 class SyncAuthManager;
-class TypeDebugInfoObserver;
-struct CommitCounters;
-struct StatusCounters;
-struct UpdateCounters;
 
 // Look at the SyncService interface for information on how to use this class.
 // You should not need to know about ProfileSyncService directly.
@@ -158,8 +154,6 @@
   base::Location GetUnrecoverableErrorLocationForDebugging() const override;
   void AddProtocolEventObserver(ProtocolEventObserver* observer) override;
   void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override;
-  void AddTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override;
-  void RemoveTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override;
   base::WeakPtr<JsController> GetJsController() override;
   void GetAllNodesForDebugging(
       base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback)
@@ -175,14 +169,6 @@
       bool success) override;
   void OnSyncCycleCompleted(const SyncCycleSnapshot& snapshot) override;
   void OnProtocolEvent(const ProtocolEvent& event) override;
-  void OnDirectoryTypeCommitCounterUpdated(
-      ModelType type,
-      const CommitCounters& counters) override;
-  void OnDirectoryTypeUpdateCounterUpdated(
-      ModelType type,
-      const UpdateCounters& counters) override;
-  void OnDatatypeStatusCounterUpdated(ModelType type,
-                                      const StatusCounters& counters) override;
   void OnConnectionStatusChange(ConnectionStatus status) override;
   void OnMigrationNeededForTypes(ModelTypeSet types) override;
   void OnActionableError(const SyncProtocolError& error) override;
@@ -411,9 +397,6 @@
   // A utility object containing logic and state relating to encryption.
   SyncServiceCrypto crypto_;
 
-  // TODO(crbug.com/923287): Move out of this class. Possibly to SyncEngineImpl.
-  scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
-
   // Our asynchronous engine to communicate with sync components living on
   // other threads.
   std::unique_ptr<SyncEngine> engine_;
@@ -459,8 +442,6 @@
   base::ObserverList<SyncServiceObserver>::Unchecked observers_;
   base::ObserverList<ProtocolEventObserver>::Unchecked
       protocol_event_observers_;
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked
-      type_debug_info_observers_;
 
   SyncJsController sync_js_controller_;
 
diff --git a/components/sync/driver/resources.grd b/components/sync/driver/resources.grd
index 5d4ca02..2e0366e 100644
--- a/components/sync/driver/resources.grd
+++ b/components/sync/driver/resources.grd
@@ -13,7 +13,6 @@
       <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_HTML" file="resources/index.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS" file="resources/sync_index.js" type="BINDATA" />
       <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_CHROME_SYNC_JS" file="resources/chrome_sync.js" type="BINDATA" />
-      <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_TYPES_JS" file="resources/types.js" type="BINDATA" />
       <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_LOG_JS" file="resources/sync_log.js" type="BINDATA" />
       <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_NODE_BROWSER_JS" file="resources/sync_node_browser.js" type="BINDATA" />
       <include name="IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_SEARCH_JS" file="resources/sync_search.js" type="BINDATA" />
diff --git a/components/sync/driver/resources/BUILD.gn b/components/sync/driver/resources/BUILD.gn
index ce9d0b4..4059f54 100644
--- a/components/sync/driver/resources/BUILD.gn
+++ b/components/sync/driver/resources/BUILD.gn
@@ -20,8 +20,6 @@
     #":sync_node_browser",
     #":sync_search",
     ":traffic_log",
-
-    #":types",
     ":user_events",
   ]
 }
@@ -90,10 +88,6 @@
   deps = [ "//ui/webui/resources/js:cr" ]
 }
 
-js_library("types") {
-  deps = [ "//ui/webui/resources/js:cr" ]
-}
-
 js_library("user_events") {
   deps = [
     "//ui/webui/resources/js:cr",
diff --git a/components/sync/driver/resources/about.js b/components/sync/driver/resources/about.js
index 20cf9c0..b7f9da6 100644
--- a/components/sync/driver/resources/about.js
+++ b/components/sync/driver/resources/about.js
@@ -32,29 +32,6 @@
     refreshAboutInfo(e.details);
   }
 
-  function onAboutInfoCountersUpdated(e) {
-    const details = e.details;
-
-    const modelType = details.modelType;
-    const counters = details.counters;
-
-    const typeStatusArray = chrome.sync.aboutInfo.type_status;
-    typeStatusArray.forEach(function(row) {
-      if (row.name === modelType) {
-        // There are three types of counters, only "status" counters have these
-        // fields. Keep the old values if updated fields are not present.
-        if (counters.numEntriesAndTombstones !== undefined) {
-          row.num_entries = counters.numEntriesAndTombstones;
-        }
-        if (counters.numEntries !== undefined) {
-          row.num_live = counters.numEntries;
-        }
-      }
-    });
-    jstProcess(
-        new JsEvalContext({type_status: typeStatusArray}), $('typeInfo'));
-  }
-
   /**
    * Helper to determine if an element is scrolled to its bottom limit.
    * @param {Element} elem element to check
@@ -177,10 +154,6 @@
           'onAboutInfoUpdated',
           onAboutInfoUpdatedEvent);
 
-      chrome.sync.events.removeEventListener(
-          'onCountersUpdated',
-          onAboutInfoCountersUpdated);
-
       const aboutInfo = JSON.parse(data);
       refreshAboutInfo(aboutInfo);
     });
@@ -219,10 +192,6 @@
         'onAboutInfoUpdated',
         onAboutInfoUpdatedEvent);
 
-    chrome.sync.events.addEventListener(
-        'onCountersUpdated',
-        onAboutInfoCountersUpdated);
-
     $('request-start').addEventListener('click', function(event) {
       chrome.sync.requestStart();
     });
diff --git a/components/sync/driver/resources/chrome_sync.js b/components/sync/driver/resources/chrome_sync.js
index 4ad2a35..0c60f10 100644
--- a/components/sync/driver/resources/chrome_sync.js
+++ b/components/sync/driver/resources/chrome_sync.js
@@ -50,14 +50,6 @@
   }
 
   /**
-   * Registers to receive a stream of status counter update events
-   * chrome.sync.dispatchEvent().
-   */
-  function registerForPerTypeCounters() {
-    chrome.send('registerForPerTypeCounters');
-  }
-
-  /**
    * Asks the browser to refresh our snapshot of sync state. Should result
    * in an onAboutInfoUpdated event being emitted.
    */
@@ -185,7 +177,6 @@
     getAllNodes: getAllNodes,
     getAllNodesCallback: getAllNodesCallback,
     registerForEvents: registerForEvents,
-    registerForPerTypeCounters: registerForPerTypeCounters,
     requestUpdatedAboutInfo: requestUpdatedAboutInfo,
     requestIncludeSpecificsInitialState: requestIncludeSpecificsInitialState,
     requestListOfTypes: requestListOfTypes,
diff --git a/components/sync/driver/resources/index.html b/components/sync/driver/resources/index.html
index eb06cf8..1f01aa2 100644
--- a/components/sync/driver/resources/index.html
+++ b/components/sync/driver/resources/index.html
@@ -11,7 +11,6 @@
 <link rel="stylesheet" href="chrome://resources/css/tree.css">
 <link rel="stylesheet" href="about.css">
 <link rel="stylesheet" href="events.css">
-<link rel="stylesheet" href="types.css">
 <link rel="stylesheet" href="sync_search.css">
 <link rel="stylesheet" href="sync_node_browser.css">
 <link rel="stylesheet" href="traffic_log.css">
@@ -41,7 +40,6 @@
 <script src="chrome_sync.js"></script>
 <script src="about.js"></script>
 <script src="events.js"></script>
-<script src="types.js"></script>
 <script src="sync_log.js"></script>
 <script src="sync_node_browser.js"></script>
 <script src="sync_search.js"></script>
@@ -66,7 +64,6 @@
 <tabbox id="sync-page">
   <tabs>
     <tab id="sync-about-tab">About</tab>
-    <tab id="sync-types-tab">Types</tab>
     <tab id="sync-data-tab">Data</tab>
     <tab id="sync-events-tab">Events</tab>
     <tab id="sync-browser-tab">Sync Node Browser</tab>
@@ -79,9 +76,6 @@
       <include src="about.html">
     </tabpanel>
     <tabpanel>
-      <include src="types.html">
-    </tabpanel>
-    <tabpanel>
       <include src="data.html">
     </tabpanel>
     <tabpanel>
diff --git a/components/sync/driver/resources/types.css b/components/sync/driver/resources/types.css
deleted file mode 100644
index 0a67d33..0000000
--- a/components/sync/driver/resources/types.css
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright 2014 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#type-counters-table {
-  table-layout: fixed;
-}
-
-#type-counters-table th {
-  max-width: 80px;
-  width: 80px;
-}
-
-#type-counters-table th.type {
-  max-width: 200px;
-  width: 200px;
-}
-
-#type-counters-table tr:nth-child(odd) {
-  background: rgb(239, 243, 255);
-}
-
diff --git a/components/sync/driver/resources/types.html b/components/sync/driver/resources/types.html
deleted file mode 100644
index 609ecc5..0000000
--- a/components/sync/driver/resources/types.html
+++ /dev/null
@@ -1,60 +0,0 @@
-  <div id="type-counters-container-wrapper" jsskip="true">
-    <div class="section">
-      <h2>Type Counters</h2>
-      <table id="type-counters-table">
-        <thead>
-          <tr>
-            <th class='type' rowspan="2">Type</th>
-            <th rowspan="2">Total Entries</th>
-            <th colspan="8">Updates</th>
-            <th colspan="7">Commits</th>
-          </tr>
-          <tr>
-            <th>Updates Received</th>
-            <th>Reflected Updates Received</th>
-            <th>Tombstone Updates Received</th>
-
-            <th>Updates Applied</th>
-            <th>Hierarchy Conflict Application Failures</th>
-            <th>Encryption Conflict Application Failures</th>
-
-            <th>Server Overwrite Conflicts</th>
-            <th>Local Overwrite Conflicts</th>
-
-            <th>Creation Commit Attempts</th>
-            <th>Deletion Commit Attempts</th>
-            <th>Update Commit Attempts</th>
-            <th>All Commit Attempts</th>
-            <th>Commit Successes</th>
-            <th>Commit Conflicts</th>
-            <th>Commit Errors</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr jsselect="rows">
-            <td jscontent="type"></td>
-            <td jscontent="counters.numEntries || 0">0</td>
-
-            <td jscontent="counters.numUpdatesReceived || 0">0</td>
-            <td jscontent="counters.numReflectedUpdatesReceived || 0">0</td>
-            <td jscontent="counters.numTombstoneUpdatesReceived || 0">0</td>
-
-            <td jscontent="counters.numUpdatesApplied || 0">0</td>
-            <td jscontent="counters.numHierarchyConflictApplicationFailures || 0">0</td>
-            <td jscontent="counters.numEncryptionConflictApplicationFailures || 0">0</td>
-
-            <td jscontent="counters.numServerOverwrites || 0">0</td>
-            <td jscontent="counters.numLocalOverwrites || 0">0</td>
-
-            <td jscontent="counters.numCreationCommitsAttempted || 0">0</td>
-            <td jscontent="counters.numDeletionCommitsAttempted || 0">0</td>
-            <td jscontent="counters.numUpdateCommitsAttempted || 0">0</td>
-            <td jscontent="counters.numCommitsAttempted || 0">0</td>
-            <td jscontent="counters.numCommitsSuccess || 0">0</td>
-            <td jscontent="counters.numCommitsConflict || 0">0</td>
-            <td jscontent="counters.numCommitsError || 0">0</td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
-  </div>
diff --git a/components/sync/driver/resources/types.js b/components/sync/driver/resources/types.js
deleted file mode 100644
index 5bb6e55..0000000
--- a/components/sync/driver/resources/types.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-cr.define('chrome.sync.types', function() {
-  const typeCountersMap = {};
-
-  /**
-   * Redraws the counters table taking advantage of the most recent
-   * available information.
-   *
-   * Makes use of typeCountersMap, which is defined in the containing scope.
-   */
-  function refreshTypeCountersDisplay() {
-    const typeCountersArray = [];
-
-    // Transform our map into an array to make jstemplate happy.
-    Object.keys(typeCountersMap).sort().forEach(function(t) {
-      typeCountersArray.push({
-        type: t,
-        counters: typeCountersMap[t],
-      });
-    });
-
-    jstProcess(
-        new JsEvalContext({ rows: typeCountersArray }),
-        $('type-counters-table'));
-  }
-
-  /**
-   * Helps to initialize the table by picking up where initTypeCounters() left
-   * off.  That function registers this listener and requests that this event
-   * be emitted.
-   *
-   * @param {!Object} e An event containing the list of known sync types.
-   */
-  function onReceivedListOfTypes(e) {
-    const types = e.details.types;
-    types.map(function(type) {
-      if (!typeCountersMap.hasOwnProperty(type)) {
-        typeCountersMap[type] = {};
-      }
-    });
-    chrome.sync.events.removeEventListener(
-        'onReceivedListOfTypes',
-        onReceivedListOfTypes);
-    refreshTypeCountersDisplay();
-  }
-
-  /**
-   * Callback for receipt of updated per-type counters.
-   *
-   * @param {!Object} e An event containing an updated counter.
-   */
-  function onCountersUpdated(e) {
-    const details = e.details;
-
-    const modelType = details.modelType;
-    const counters = details.counters;
-
-    if (typeCountersMap.hasOwnProperty(modelType)) {
-      for (const k in counters) {
-        typeCountersMap[modelType][k] = counters[k];
-      }
-    }
-    refreshTypeCountersDisplay();
-  }
-
-  /**
-   * Initializes state and callbacks for the per-type counters and status UI.
-   */
-  function initTypeCounters() {
-    chrome.sync.events.addEventListener(
-        'onCountersUpdated',
-        onCountersUpdated);
-    chrome.sync.events.addEventListener(
-        'onReceivedListOfTypes',
-        onReceivedListOfTypes);
-
-    chrome.sync.requestListOfTypes();
-    chrome.sync.registerForPerTypeCounters();
-  }
-
-  function onLoad() {
-    initTypeCounters();
-  }
-
-  return {
-    onLoad: onLoad
-  };
-});
-
-document.addEventListener('DOMContentLoaded', chrome.sync.types.onLoad, false);
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h
index 58118d5..e2d42e0 100644
--- a/components/sync/driver/sync_service.h
+++ b/components/sync/driver/sync_service.h
@@ -31,7 +31,6 @@
 class SyncCycleSnapshot;
 struct SyncTokenStatus;
 class SyncUserSettings;
-class TypeDebugInfoObserver;
 struct SyncStatus;
 
 // UIs that need to prevent Sync startup should hold an instance of this class
@@ -437,9 +436,6 @@
   virtual void AddProtocolEventObserver(ProtocolEventObserver* observer) = 0;
   virtual void RemoveProtocolEventObserver(ProtocolEventObserver* observer) = 0;
 
-  virtual void AddTypeDebugInfoObserver(TypeDebugInfoObserver* observer) = 0;
-  virtual void RemoveTypeDebugInfoObserver(TypeDebugInfoObserver* observer) = 0;
-
   virtual base::WeakPtr<JsController> GetJsController() = 0;
 
   // Asynchronously fetches base::Value representations of all sync nodes and
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc
index 7d3745dd..3170f90 100644
--- a/components/sync/driver/test_sync_service.cc
+++ b/components/sync/driver/test_sync_service.cc
@@ -283,12 +283,6 @@
 void TestSyncService::RemoveProtocolEventObserver(
     ProtocolEventObserver* observer) {}
 
-void TestSyncService::AddTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {}
-
-void TestSyncService::RemoveTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {}
-
 base::WeakPtr<JsController> TestSyncService::GetJsController() {
   return base::WeakPtr<JsController>();
 }
diff --git a/components/sync/driver/test_sync_service.h b/components/sync/driver/test_sync_service.h
index 465e4b84..a754bf2 100644
--- a/components/sync/driver/test_sync_service.h
+++ b/components/sync/driver/test_sync_service.h
@@ -96,8 +96,6 @@
   base::Location GetUnrecoverableErrorLocationForDebugging() const override;
   void AddProtocolEventObserver(ProtocolEventObserver* observer) override;
   void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override;
-  void AddTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override;
-  void RemoveTypeDebugInfoObserver(TypeDebugInfoObserver* observer) override;
   base::WeakPtr<JsController> GetJsController() override;
   void GetAllNodesForDebugging(
       base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback)
diff --git a/components/sync/engine/cycle/type_debug_info_observer.cc b/components/sync/engine/cycle/type_debug_info_observer.cc
deleted file mode 100644
index acfe06e4..0000000
--- a/components/sync/engine/cycle/type_debug_info_observer.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
-
-namespace syncer {
-
-TypeDebugInfoObserver::TypeDebugInfoObserver() {}
-
-TypeDebugInfoObserver::~TypeDebugInfoObserver() {}
-
-}  // namespace syncer
diff --git a/components/sync/engine/cycle/type_debug_info_observer.h b/components/sync/engine/cycle/type_debug_info_observer.h
deleted file mode 100644
index cc6a534..0000000
--- a/components/sync/engine/cycle/type_debug_info_observer.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_ENGINE_CYCLE_TYPE_DEBUG_INFO_OBSERVER_H_
-#define COMPONENTS_SYNC_ENGINE_CYCLE_TYPE_DEBUG_INFO_OBSERVER_H_
-
-#include "components/sync/base/model_type.h"
-
-namespace syncer {
-
-struct CommitCounters;
-struct StatusCounters;
-struct UpdateCounters;
-
-// Interface for classes that observe per-type sync debug counters.
-class TypeDebugInfoObserver {
- public:
-  TypeDebugInfoObserver() = default;
-  virtual ~TypeDebugInfoObserver() = default;
-
-  virtual void OnCommitCountersUpdated(ModelType type,
-                                       const CommitCounters& counters) = 0;
-  virtual void OnUpdateCountersUpdated(ModelType type,
-                                       const UpdateCounters& counters) = 0;
-  virtual void OnStatusCountersUpdated(ModelType type,
-                                       const StatusCounters& counters) = 0;
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_ENGINE_CYCLE_TYPE_DEBUG_INFO_OBSERVER_H_
diff --git a/components/sync/engine/data_type_association_stats.cc b/components/sync/engine/data_type_association_stats.cc
deleted file mode 100644
index 465dc15..0000000
--- a/components/sync/engine/data_type_association_stats.cc
+++ /dev/null
@@ -1,29 +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 "components/sync/engine/data_type_association_stats.h"
-
-namespace syncer {
-
-DataTypeAssociationStats::DataTypeAssociationStats()
-    : num_local_items_before_association(0),
-      num_sync_items_before_association(0),
-      num_local_items_after_association(0),
-      num_sync_items_after_association(0),
-      num_local_items_added(0),
-      num_local_items_deleted(0),
-      num_local_items_modified(0),
-      num_sync_items_added(0),
-      num_sync_items_deleted(0),
-      num_sync_items_modified(0),
-      local_version_pre_association(0),
-      sync_version_pre_association(0),
-      had_error(false) {}
-
-DataTypeAssociationStats::DataTypeAssociationStats(
-    const DataTypeAssociationStats& other) = default;
-
-DataTypeAssociationStats::~DataTypeAssociationStats() {}
-
-}  // namespace syncer
diff --git a/components/sync/engine/data_type_association_stats.h b/components/sync/engine/data_type_association_stats.h
deleted file mode 100644
index a5d9223..0000000
--- a/components/sync/engine/data_type_association_stats.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 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 COMPONENTS_SYNC_ENGINE_DATA_TYPE_ASSOCIATION_STATS_H_
-#define COMPONENTS_SYNC_ENGINE_DATA_TYPE_ASSOCIATION_STATS_H_
-
-#include <stdint.h>
-
-#include "base/time/time.h"
-
-namespace syncer {
-
-// Container for datatype association results.
-struct DataTypeAssociationStats {
-  DataTypeAssociationStats();
-  DataTypeAssociationStats(const DataTypeAssociationStats& other);
-  ~DataTypeAssociationStats();
-
-  // The state of the world before association.
-  int num_local_items_before_association;
-  int num_sync_items_before_association;
-
-  // The state of the world after association.
-  int num_local_items_after_association;
-  int num_sync_items_after_association;
-
-  // The changes that took place during association. In a correctly working
-  // system these should be the deltas between before and after.
-  int num_local_items_added;
-  int num_local_items_deleted;
-  int num_local_items_modified;
-  int num_sync_items_added;
-  int num_sync_items_deleted;
-  int num_sync_items_modified;
-
-  // Model versions before association.
-  int64_t local_version_pre_association;
-  int64_t sync_version_pre_association;
-
-  // Whether a datatype unrecoverable error was encountered during association.
-  bool had_error;
-
-  // Waiting time within association manager for loading local models and
-  // associating other types.
-  base::TimeDelta association_wait_time;
-
-  // Time spent on association.
-  base::TimeDelta association_time;
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_ENGINE_DATA_TYPE_ASSOCIATION_STATS_H_
diff --git a/components/sync/engine/data_type_debug_info_listener.h b/components/sync/engine/data_type_debug_info_listener.h
index 881f4fb..fa58dc8 100644
--- a/components/sync/engine/data_type_debug_info_listener.h
+++ b/components/sync/engine/data_type_debug_info_listener.h
@@ -7,8 +7,8 @@
 
 #include <vector>
 
+#include "base/time/time.h"
 #include "components/sync/base/model_type.h"
-#include "components/sync/engine/data_type_association_stats.h"
 
 namespace syncer {
 
@@ -33,9 +33,6 @@
   // Types configured before this type.
   ModelTypeSet high_priority_types_configured_before;
   ModelTypeSet same_priority_types_configured_before;
-
-  // Association stats.
-  DataTypeAssociationStats association_stats;
 };
 
 // Interface for the sync internals to listen to external sync events.
diff --git a/components/sync/engine/fake_sync_engine.cc b/components/sync/engine/fake_sync_engine.cc
index 7d8ab83..6a053d4b 100644
--- a/components/sync/engine/fake_sync_engine.cc
+++ b/components/sync/engine/fake_sync_engine.cc
@@ -81,10 +81,6 @@
 
 void FakeSyncEngine::DisableProtocolEventForwarding() {}
 
-void FakeSyncEngine::EnableDirectoryTypeDebugInfoForwarding() {}
-
-void FakeSyncEngine::DisableDirectoryTypeDebugInfoForwarding() {}
-
 void FakeSyncEngine::set_fail_initial_download(bool should_fail) {
   fail_initial_download_ = should_fail;
 }
diff --git a/components/sync/engine/fake_sync_engine.h b/components/sync/engine/fake_sync_engine.h
index 162837c..53de1e8 100644
--- a/components/sync/engine/fake_sync_engine.h
+++ b/components/sync/engine/fake_sync_engine.h
@@ -78,9 +78,6 @@
   void RequestBufferedProtocolEventsAndEnableForwarding() override;
   void DisableProtocolEventForwarding() override;
 
-  void EnableDirectoryTypeDebugInfoForwarding() override;
-  void DisableDirectoryTypeDebugInfoForwarding() override;
-
   void OnCookieJarChanged(bool account_mismatch,
                           bool empty_jar,
                           base::OnceClosure callback) override;
diff --git a/components/sync/engine/fake_sync_manager.cc b/components/sync/engine/fake_sync_manager.cc
index 70cf88e..629bca5 100644
--- a/components/sync/engine/fake_sync_manager.cc
+++ b/components/sync/engine/fake_sync_manager.cc
@@ -168,19 +168,6 @@
   last_refresh_request_types_ = types;
 }
 
-void FakeSyncManager::RegisterDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {}
-
-void FakeSyncManager::UnregisterDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {}
-
-bool FakeSyncManager::HasDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {
-  return false;
-}
-
-void FakeSyncManager::RequestEmitDebugInfo() {}
-
 void FakeSyncManager::OnIncomingInvalidation(
     ModelType type,
     std::unique_ptr<InvalidationInterface> invalidation) {
diff --git a/components/sync/engine/fake_sync_manager.h b/components/sync/engine/fake_sync_manager.h
index 744ad1a..42ec5e2f 100644
--- a/components/sync/engine/fake_sync_manager.h
+++ b/components/sync/engine/fake_sync_manager.h
@@ -94,13 +94,6 @@
   std::vector<std::unique_ptr<ProtocolEvent>> GetBufferedProtocolEvents()
       override;
   void RefreshTypes(ModelTypeSet types) override;
-  void RegisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) override;
-  void UnregisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) override;
-  bool HasDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) override;
-  void RequestEmitDebugInfo() override;
   void OnCookieJarChanged(bool account_mismatch, bool empty_jar) override;
   void UpdateInvalidationClientId(const std::string&) override;
 
diff --git a/components/sync/engine/mock_sync_engine.h b/components/sync/engine/mock_sync_engine.h
index d925afee..91d4b5d 100644
--- a/components/sync/engine/mock_sync_engine.h
+++ b/components/sync/engine/mock_sync_engine.h
@@ -54,8 +54,6 @@
   MOCK_CONST_METHOD1(GetModelSafeRoutingInfo, void(ModelSafeRoutingInfo*));
   MOCK_METHOD0(RequestBufferedProtocolEventsAndEnableForwarding, void());
   MOCK_METHOD0(DisableProtocolEventForwarding, void());
-  MOCK_METHOD0(EnableDirectoryTypeDebugInfoForwarding, void());
-  MOCK_METHOD0(DisableDirectoryTypeDebugInfoForwarding, void());
   MOCK_METHOD1(ClearServerData, void(base::OnceClosure));
   MOCK_METHOD3(OnCookieJarChanged, void(bool, bool, base::OnceClosure));
   MOCK_METHOD1(SetInvalidationsForSessionsEnabled, void(bool));
diff --git a/components/sync/engine/sync_engine.h b/components/sync/engine/sync_engine.h
index b2b5355..1bb9ec1 100644
--- a/components/sync/engine/sync_engine.h
+++ b/components/sync/engine/sync_engine.h
@@ -15,7 +15,6 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "components/sync/base/extensions_activity.h"
 #include "components/sync/base/model_type.h"
@@ -51,7 +50,6 @@
     InitParams(InitParams&& other);
     ~InitParams();
 
-    scoped_refptr<base::SequencedTaskRunner> sync_task_runner;
     SyncEngineHost* host = nullptr;
     std::unique_ptr<SyncBackendRegistrar> registrar;
     std::unique_ptr<SyncEncryptionHandler::Observer> encryption_observer_proxy;
@@ -169,14 +167,6 @@
   // Disables protocol event forwarding.
   virtual void DisableProtocolEventForwarding() = 0;
 
-  // Enables the sending of directory type debug counters.  Also, for every
-  // time it is called, it makes an explicit request that updates to an update
-  // for all counters be emitted.
-  virtual void EnableDirectoryTypeDebugInfoForwarding() = 0;
-
-  // Disables the sending of directory type debug counters.
-  virtual void DisableDirectoryTypeDebugInfoForwarding() = 0;
-
   // Notify the syncer that the cookie jar has changed.
   // See SyncManager::OnCookieJarChanged.
   virtual void OnCookieJarChanged(bool account_mismatch,
diff --git a/components/sync/engine/sync_engine_host.h b/components/sync/engine/sync_engine_host.h
index 6e1980fd..2e18fa5 100644
--- a/components/sync/engine/sync_engine_host.h
+++ b/components/sync/engine/sync_engine_host.h
@@ -18,9 +18,6 @@
 class DataTypeDebugInfoListener;
 class JsBackend;
 class ProtocolEvent;
-struct CommitCounters;
-struct StatusCounters;
-struct UpdateCounters;
 
 // SyncEngineHost is the interface used by SyncEngine to communicate with the
 // entity that created it. It's essentially an observer interface except the
@@ -55,30 +52,6 @@
   // is listening for it.
   virtual void OnProtocolEvent(const ProtocolEvent& event) = 0;
 
-  // Called when we receive an updated commit counter for a directory type.
-  //
-  // Disabled by default.  Enable by calling
-  // EnableDirectoryTypeDebugInfoForwarding() on the engine.
-  virtual void OnDirectoryTypeCommitCounterUpdated(
-      ModelType type,
-      const CommitCounters& counters) = 0;
-
-  // Called when we receive an updated update counter for a directory type.
-  //
-  // Disabled by default.  Enable by calling
-  // EnableDirectoryTypeDebugInfoForwarding() on the engine.
-  virtual void OnDirectoryTypeUpdateCounterUpdated(
-      ModelType type,
-      const UpdateCounters& counters) = 0;
-
-  // Called when we receive an updated status counter for a datatype.
-  //
-  // Disabled by default.  Enable by calling
-  // EnableDirectoryTypeDebugInfoForwarding() on the engine.
-  virtual void OnDatatypeStatusCounterUpdated(
-      ModelType type,
-      const StatusCounters& counters) = 0;
-
   // The status of the connection to the sync server has changed.
   virtual void OnConnectionStatusChange(ConnectionStatus status) = 0;
 
diff --git a/components/sync/engine/sync_engine_host_stub.cc b/components/sync/engine/sync_engine_host_stub.cc
index a4e7e4a4e..d572b90 100644
--- a/components/sync/engine/sync_engine_host_stub.cc
+++ b/components/sync/engine/sync_engine_host_stub.cc
@@ -22,18 +22,6 @@
 
 void SyncEngineHostStub::OnProtocolEvent(const ProtocolEvent& event) {}
 
-void SyncEngineHostStub::OnDirectoryTypeCommitCounterUpdated(
-    ModelType type,
-    const CommitCounters& counters) {}
-
-void SyncEngineHostStub::OnDirectoryTypeUpdateCounterUpdated(
-    ModelType type,
-    const UpdateCounters& counters) {}
-
-void SyncEngineHostStub::OnDatatypeStatusCounterUpdated(
-    ModelType type,
-    const StatusCounters& counters) {}
-
 void SyncEngineHostStub::OnConnectionStatusChange(ConnectionStatus status) {}
 
 void SyncEngineHostStub::OnMigrationNeededForTypes(ModelTypeSet types) {}
diff --git a/components/sync/engine/sync_engine_host_stub.h b/components/sync/engine/sync_engine_host_stub.h
index 4dde90d5..c07206f 100644
--- a/components/sync/engine/sync_engine_host_stub.h
+++ b/components/sync/engine/sync_engine_host_stub.h
@@ -26,14 +26,6 @@
       bool success) override;
   void OnSyncCycleCompleted(const SyncCycleSnapshot& snapshot) override;
   void OnProtocolEvent(const ProtocolEvent& event) override;
-  void OnDirectoryTypeCommitCounterUpdated(
-      ModelType type,
-      const CommitCounters& counters) override;
-  void OnDirectoryTypeUpdateCounterUpdated(
-      ModelType type,
-      const UpdateCounters& counters) override;
-  void OnDatatypeStatusCounterUpdated(ModelType type,
-                                      const StatusCounters& counters) override;
   void OnConnectionStatusChange(ConnectionStatus status) override;
   void OnMigrationNeededForTypes(ModelTypeSet types) override;
   void OnActionableError(const SyncProtocolError& error) override;
diff --git a/components/sync/engine/sync_manager.h b/components/sync/engine/sync_manager.h
index c41a9df..ae07908 100644
--- a/components/sync/engine/sync_manager.h
+++ b/components/sync/engine/sync_manager.h
@@ -44,7 +44,6 @@
 class ProtocolEvent;
 class SyncCycleSnapshot;
 class SyncStatusObserver;
-class TypeDebugInfoObserver;
 
 // Unless stated otherwise, all methods of SyncManager should be called on the
 // same thread.
@@ -235,19 +234,6 @@
   virtual std::vector<std::unique_ptr<ProtocolEvent>>
   GetBufferedProtocolEvents() = 0;
 
-  // Functions to manage registrations of DebugInfoObservers.
-  // TODO(crbug.com/923287): Delete because they no longer make any difference.
-  virtual void RegisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) = 0;
-  virtual void UnregisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) = 0;
-  virtual bool HasDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) = 0;
-
-  // Request that all current counter values be emitted as though they had just
-  // been updated.  Useful for initializing new observers' state.
-  virtual void RequestEmitDebugInfo() = 0;
-
   // Updates Sync's tracking of whether the cookie jar has a mismatch with the
   // chrome account. See ClientConfigParams proto message for more info.
   // Note: this does not trigger a sync cycle. It just updates the sync context.
diff --git a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc
index 4a5389fa..1379dce 100644
--- a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc
+++ b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc
@@ -7,7 +7,6 @@
 #include <string>
 
 #include "base/metrics/histogram.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 
 namespace syncer {
 
@@ -55,11 +54,8 @@
 
 }  // namespace
 
-DataTypeDebugInfoEmitter::DataTypeDebugInfoEmitter(ModelType type,
-                                                   ObserverListType* observers)
-    : type_(type),
-      type_debug_info_observers_(observers),
-      histogram_(GetModelTypeEntityChangeHistogram(type)) {
+DataTypeDebugInfoEmitter::DataTypeDebugInfoEmitter(ModelType type)
+    : type_(type), histogram_(GetModelTypeEntityChangeHistogram(type)) {
   DCHECK(histogram_);
 }
 
@@ -74,9 +70,6 @@
 }
 
 void DataTypeDebugInfoEmitter::EmitCommitCountersUpdate() {
-  for (auto& observer : *type_debug_info_observers_)
-    observer.OnCommitCountersUpdated(type_, commit_counters_);
-
   // Emit the newly added counts to UMA.
   EmitNewChangesToUma(
       /*count=*/commit_counters_.num_creation_commits_attempted -
@@ -104,9 +97,6 @@
 }
 
 void DataTypeDebugInfoEmitter::EmitUpdateCountersUpdate() {
-  for (auto& observer : *type_debug_info_observers_)
-    observer.OnUpdateCountersUpdated(type_, update_counters_);
-
   // Emit the newly added counts to UMA.
   EmitNewChangesToUma(
       /*count=*/update_counters_.num_initial_updates_received -
diff --git a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h
index 7fe1a00f..41246b3 100644
--- a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h
+++ b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h
@@ -8,7 +8,6 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/observer_list.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/engine/cycle/commit_counters.h"
 #include "components/sync/engine/cycle/update_counters.h"
@@ -19,10 +18,11 @@
 
 namespace syncer {
 
-class TypeDebugInfoObserver;
-
 // Supports various kinds of debugging requests for a certain directory type.
 //
+// TODO(crbug.com/1102849): Merge with NonBlockingDataTypeDebugInfoEmitter.
+// TODO(crbug.com/1102849): Rename Emit*() methods to mention UMA, and update
+// the documentation to not mention any observers.
 // The Emit*() functions send updates to registered TypeDebugInfoObservers.
 // The DataTypeDebugInfoEmitter does not directly own that list; it is
 // managed by the ModelTypeRegistry.
@@ -33,11 +33,7 @@
 // information on demand.
 class DataTypeDebugInfoEmitter {
  public:
-  using ObserverListType = base::ObserverList<TypeDebugInfoObserver>::Unchecked;
-
-  // The |observers| is not owned.  |observers| may be modified outside of this
-  // object and is expected to outlive this object.
-  DataTypeDebugInfoEmitter(ModelType type, ObserverListType* observers);
+  explicit DataTypeDebugInfoEmitter(ModelType type);
 
   virtual ~DataTypeDebugInfoEmitter();
 
@@ -67,12 +63,6 @@
  protected:
   const ModelType type_;
 
-  // Because there are so many emitters that come into and out of existence, it
-  // doesn't make sense to have them manage their own observer list.  They all
-  // share one observer list that is provided by their owner and which is
-  // guaranteed to outlive them.
-  ObserverListType* type_debug_info_observers_;
-
  private:
   // The actual up-to-date counters.
   CommitCounters commit_counters_;
diff --git a/components/sync/engine_impl/cycle/data_type_debug_info_emitter_unittest.cc b/components/sync/engine_impl/cycle/data_type_debug_info_emitter_unittest.cc
index a81ec0be1..c92abe4 100644
--- a/components/sync/engine_impl/cycle/data_type_debug_info_emitter_unittest.cc
+++ b/components/sync/engine_impl/cycle/data_type_debug_info_emitter_unittest.cc
@@ -11,8 +11,7 @@
 namespace {
 
 TEST(DataTypeDebugInfoEmitterTest, ShouldEmitCommitsToUMAIfChanged) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter emitter(BOOKMARKS);
 
   CommitCounters* counters = emitter.GetMutableCommitCounters();
   counters->num_deletion_commits_attempted += 3;
@@ -32,8 +31,7 @@
 }
 
 TEST(DataTypeDebugInfoEmitterTest, ShouldNotEmitCommitsToUMAIfNotChanged) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter emitter(BOOKMARKS);
 
   base::HistogramTester histogram_tester;
   emitter.EmitCommitCountersUpdate();
@@ -43,8 +41,7 @@
 // Tests that at each EmitCommitCountersUpdate() call, only the changes since
 // the last call to EmitCommitCountersUpdate() are reported to UMA.
 TEST(DataTypeDebugInfoEmitterTest, ShouldEmitCommitsToUMAIncrementally) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter emitter(BOOKMARKS);
 
   CommitCounters* counters = emitter.GetMutableCommitCounters();
   counters->num_deletion_commits_attempted += 3;
@@ -73,8 +70,7 @@
 }
 
 TEST(DataTypeDebugInfoEmitterTest, ShouldEmitUpdatesToUMAIfChanged) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter emitter(BOOKMARKS);
 
   UpdateCounters* counters = emitter.GetMutableUpdateCounters();
   counters->num_initial_updates_received += 5;
@@ -95,8 +91,7 @@
 }
 
 TEST(DataTypeDebugInfoEmitterTest, ShouldNotEmitUpdatesToUMAIfNotChanged) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter emitter(BOOKMARKS);
 
   base::HistogramTester histogram_tester;
   emitter.EmitUpdateCountersUpdate();
@@ -106,8 +101,7 @@
 // Tests that at each EmitUpdateCountersUpdate() call, only the changes since
 // the last call to EmitUpdateCountersUpdate() are reported to UMA.
 TEST(DataTypeDebugInfoEmitterTest, ShouldEmitUpdatesToUMAIncrementally) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter emitter(BOOKMARKS);
 
   UpdateCounters* counters = emitter.GetMutableUpdateCounters();
   counters->num_initial_updates_received += 5;
diff --git a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc
index d27ad70ce..db2b7a2 100644
--- a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc
+++ b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc
@@ -6,10 +6,8 @@
 
 namespace syncer {
 
-NonBlockingTypeDebugInfoEmitter::NonBlockingTypeDebugInfoEmitter(
-    ModelType type,
-    ObserverListType* observers)
-    : DataTypeDebugInfoEmitter(type, observers) {}
+NonBlockingTypeDebugInfoEmitter::NonBlockingTypeDebugInfoEmitter(ModelType type)
+    : DataTypeDebugInfoEmitter(type) {}
 
 NonBlockingTypeDebugInfoEmitter::~NonBlockingTypeDebugInfoEmitter() {}
 
diff --git a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h
index d99e44e..48afd776 100644
--- a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h
+++ b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h
@@ -12,7 +12,7 @@
 
 class NonBlockingTypeDebugInfoEmitter : public DataTypeDebugInfoEmitter {
  public:
-  NonBlockingTypeDebugInfoEmitter(ModelType type, ObserverListType* observers);
+  explicit NonBlockingTypeDebugInfoEmitter(ModelType type);
 
   ~NonBlockingTypeDebugInfoEmitter() override;
 
diff --git a/components/sync/engine_impl/debug_info_event_listener.cc b/components/sync/engine_impl/debug_info_event_listener.cc
index 69fa714..51a5ff562 100644
--- a/components/sync/engine_impl/debug_info_event_listener.cc
+++ b/components/sync/engine_impl/debug_info_event_listener.cc
@@ -176,43 +176,11 @@
 
   for (size_t i = 0; i < configuration_stats.size(); ++i) {
     DCHECK(ProtocolTypes().Has(configuration_stats[i].model_type));
-    const DataTypeAssociationStats& association_stats =
-        configuration_stats[i].association_stats;
-
     sync_pb::DebugEventInfo association_event;
     sync_pb::DatatypeAssociationStats* datatype_stats =
         association_event.mutable_datatype_association_stats();
     datatype_stats->set_data_type_id(GetSpecificsFieldNumberFromModelType(
         configuration_stats[i].model_type));
-    datatype_stats->set_num_local_items_before_association(
-        association_stats.num_local_items_before_association);
-    datatype_stats->set_num_sync_items_before_association(
-        association_stats.num_sync_items_before_association);
-    datatype_stats->set_num_local_items_after_association(
-        association_stats.num_local_items_after_association);
-    datatype_stats->set_num_sync_items_after_association(
-        association_stats.num_sync_items_after_association);
-    datatype_stats->set_num_local_items_added(
-        association_stats.num_local_items_added);
-    datatype_stats->set_num_local_items_deleted(
-        association_stats.num_local_items_deleted);
-    datatype_stats->set_num_local_items_modified(
-        association_stats.num_local_items_modified);
-    datatype_stats->set_num_sync_items_added(
-        association_stats.num_sync_items_added);
-    datatype_stats->set_num_sync_items_deleted(
-        association_stats.num_sync_items_deleted);
-    datatype_stats->set_num_sync_items_modified(
-        association_stats.num_sync_items_modified);
-    datatype_stats->set_local_version_pre_association(
-        association_stats.local_version_pre_association);
-    datatype_stats->set_sync_version_pre_association(
-        association_stats.sync_version_pre_association);
-    datatype_stats->set_had_error(association_stats.had_error);
-    datatype_stats->set_association_wait_time_for_same_priority_us(
-        association_stats.association_wait_time.InMicroseconds());
-    datatype_stats->set_association_time_us(
-        association_stats.association_time.InMicroseconds());
     datatype_stats->set_download_wait_time_us(
         configuration_stats[i].download_wait_time.InMicroseconds());
     datatype_stats->set_download_time_us(
diff --git a/components/sync/engine_impl/loopback_server/loopback_server.cc b/components/sync/engine_impl/loopback_server/loopback_server.cc
index daed66e9..78e540e6 100644
--- a/components/sync/engine_impl/loopback_server/loopback_server.cc
+++ b/components/sync/engine_impl/loopback_server/loopback_server.cc
@@ -293,22 +293,12 @@
     if (!top_level_entity) {
       return false;
     }
-    top_level_permanent_item_ids_[model_type] = top_level_entity->GetId();
     SaveEntity(std::move(top_level_entity));
   }
 
   return true;
 }
 
-std::string LoopbackServer::GetTopLevelPermanentItemId(
-    syncer::ModelType model_type) {
-  auto it = top_level_permanent_item_ids_.find(model_type);
-  if (it == top_level_permanent_item_ids_.end()) {
-    return std::string();
-  }
-  return it->second;
-}
-
 void LoopbackServer::UpdateEntityVersion(LoopbackServerEntity* entity) {
   entity->SetVersion(++version_);
 }
diff --git a/components/sync/engine_impl/loopback_server/loopback_server.h b/components/sync/engine_impl/loopback_server/loopback_server.h
index 208f21a..897cb395 100644
--- a/components/sync/engine_impl/loopback_server/loopback_server.h
+++ b/components/sync/engine_impl/loopback_server/loopback_server.h
@@ -119,10 +119,6 @@
   // Inserts the default permanent items in |entities_|.
   bool CreateDefaultPermanentItems();
 
-  // Returns an empty string if no top-level permanent item of the given type
-  // was created.
-  std::string GetTopLevelPermanentItemId(syncer::ModelType model_type);
-
   // Returns generated key which may contain any bytes (not necessarily UTF-8).
   std::vector<uint8_t> GenerateNewKeystoreKey() const;
 
@@ -240,7 +236,6 @@
   int max_get_updates_batch_size_ = 1000000;
 
   EntityMap entities_;
-  std::map<ModelType, std::string> top_level_permanent_item_ids_;
   std::vector<std::vector<uint8_t>> keystore_keys_;
 
   // The file used to store the local sync data.
diff --git a/components/sync/engine_impl/model_type_registry.cc b/components/sync/engine_impl/model_type_registry.cc
index 61336f17..aed453a 100644
--- a/components/sync/engine_impl/model_type_registry.cc
+++ b/components/sync/engine_impl/model_type_registry.cc
@@ -11,7 +11,6 @@
 #include "base/bind.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/observer_list.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/sync/engine/commit_queue.h"
 #include "components/sync/engine/data_type_activation_response.h"
@@ -86,8 +85,7 @@
 
   DataTypeDebugInfoEmitter* emitter = GetEmitter(type);
   if (emitter == nullptr) {
-    auto new_emitter = std::make_unique<NonBlockingTypeDebugInfoEmitter>(
-        type, &type_debug_info_observers_);
+    auto new_emitter = std::make_unique<NonBlockingTypeDebugInfoEmitter>(type);
     emitter = new_emitter.get();
     data_type_debug_info_emitter_map_.insert(
         std::make_pair(type, std::move(new_emitter)));
@@ -176,32 +174,6 @@
   return keystore_keys_handler_;
 }
 
-void ModelTypeRegistry::RegisterDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {
-  if (!type_debug_info_observers_.HasObserver(observer))
-    type_debug_info_observers_.AddObserver(observer);
-}
-
-void ModelTypeRegistry::UnregisterDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {
-  type_debug_info_observers_.RemoveObserver(observer);
-}
-
-bool ModelTypeRegistry::HasDirectoryTypeDebugInfoObserver(
-    const TypeDebugInfoObserver* observer) const {
-  return type_debug_info_observers_.HasObserver(observer);
-}
-
-void ModelTypeRegistry::RequestEmitDebugInfo() {
-  for (const auto& kv : data_type_debug_info_emitter_map_) {
-    kv.second->EmitCommitCountersUpdate();
-    kv.second->EmitUpdateCountersUpdate();
-    // Although this breaks encapsulation, don't emit status counters here.
-    // They've already been asked for manually on the UI thread because USS
-    // emitters don't have a working implementation yet.
-  }
-}
-
 bool ModelTypeRegistry::HasUnsyncedItems() const {
   // For model type workers, we ask them individually.
   for (const auto& worker : model_type_workers_) {
diff --git a/components/sync/engine_impl/model_type_registry.h b/components/sync/engine_impl/model_type_registry.h
index b2ccd05..4a5f042 100644
--- a/components/sync/engine_impl/model_type_registry.h
+++ b/components/sync/engine_impl/model_type_registry.h
@@ -12,10 +12,8 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/passphrase_enums.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 #include "components/sync/engine/model_safe_worker.h"
 #include "components/sync/engine/model_type_connector.h"
 #include "components/sync/engine/non_blocking_sync_common.h"
@@ -85,13 +83,6 @@
   CommitContributorMap* commit_contributor_map();
   KeystoreKeysHandler* keystore_keys_handler();
 
-  void RegisterDirectoryTypeDebugInfoObserver(TypeDebugInfoObserver* observer);
-  void UnregisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer);
-  bool HasDirectoryTypeDebugInfoObserver(
-      const TypeDebugInfoObserver* observer) const;
-  void RequestEmitDebugInfo();
-
   bool HasUnsyncedItems() const;
 
   base::WeakPtr<ModelTypeConnector> AsWeakPtr();
@@ -142,15 +133,6 @@
 
   KeystoreKeysHandler* const keystore_keys_handler_;
 
-  // The set of observers of per-type debug info.
-  //
-  // Each of the DataTypeDebugInfoEmitter needs such a list. There's
-  // a lot of them, and their lifetimes are unpredictable, so it makes the
-  // book-keeping easier if we just store the list here.  That way it's
-  // guaranteed to live as long as this sync backend.
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked
-      type_debug_info_observers_;
-
   base::WeakPtrFactory<ModelTypeRegistry> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ModelTypeRegistry);
diff --git a/components/sync/engine_impl/model_type_worker_unittest.cc b/components/sync/engine_impl/model_type_worker_unittest.cc
index 8b71488..0139fb860 100644
--- a/components/sync/engine_impl/model_type_worker_unittest.cc
+++ b/components/sync/engine_impl/model_type_worker_unittest.cc
@@ -150,9 +150,8 @@
         mock_type_processor_(nullptr),
         mock_server_(std::make_unique<SingleTypeMockServer>(model_type)),
         is_processor_disconnected_(false),
-        emitter_(std::make_unique<NonBlockingTypeDebugInfoEmitter>(
-            model_type,
-            &type_observers_)) {}
+        emitter_(
+            std::make_unique<NonBlockingTypeDebugInfoEmitter>(model_type)) {}
 
   ~ModelTypeWorkerTest() override {}
 
@@ -188,8 +187,7 @@
 
   void InitializeCommitOnly() {
     mock_server_ = std::make_unique<SingleTypeMockServer>(USER_EVENTS);
-    emitter_ = std::make_unique<NonBlockingTypeDebugInfoEmitter>(
-        USER_EVENTS, &type_observers_);
+    emitter_ = std::make_unique<NonBlockingTypeDebugInfoEmitter>(USER_EVENTS);
 
     // Don't set progress marker, commit only types don't use them.
     ModelTypeState initial_state;
@@ -510,8 +508,6 @@
 
   bool is_processor_disconnected_;
 
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked type_observers_;
-
   std::unique_ptr<NonBlockingTypeDebugInfoEmitter> emitter_;
 
   StatusController status_controller_;
diff --git a/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc b/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc
index d80fdb9..6e2716bb 100644
--- a/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc
+++ b/components/sync/engine_impl/non_blocking_type_commit_contribution_unittest.cc
@@ -166,8 +166,7 @@
                      &request_data->specifics_hash);
   request_data->entity = std::move(data);
 
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter debug_info_emitter(PASSWORDS, &observers);
+  DataTypeDebugInfoEmitter debug_info_emitter(PASSWORDS);
 
   std::unique_ptr<CryptographerImpl> cryptographer =
       CryptographerImpl::FromSingleKeyForTesting("dummy");
@@ -233,8 +232,7 @@
                      &request_data->specifics_hash);
   request_data->entity = std::move(data);
 
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter debug_info_emitter(PASSWORDS, &observers);
+  DataTypeDebugInfoEmitter debug_info_emitter(PASSWORDS);
 
   std::unique_ptr<CryptographerImpl> cryptographer =
       CryptographerImpl::FromSingleKeyForTesting("dummy");
@@ -280,8 +278,7 @@
   CommitRequestDataList requests_data;
   requests_data.push_back(std::move(request_data));
 
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter debug_info_emitter(PASSWORDS, &observers);
+  DataTypeDebugInfoEmitter debug_info_emitter(PASSWORDS);
 
   std::unique_ptr<CryptographerImpl> cryptographer =
       CryptographerImpl::CreateEmpty();
@@ -337,8 +334,7 @@
 }
 
 TEST(NonBlockingTypeCommitContributionTest, ShouldPropagateFullCommitFailure) {
-  base::ObserverList<TypeDebugInfoObserver>::Unchecked observers;
-  DataTypeDebugInfoEmitter debug_info_emitter(BOOKMARKS, &observers);
+  DataTypeDebugInfoEmitter debug_info_emitter(BOOKMARKS);
 
   base::MockOnceCallback<void(SyncCommitError commit_error)>
       on_commit_failure_callback;
diff --git a/components/sync/engine_impl/sync_manager_impl.cc b/components/sync/engine_impl/sync_manager_impl.cc
index 53f16c5..b4bfd17 100644
--- a/components/sync/engine_impl/sync_manager_impl.cc
+++ b/components/sync/engine_impl/sync_manager_impl.cc
@@ -13,7 +13,6 @@
 #include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/observer_list.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
 #include "components/sync/base/cancelation_signal.h"
@@ -534,25 +533,6 @@
   return protocol_event_buffer_.GetBufferedProtocolEvents();
 }
 
-void SyncManagerImpl::RegisterDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {
-  model_type_registry_->RegisterDirectoryTypeDebugInfoObserver(observer);
-}
-
-void SyncManagerImpl::UnregisterDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {
-  model_type_registry_->UnregisterDirectoryTypeDebugInfoObserver(observer);
-}
-
-bool SyncManagerImpl::HasDirectoryTypeDebugInfoObserver(
-    TypeDebugInfoObserver* observer) {
-  return model_type_registry_->HasDirectoryTypeDebugInfoObserver(observer);
-}
-
-void SyncManagerImpl::RequestEmitDebugInfo() {
-  model_type_registry_->RequestEmitDebugInfo();
-}
-
 void SyncManagerImpl::OnCookieJarChanged(bool account_mismatch,
                                          bool empty_jar) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/sync/engine_impl/sync_manager_impl.h b/components/sync/engine_impl/sync_manager_impl.h
index b02acee..6798d31 100644
--- a/components/sync/engine_impl/sync_manager_impl.h
+++ b/components/sync/engine_impl/sync_manager_impl.h
@@ -15,6 +15,7 @@
 #include "base/callback_forward.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 #include "base/sequence_checker.h"
 #include "components/sync/base/time.h"
 #include "components/sync/engine/sync_manager.h"
@@ -34,7 +35,6 @@
 class Cryptographer;
 class ModelTypeRegistry;
 class SyncCycleContext;
-class TypeDebugInfoObserver;
 
 // Unless stated otherwise, all methods of SyncManager should be called on the
 // same thread.
@@ -81,13 +81,6 @@
   SyncEncryptionHandler* GetEncryptionHandler() override;
   std::vector<std::unique_ptr<ProtocolEvent>> GetBufferedProtocolEvents()
       override;
-  void RegisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) override;
-  void UnregisterDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) override;
-  bool HasDirectoryTypeDebugInfoObserver(
-      TypeDebugInfoObserver* observer) override;
-  void RequestEmitDebugInfo() override;
   void OnCookieJarChanged(bool account_mismatch, bool empty_jar) override;
   void UpdateInvalidationClientId(const std::string& client_id) override;
 
diff --git a/components/sync/engine_impl/syncer_unittest.cc b/components/sync/engine_impl/syncer_unittest.cc
index 26c4421..be0f094 100644
--- a/components/sync/engine_impl/syncer_unittest.cc
+++ b/components/sync/engine_impl/syncer_unittest.cc
@@ -29,9 +29,6 @@
 #include "components/sync/base/client_tag_hash.h"
 #include "components/sync/base/extensions_activity.h"
 #include "components/sync/base/time.h"
-#include "components/sync/engine/cycle/commit_counters.h"
-#include "components/sync/engine/cycle/status_counters.h"
-#include "components/sync/engine/cycle/update_counters.h"
 #include "components/sync/engine/data_type_activation_response.h"
 #include "components/sync/engine/forwarding_model_type_processor.h"
 #include "components/sync/engine/model_safe_worker.h"
@@ -65,82 +62,6 @@
   return specifics;
 }
 
-// A helper to hold on to the counters emitted by the sync engine.
-class TypeDebugInfoCache : public TypeDebugInfoObserver {
- public:
-  TypeDebugInfoCache();
-  ~TypeDebugInfoCache() override;
-
-  CommitCounters GetLatestCommitCounters(ModelType type) const;
-  UpdateCounters GetLatestUpdateCounters(ModelType type) const;
-  StatusCounters GetLatestStatusCounters(ModelType type) const;
-
-  // TypeDebugInfoObserver implementation.
-  void OnCommitCountersUpdated(ModelType type,
-                               const CommitCounters& counters) override;
-  void OnUpdateCountersUpdated(ModelType type,
-                               const UpdateCounters& counters) override;
-  void OnStatusCountersUpdated(ModelType type,
-                               const StatusCounters& counters) override;
-
- private:
-  std::map<ModelType, CommitCounters> commit_counters_map_;
-  std::map<ModelType, UpdateCounters> update_counters_map_;
-  std::map<ModelType, StatusCounters> status_counters_map_;
-};
-
-TypeDebugInfoCache::TypeDebugInfoCache() {}
-
-TypeDebugInfoCache::~TypeDebugInfoCache() {}
-
-CommitCounters TypeDebugInfoCache::GetLatestCommitCounters(
-    ModelType type) const {
-  auto it = commit_counters_map_.find(type);
-  if (it == commit_counters_map_.end()) {
-    return CommitCounters();
-  } else {
-    return it->second;
-  }
-}
-
-UpdateCounters TypeDebugInfoCache::GetLatestUpdateCounters(
-    ModelType type) const {
-  auto it = update_counters_map_.find(type);
-  if (it == update_counters_map_.end()) {
-    return UpdateCounters();
-  } else {
-    return it->second;
-  }
-}
-
-StatusCounters TypeDebugInfoCache::GetLatestStatusCounters(
-    ModelType type) const {
-  auto it = status_counters_map_.find(type);
-  if (it == status_counters_map_.end()) {
-    return StatusCounters();
-  } else {
-    return it->second;
-  }
-}
-
-void TypeDebugInfoCache::OnCommitCountersUpdated(
-    ModelType type,
-    const CommitCounters& counters) {
-  commit_counters_map_[type] = counters;
-}
-
-void TypeDebugInfoCache::OnUpdateCountersUpdated(
-    ModelType type,
-    const UpdateCounters& counters) {
-  update_counters_map_[type] = counters;
-}
-
-void TypeDebugInfoCache::OnStatusCountersUpdated(
-    ModelType type,
-    const StatusCounters& counters) {
-  status_counters_map_[type] = counters;
-}
-
 }  // namespace
 
 // Syncer unit tests. Unfortunately a lot of these tests
@@ -241,8 +162,6 @@
     model_type_registry_ = std::make_unique<ModelTypeRegistry>(
         workers_, &mock_nudge_handler_, &cancelation_signal_,
         &encryption_handler_);
-    model_type_registry_->RegisterDirectoryTypeDebugInfoObserver(
-        &debug_info_cache_);
 
     EnableDatatype(BOOKMARKS);
     EnableDatatype(EXTENSIONS);
@@ -266,8 +185,6 @@
   }
 
   void TearDown() override {
-    model_type_registry_->UnregisterDirectoryTypeDebugInfoObserver(
-        &debug_info_cache_);
     mock_server_.reset();
     scheduler_.reset();
   }
@@ -280,18 +197,6 @@
     EXPECT_FALSE(client_status.hierarchy_conflict_detected());
   }
 
-  CommitCounters GetCommitCounters(ModelType type) {
-    return debug_info_cache_.GetLatestCommitCounters(type);
-  }
-
-  UpdateCounters GetUpdateCounters(ModelType type) {
-    return debug_info_cache_.GetLatestUpdateCounters(type);
-  }
-
-  StatusCounters GetStatusCounters(ModelType type) {
-    return debug_info_cache_.GetLatestStatusCounters(type);
-  }
-
   const std::string local_cache_guid() { return "lD16ebCGCZh+zkiZ68gWDw=="; }
 
   const std::string foreign_cache_guid() { return "kqyg7097kro6GSUod+GSg=="; }
@@ -345,7 +250,6 @@
   Syncer* syncer_;
 
   std::unique_ptr<SyncCycle> cycle_;
-  TypeDebugInfoCache debug_info_cache_;
   MockNudgeHandler mock_nudge_handler_;
   std::unique_ptr<ModelTypeRegistry> model_type_registry_;
   std::unique_ptr<SyncSchedulerImpl> scheduler_;
diff --git a/components/sync/invalidations/fcm_handler.cc b/components/sync/invalidations/fcm_handler.cc
index d9dd53d84..26b155e 100644
--- a/components/sync/invalidations/fcm_handler.cc
+++ b/components/sync/invalidations/fcm_handler.cc
@@ -59,6 +59,10 @@
   if (instance_id_driver_->ExistsInstanceID(app_id_)) {
     instance_id_driver_->GetInstanceID(app_id_)->DeleteID(
         /*callback=*/base::DoNothing());
+    fcm_registration_token_.clear();
+    for (FCMRegistrationTokenObserver& token_observer : token_observers_) {
+      token_observer.OnFCMRegistrationTokenChanged();
+    }
   }
   StopListening();
 }
diff --git a/components/sync/invalidations/fcm_handler.h b/components/sync/invalidations/fcm_handler.h
index e670e5e..1786d9e 100644
--- a/components/sync/invalidations/fcm_handler.h
+++ b/components/sync/invalidations/fcm_handler.h
@@ -51,8 +51,8 @@
   // shutdown.
   void StopListening();
 
-  // Stop handling incoming invalidations and delete Instance ID. This method
-  // gets called during sign-out.
+  // Stop handling incoming invalidations and delete Instance ID. It clears the
+  // FCM registration token. This method gets called during sign-out.
   void StopListeningPermanently();
 
   // Returns if the handler is listening for incoming invalidations.
@@ -68,7 +68,7 @@
   void RemoveTokenObserver(FCMRegistrationTokenObserver* observer);
 
   // Used to get an obtained FCM token. Returns empty string if it hasn't
-  // received yet.
+  // been received yet, or if the handler has stopped listening permanently.
   const std::string& GetFCMRegistrationToken() const;
 
   // GCMAppHandler overrides.
diff --git a/components/sync/invalidations/fcm_handler_unittest.cc b/components/sync/invalidations/fcm_handler_unittest.cc
index 7c338e6..8d32db9 100644
--- a/components/sync/invalidations/fcm_handler_unittest.cc
+++ b/components/sync/invalidations/fcm_handler_unittest.cc
@@ -27,6 +27,7 @@
 using testing::_;
 using testing::Invoke;
 using testing::NiceMock;
+using testing::Return;
 using testing::WithArg;
 
 namespace syncer {
@@ -214,5 +215,27 @@
   fcm_handler_.RemoveTokenObserver(&mock_token_observer);
 }
 
+TEST_F(FCMHandlerTest, ShouldClearTokenOnStopListeningPermanently) {
+  // Check that the handler gets the token through GetToken.
+  EXPECT_CALL(mock_instance_id_, GetToken(_, _, _, _, _, _))
+      .WillOnce(WithArg<5>(Invoke([](InstanceID::GetTokenCallback callback) {
+        std::move(callback).Run("token", InstanceID::Result::SUCCESS);
+      })));
+  fcm_handler_.StartListening();
+
+  NiceMock<MockTokenObserver> mock_token_observer;
+  fcm_handler_.AddTokenObserver(&mock_token_observer);
+
+  EXPECT_CALL(mock_instance_id_driver_,
+              ExistsInstanceID(kSyncInvalidationsAppId))
+      .WillOnce(Return(true));
+  // Token should be cleared when StopListeningPermanently() is called.
+  EXPECT_CALL(mock_token_observer, OnFCMRegistrationTokenChanged());
+  fcm_handler_.StopListeningPermanently();
+  EXPECT_EQ("", fcm_handler_.GetFCMRegistrationToken());
+
+  fcm_handler_.RemoveTokenObserver(&mock_token_observer);
+}
+
 }  // namespace
 }  // namespace syncer
diff --git a/components/sync/invalidations/sync_invalidations_service.h b/components/sync/invalidations/sync_invalidations_service.h
index b29d4fd..730565f 100644
--- a/components/sync/invalidations/sync_invalidations_service.h
+++ b/components/sync/invalidations/sync_invalidations_service.h
@@ -42,7 +42,7 @@
   virtual void RemoveTokenObserver(FCMRegistrationTokenObserver* observer) = 0;
 
   // Used to get an obtained FCM token. Returns empty string if it hasn't been
-  // received yet.
+  // received yet, or if the device has stopped listening to invalidations.
   virtual const std::string& GetFCMRegistrationToken() const = 0;
 
   // Set the interested data types change handler. |handler| can be nullptr to
diff --git a/components/sync/invalidations/sync_invalidations_service_impl.cc b/components/sync/invalidations/sync_invalidations_service_impl.cc
index 9ffd686..dc6c526 100644
--- a/components/sync/invalidations/sync_invalidations_service_impl.cc
+++ b/components/sync/invalidations/sync_invalidations_service_impl.cc
@@ -86,4 +86,8 @@
   fcm_handler_.reset();
 }
 
+FCMHandler* SyncInvalidationsServiceImpl::GetFCMHandlerForTesting() {
+  return fcm_handler_.get();
+}
+
 }  // namespace syncer
diff --git a/components/sync/invalidations/sync_invalidations_service_impl.h b/components/sync/invalidations/sync_invalidations_service_impl.h
index d7d5024..9cdc52e 100644
--- a/components/sync/invalidations/sync_invalidations_service_impl.h
+++ b/components/sync/invalidations/sync_invalidations_service_impl.h
@@ -48,6 +48,9 @@
   // KeyedService overrides.
   void Shutdown() override;
 
+  // Used in integration tests.
+  FCMHandler* GetFCMHandlerForTesting();
+
  private:
   std::unique_ptr<FCMHandler> fcm_handler_;
   InterestedDataTypesManager data_types_manager_;
diff --git a/components/sync/protocol/client_debug_info.proto b/components/sync/protocol/client_debug_info.proto
index dcf5fa3..2b9d801 100644
--- a/components/sync/protocol/client_debug_info.proto
+++ b/components/sync/protocol/client_debug_info.proto
@@ -64,32 +64,6 @@
   // The datatype that was associated.
   optional int32 data_type_id = 1;
 
-  // The state of the world before association.
-  optional int32 num_local_items_before_association = 2;
-  optional int32 num_sync_items_before_association = 3;
-
-  // The state of the world after association.
-  optional int32 num_local_items_after_association = 4;
-  optional int32 num_sync_items_after_association = 5;
-
-  // The changes that got us from before to after. In a correctly working
-  // system these should be the deltas between before and after.
-  optional int32 num_local_items_added = 6;
-  optional int32 num_local_items_deleted = 7;
-  optional int32 num_local_items_modified = 8;
-  optional int32 num_sync_items_added = 9;
-  optional int32 num_sync_items_deleted = 10;
-  optional int32 num_sync_items_modified = 11;
-
-  // Model versions before association. Ideally local and sync model should
-  // have same version if models were persisted properly in last cycle.
-  // Note: currently version is only set on bookmark model.
-  optional int64 local_version_pre_association = 20;
-  optional int64 sync_version_pre_association = 21;
-
-  // The data type ran into an error during model association.
-  optional bool had_error = 12;
-
   // Waiting time before downloading starts. This measures the time between
   // receiving configuration request for a set of data types to starting
   // downloading data of this type.
@@ -110,24 +84,42 @@
   // have near zero waiting time.
   optional int64 association_wait_time_for_high_priority_us = 16;
 
-  // Waiting time for other types with same priority during association.
-  // Data type manger sends types of same priority to association manager to
-  // configure as a batch. Association manager configures one type at a time.
-  // This measures the time between when a type is sent to association manager
-  // (among other types) to when association manager starts configuring the
-  // type. Total wait time before association is
-  //     |association_wait_time_for_high_priority_us| +
-  //     |association_wait_time_for_same_priority_us|
-  optional int64 association_wait_time_for_same_priority_us = 14;
-
-  // Time spent on model association.
-  optional int64 association_time_us = 17;
-
   // Higher priority type that's configured before this type.
   repeated int32 high_priority_type_configured_before = 18;
 
   // Same priority type that's configured before this type.
   repeated int32 same_priority_type_configured_before = 19;
+
+  reserved "num_local_items_before_association";
+  reserved 2;
+  reserved "num_sync_items_before_association";
+  reserved 3;
+  reserved "num_local_items_after_association";
+  reserved 4;
+  reserved "num_sync_items_after_association";
+  reserved 5;
+  reserved "num_local_items_added";
+  reserved 6;
+  reserved "num_local_items_deleted";
+  reserved 7;
+  reserved "num_local_items_modified";
+  reserved 8;
+  reserved "num_sync_items_added";
+  reserved 9;
+  reserved "num_sync_items_deleted";
+  reserved 10;
+  reserved "num_sync_items_modified";
+  reserved 11;
+  reserved "had_error";
+  reserved 12;
+  reserved "association_wait_time_for_same_priority_us";
+  reserved 14;
+  reserved "association_time_us";
+  reserved 17;
+  reserved "local_version_pre_association";
+  reserved 20;
+  reserved "sync_version_pre_association";
+  reserved 21;
 }
 
 message DebugEventInfo {
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index 8fea955..8777c7c 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -338,23 +338,9 @@
 
 VISIT_PROTO_FIELDS(const sync_pb::DatatypeAssociationStats& proto) {
   VISIT(data_type_id);
-  VISIT(num_local_items_before_association);
-  VISIT(num_sync_items_before_association);
-  VISIT(num_local_items_after_association);
-  VISIT(num_sync_items_after_association);
-  VISIT(num_local_items_added);
-  VISIT(num_local_items_deleted);
-  VISIT(num_local_items_modified);
-  VISIT(num_sync_items_added);
-  VISIT(num_sync_items_deleted);
-  VISIT(num_sync_items_modified);
-  VISIT(local_version_pre_association);
-  VISIT(sync_version_pre_association);
-  VISIT(had_error);
   VISIT(download_wait_time_us);
   VISIT(download_time_us);
   VISIT(association_wait_time_for_high_priority_us);
-  VISIT(association_wait_time_for_same_priority_us);
   VISIT_REP(high_priority_type_configured_before);
   VISIT_REP(same_priority_type_configured_before);
 }
diff --git a/components/sync/test/fake_server/fake_server.cc b/components/sync/test/fake_server/fake_server.cc
index 6dedb6b..94a527d 100644
--- a/components/sync/test/fake_server/fake_server.cc
+++ b/components/sync/test/fake_server/fake_server.cc
@@ -360,12 +360,6 @@
   return loopback_server_->GetPermanentSyncEntitiesByModelType(model_type);
 }
 
-std::string FakeServer::GetTopLevelPermanentItemId(
-    syncer::ModelType model_type) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return loopback_server_->GetTopLevelPermanentItemId(model_type);
-}
-
 const std::vector<std::vector<uint8_t>>& FakeServer::GetKeystoreKeys() const {
   DCHECK(thread_checker_.CalledOnValidThread());
   return loopback_server_->GetKeystoreKeysForTesting();
@@ -379,9 +373,9 @@
       loopback_server_->GetPermanentSyncEntitiesByModelType(syncer::NIGORI);
 
   DCHECK_EQ(nigori_entities.size(), 1U);
-  bool success = ModifyEntitySpecifics(
-      loopback_server_->GetTopLevelPermanentItemId(syncer::NIGORI),
-      nigori_entities[0].specifics());
+  bool success =
+      ModifyEntitySpecifics(LoopbackServerEntity::GetTopLevelId(syncer::NIGORI),
+                            nigori_entities[0].specifics());
   DCHECK(success);
 }
 
diff --git a/components/sync/test/fake_server/fake_server.h b/components/sync/test/fake_server/fake_server.h
index a5a23be..8283d423 100644
--- a/components/sync/test/fake_server/fake_server.h
+++ b/components/sync/test/fake_server/fake_server.h
@@ -93,10 +93,6 @@
   std::vector<sync_pb::SyncEntity> GetPermanentSyncEntitiesByModelType(
       syncer::ModelType model_type);
 
-  // Returns an empty string if no top-level permanent item of the given type
-  // was created.
-  std::string GetTopLevelPermanentItemId(syncer::ModelType model_type);
-
   // Returns all keystore keys from the server.
   const std::vector<std::vector<uint8_t>>& GetKeystoreKeys() const;
 
diff --git a/components/sync_device_info/device_info_prefs.cc b/components/sync_device_info/device_info_prefs.cc
index 5f02f05..d3a47f1e 100644
--- a/components/sync_device_info/device_info_prefs.cc
+++ b/components/sync_device_info/device_info_prefs.cc
@@ -17,10 +17,6 @@
 namespace syncer {
 namespace {
 
-// Name of obsolete preference that stores most recently used past cache
-// GUIDs, most recent first.
-const char kObsoleteDeviceInfoRecentGUIDs[] = "sync.local_device_guids";
-
 // Preference name for storing recently used cache GUIDs and their timestamps
 // in days since Windows epoch. Most recent first.
 const char kDeviceInfoRecentGUIDsWithTimestamps[] =
@@ -54,25 +50,6 @@
 // static
 void DeviceInfoPrefs::RegisterProfilePrefs(PrefRegistrySimple* registry) {
   registry->RegisterListPref(kDeviceInfoRecentGUIDsWithTimestamps);
-  registry->RegisterListPref(kObsoleteDeviceInfoRecentGUIDs);
-}
-
-// static
-void DeviceInfoPrefs::MigrateRecentLocalCacheGuidsPref(
-    PrefService* pref_service) {
-  base::Value::ConstListView obsolete_cache_guids =
-      pref_service->GetList(kObsoleteDeviceInfoRecentGUIDs)->GetList();
-  DeviceInfoPrefs prefs(pref_service, base::DefaultClock::GetInstance());
-
-  // Iterate in reverse order to maintain original order.
-  for (auto it = obsolete_cache_guids.rbegin();
-       it != obsolete_cache_guids.rend(); ++it) {
-    if (it->is_string()) {
-      prefs.AddLocalCacheGuid(it->GetString());
-    }
-  }
-
-  pref_service->ClearPref(kObsoleteDeviceInfoRecentGUIDs);
 }
 
 DeviceInfoPrefs::DeviceInfoPrefs(PrefService* pref_service,
diff --git a/components/sync_device_info/device_info_prefs.h b/components/sync_device_info/device_info_prefs.h
index 5c5a112..9c63454 100644
--- a/components/sync_device_info/device_info_prefs.h
+++ b/components/sync_device_info/device_info_prefs.h
@@ -24,8 +24,6 @@
  public:
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
-  static void MigrateRecentLocalCacheGuidsPref(PrefService* pref_service);
-
   // |pref_service| and |clock| must outlive this class and be non null.
   DeviceInfoPrefs(PrefService* pref_service, const base::Clock* clock);
   ~DeviceInfoPrefs();
diff --git a/components/sync_device_info/device_info_prefs_unittest.cc b/components/sync_device_info/device_info_prefs_unittest.cc
index 2d040ad..69d984b 100644
--- a/components/sync_device_info/device_info_prefs_unittest.cc
+++ b/components/sync_device_info/device_info_prefs_unittest.cc
@@ -27,26 +27,6 @@
   TestingPrefServiceSimple pref_service_;
 };
 
-TEST_F(DeviceInfoPrefsTest, ShouldMigrateFromObsoletePref) {
-  const char kObsoleteDeviceInfoRecentGUIDs[] = "sync.local_device_guids";
-
-  ListPrefUpdate cache_guids_update(&pref_service_,
-                                    kObsoleteDeviceInfoRecentGUIDs);
-
-  cache_guids_update->Insert(cache_guids_update->GetList().begin(),
-                             base::Value("old_guid1"));
-  cache_guids_update->Insert(cache_guids_update->GetList().begin(),
-                             base::Value("old_guid2"));
-
-  ASSERT_FALSE(device_info_prefs_.IsRecentLocalCacheGuid("old_guid1"));
-  ASSERT_FALSE(device_info_prefs_.IsRecentLocalCacheGuid("old_guid2"));
-
-  DeviceInfoPrefs::MigrateRecentLocalCacheGuidsPref(&pref_service_);
-
-  EXPECT_TRUE(device_info_prefs_.IsRecentLocalCacheGuid("old_guid1"));
-  EXPECT_TRUE(device_info_prefs_.IsRecentLocalCacheGuid("old_guid2"));
-}
-
 TEST_F(DeviceInfoPrefsTest, ShouldGarbageCollectExpiredCacheGuids) {
   const base::TimeDelta kMaxDaysLocalCacheGuidsStored =
       base::TimeDelta::FromDays(10);
diff --git a/components/sync_sessions/proxy_tabs_data_type_controller.cc b/components/sync_sessions/proxy_tabs_data_type_controller.cc
index 738cce5..846635e 100644
--- a/components/sync_sessions/proxy_tabs_data_type_controller.cc
+++ b/components/sync_sessions/proxy_tabs_data_type_controller.cc
@@ -45,7 +45,8 @@
   state_ = RUNNING;
   state_changed_cb_.Run(state_);
 
-  return REGISTRATION_IGNORED;
+  // Proxy types don't have any data to download.
+  return TYPE_ALREADY_DOWNLOADED;
 }
 
 void ProxyTabsDataTypeController::Stop(syncer::ShutdownReason shutdown_reason,
diff --git a/components/timers/alarm_timer_chromeos.cc b/components/timers/alarm_timer_chromeos.cc
index bd3947c..af98c06 100644
--- a/components/timers/alarm_timer_chromeos.cc
+++ b/components/timers/alarm_timer_chromeos.cc
@@ -17,7 +17,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/pending_task.h"
 #include "base/task/common/task_annotator.h"
-#include "base/trace_event/task_execution_macros.h"
 #include "base/trace_event/trace_event.h"
 
 namespace timers {
diff --git a/components/tracing/test/trace_event_perftest.cc b/components/tracing/test/trace_event_perftest.cc
index c2317ce..5f93f59c 100644
--- a/components/tracing/test/trace_event_perftest.cc
+++ b/components/tracing/test/trace_event_perftest.cc
@@ -11,7 +11,6 @@
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread.h"
-#include "base/trace_event/task_execution_macros.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
 #include "perf_test_helpers.h"
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.h b/content/browser/accessibility/browser_accessibility_cocoa.h
index f6f6510..95bff04 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.h
+++ b/content/browser/accessibility/browser_accessibility_cocoa.h
@@ -113,6 +113,11 @@
 - (NSAttributedString*)attributedValueForRange:(NSRange)range;
 - (NSRect)frameForRange:(NSRange)range;
 
+// Find the index of the given row among the descendants of this object
+// or return nil if this row is not found.
+- (bool)findRowIndex:(BrowserAccessibilityCocoa*)toFind
+    withCurrentIndex:(int*)currentIndex;
+
 // Internally-used property.
 @property(nonatomic, readonly) NSPoint origin;
 
@@ -149,6 +154,7 @@
 @property(nonatomic, readonly, getter=isIgnored) BOOL ignored;
 // Index of a row, column, or tree item.
 @property(nonatomic, readonly) NSNumber* index;
+@property(nonatomic, readonly) NSNumber* treeItemRowIndex;
 @property(nonatomic, readonly) NSNumber* insertionPointLineNumber;
 @property(nonatomic, readonly) NSString* invalid;
 @property(nonatomic, readonly) NSNumber* isMultiSelectable;
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 873d920f..0e8257d 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -1481,7 +1481,10 @@
 - (NSNumber*)index {
   if (![self instanceActive])
     return nil;
-  if ([self internalRole] == ax::mojom::Role::kColumn) {
+
+  if ([self internalRole] == ax::mojom::Role::kTreeItem) {
+    return [self treeItemRowIndex];
+  } else if ([self internalRole] == ax::mojom::Role::kColumn) {
     DCHECK(_owner->node());
     base::Optional<int> col_index = *_owner->node()->GetTableColColIndex();
     if (col_index)
@@ -1496,6 +1499,56 @@
   return nil;
 }
 
+- (NSNumber*)treeItemRowIndex {
+  if (![self instanceActive])
+    return nil;
+
+  DCHECK([self internalRole] == ax::mojom::Role::kTreeItem);
+  DCHECK([[self role] isEqualToString:NSAccessibilityRowRole]);
+
+  // First find an ancestor that establishes this tree or treegrid. We
+  // will search in this ancestor to calculate our row index.
+  BrowserAccessibility* container = [self owner]->PlatformGetParent();
+  while (container && container->GetRole() != ax::mojom::Role::kTree &&
+         container->GetRole() != ax::mojom::Role::kTreeGrid) {
+    container = container->PlatformGetParent();
+  }
+  if (!container)
+    return nil;
+
+  const BrowserAccessibilityCocoa* cocoaContainer =
+      ToBrowserAccessibilityCocoa(container);
+  int currentIndex = 0;
+  if ([cocoaContainer findRowIndex:self withCurrentIndex:&currentIndex]) {
+    return @(currentIndex);
+  }
+
+  return nil;
+}
+
+- (bool)findRowIndex:(BrowserAccessibilityCocoa*)toFind
+    withCurrentIndex:(int*)currentIndex {
+  if (![self instanceActive])
+    return false;
+
+  DCHECK([[toFind role] isEqualToString:NSAccessibilityRowRole]);
+  for (BrowserAccessibilityCocoa* childToCheck in [self children]) {
+    if ([toFind isEqual:childToCheck]) {
+      return true;
+    }
+
+    if ([[childToCheck role] isEqualToString:NSAccessibilityRowRole]) {
+      ++(*currentIndex);
+    }
+
+    if ([childToCheck findRowIndex:toFind withCurrentIndex:currentIndex]) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 - (NSNumber*)insertionPointLineNumber {
   if (![self instanceActive])
     return nil;
@@ -3409,12 +3462,15 @@
       container = container->PlatformGetParent();
     if ([subrole isEqualToString:NSAccessibilityOutlineRowSubrole] ||
         (container && container->GetRole() == ax::mojom::Role::kTreeGrid)) {
+      // clang-format off
       [ret addObjectsFromArray:@[
-        NSAccessibilityDisclosingAttribute,
+        NSAccessibilityIndexAttribute,
         NSAccessibilityDisclosedByRowAttribute,
-        NSAccessibilityDisclosureLevelAttribute,
-        NSAccessibilityDisclosedRowsAttribute
+        NSAccessibilityDisclosedRowsAttribute,
+        NSAccessibilityDisclosingAttribute,
+        NSAccessibilityDisclosureLevelAttribute
       ]];
+      // clang-format on
     } else {
       [ret addObjectsFromArray:@[ NSAccessibilityIndexAttribute ]];
     }
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 1f07747..3e5d9a7 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -13,7 +13,6 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "content/browser/accessibility/accessibility_tree_formatter_blink.h"
diff --git a/content/browser/appcache/appcache_cache_test_helper_unittest.cc b/content/browser/appcache/appcache_cache_test_helper_unittest.cc
index c37aee36..4fca886 100644
--- a/content/browser/appcache/appcache_cache_test_helper_unittest.cc
+++ b/content/browser/appcache/appcache_cache_test_helper_unittest.cc
@@ -19,7 +19,6 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/browser/appcache/appcache_group.h"
diff --git a/content/browser/background_fetch/background_fetch_registration_notifier_unittest.cc b/content/browser/background_fetch/background_fetch_registration_notifier_unittest.cc
index 3055f1f..f9f07a9 100644
--- a/content/browser/background_fetch/background_fetch_registration_notifier_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_registration_notifier_unittest.cc
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/blob_storage/blob_url_browsertest.cc b/content/browser/blob_storage/blob_url_browsertest.cc
index 3aa09af..5c7d96e 100644
--- a/content/browser/blob_storage/blob_url_browsertest.cc
+++ b/content/browser/blob_storage/blob_url_browsertest.cc
@@ -4,7 +4,6 @@
 
 #include "base/macros.h"
 #include "base/strings/pattern.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/common/content_switches.h"
diff --git a/content/browser/conversions/conversion_host_unittest.cc b/content/browser/conversions/conversion_host_unittest.cc
index 644ff24..f8337f8 100644
--- a/content/browser/conversions/conversion_host_unittest.cc
+++ b/content/browser/conversions/conversion_host_unittest.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/conversions/conversion_manager.h"
 #include "content/browser/conversions/conversion_test_utils.h"
 #include "content/browser/web_contents/web_contents_impl.h"
diff --git a/content/browser/conversions/conversion_network_sender_impl_unittest.cc b/content/browser/conversions/conversion_network_sender_impl_unittest.cc
index 87e0bfc..35bff7d 100644
--- a/content/browser/conversions/conversion_network_sender_impl_unittest.cc
+++ b/content/browser/conversions/conversion_network_sender_impl_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "content/browser/conversions/conversion_test_utils.h"
 #include "content/browser/storage_partition_impl.h"
diff --git a/content/browser/hyphenation/hyphenation_impl.cc b/content/browser/hyphenation/hyphenation_impl.cc
index bb90678..93f6d45 100644
--- a/content/browser/hyphenation/hyphenation_impl.cc
+++ b/content/browser/hyphenation/hyphenation_impl.cc
@@ -33,11 +33,11 @@
   // Keep Files open in the cache for subsequent calls.
   static base::NoDestructor<DictionaryFileMap> cache;
 
-  const auto& it = cache->find(locale);
-  if (it != cache->end())
-    return it->second.Duplicate();
   const auto& inserted = cache->insert(std::make_pair(locale, base::File()));
   base::File& file = inserted.first->second;
+  // If the |locale| is already in the cache, duplicate the file and return it.
+  if (!inserted.second)
+    return file.Duplicate();
   DCHECK(!file.IsValid());
 
 #if defined(OS_ANDROID)
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index 0af4d37..4ba596326 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/bind.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/unguessable_token.h"
 #include "content/browser/loader/navigation_loader_interceptor.h"
 #include "content/browser/loader/navigation_url_loader.h"
diff --git a/content/browser/media/media_canplaytype_browsertest.cc b/content/browser/media/media_canplaytype_browsertest.cc
index 15fa52d6..c4898da 100644
--- a/content/browser/media/media_canplaytype_browsertest.cc
+++ b/content/browser/media/media_canplaytype_browsertest.cc
@@ -7,7 +7,6 @@
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/strings/string_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/media/media_browsertest.h"
 #include "content/public/test/browser_test.h"
diff --git a/content/browser/media/media_power_experiment_manager_unittest.cc b/content/browser/media/media_power_experiment_manager_unittest.cc
index ecdc1513..0d07518 100644
--- a/content/browser/media/media_power_experiment_manager_unittest.cc
+++ b/content/browser/media/media_power_experiment_manager_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "base/version.h"
 #include "content/public/test/browser_task_environment.h"
diff --git a/content/browser/net/accept_header_browsertest.cc b/content/browser/net/accept_header_browsertest.cc
index 24c16079..2a2ccc1 100644
--- a/content/browser/net/accept_header_browsertest.cc
+++ b/content/browser/net/accept_header_browsertest.cc
@@ -133,11 +133,11 @@
 
   // ResourceType::kImage
   const char* expected_image_accept_header =
-      "image/webp,image/apng,image/*,*/*;q=0.8";
+      "image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
 #if BUILDFLAG(ENABLE_AV1_DECODER)
   if (base::FeatureList::IsEnabled(blink::features::kAVIF)) {
     expected_image_accept_header =
-        "image/avif,image/webp,image/apng,image/*,*/*;q=0.8";
+        "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
   }
 #endif
   EXPECT_EQ(expected_image_accept_header, GetFor("/image.gif"));
diff --git a/content/browser/renderer_host/direct_manipulation_win_browsertest.cc b/content/browser/renderer_host/direct_manipulation_win_browsertest.cc
index f622ba8..c9997cc6 100644
--- a/content/browser/renderer_host/direct_manipulation_win_browsertest.cc
+++ b/content/browser/renderer_host/direct_manipulation_win_browsertest.cc
@@ -4,7 +4,6 @@
 
 #include "content/browser/renderer_host/direct_manipulation_helper_win.h"
 
-#include "base/test/scoped_feature_list.h"
 #include "base/win/windows_version.h"
 #include "content/browser/renderer_host/direct_manipulation_test_helper_win.h"
 #include "content/browser/renderer_host/legacy_render_widget_host_win.h"
diff --git a/content/browser/renderer_host/direct_manipulation_win_unittest.cc b/content/browser/renderer_host/direct_manipulation_win_unittest.cc
index d237708..5a169f62 100644
--- a/content/browser/renderer_host/direct_manipulation_win_unittest.cc
+++ b/content/browser/renderer_host/direct_manipulation_win_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <objbase.h>
 
-#include "base/test/scoped_feature_list.h"
 #include "base/win/windows_version.h"
 #include "content/browser/renderer_host/direct_manipulation_test_helper_win.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/content/browser/renderer_host/frame_tree_browsertest.cc b/content/browser/renderer_host/frame_tree_browsertest.cc
index 4737d241..197481e 100644
--- a/content/browser/renderer_host/frame_tree_browsertest.cc
+++ b/content/browser/renderer_host/frame_tree_browsertest.cc
@@ -5,7 +5,6 @@
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/strings/stringprintf.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/frame_tree.h"
 #include "content/browser/renderer_host/frame_tree_node.h"
diff --git a/content/browser/renderer_host/input/input_event_browsertest.cc b/content/browser/renderer_host/input/input_event_browsertest.cc
index f63cdee..b8125cc 100644
--- a/content/browser/renderer_host/input/input_event_browsertest.cc
+++ b/content/browser/renderer_host/input/input_event_browsertest.cc
@@ -7,7 +7,6 @@
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/input/synthetic_gesture_controller.h"
 #include "content/browser/renderer_host/input/synthetic_gesture_target.h"
diff --git a/content/browser/renderer_host/input/scroll_behavior_browsertest.cc b/content/browser/renderer_host/input/scroll_behavior_browsertest.cc
index e3fdec9..f092358 100644
--- a/content/browser/renderer_host/input/scroll_behavior_browsertest.cc
+++ b/content/browser/renderer_host/input/scroll_behavior_browsertest.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "cc/base/switches.h"
 #include "content/browser/renderer_host/input/synthetic_gesture.h"
diff --git a/content/browser/renderer_host/input/touch_action_browsertest.cc b/content/browser/renderer_host/input/touch_action_browsertest.cc
index b56634b2..251e8fd 100644
--- a/content/browser/renderer_host/input/touch_action_browsertest.cc
+++ b/content/browser/renderer_host/input/touch_action_browsertest.cc
@@ -12,7 +12,6 @@
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/input/synthetic_gesture.h"
 #include "content/browser/renderer_host/input/synthetic_gesture_controller.h"
diff --git a/content/browser/renderer_host/input/touch_action_filter_unittest.cc b/content/browser/renderer_host/input/touch_action_filter_unittest.cc
index 7535369..9802f1d 100644
--- a/content/browser/renderer_host/input/touch_action_filter_unittest.cc
+++ b/content/browser/renderer_host/input/touch_action_filter_unittest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "content/browser/renderer_host/input/touch_action_filter.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/renderer_host/event_with_latency_info.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 4fb60640..a1781a8 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -449,7 +449,7 @@
 
   // Navigate with Javascript.
   {
-    GURL navigate_url = embedded_test_server()->base_url();
+    GURL navigate_url = embedded_test_server()->GetURL("/title1.html");
     std::string script = JsReplace("document.location = $1", navigate_url);
     TestNavigationObserver same_tab_observer(shell()->web_contents(), 1);
     EXPECT_TRUE(ExecJs(shell(), script));
@@ -9998,8 +9998,10 @@
   // gesture.
   GURL a1_url(embedded_test_server()->GetURL("/title2.html"));
   GURL a2_url(embedded_test_server()->GetURL("/title3.html"));
-  GURL a3_url(embedded_test_server()->GetURL("/simple_page_1.html"));
-  GURL a4_url(embedded_test_server()->GetURL("/simple_page_2.html"));
+  GURL a3_url(embedded_test_server()->GetURL(
+      "/navigation_controller/simple_page_1.html"));
+  GURL a4_url(embedded_test_server()->GetURL(
+      "/navigation_controller/simple_page_2.html"));
   std::string script("history.pushState('', '','" + a1_url.spec() + "');");
   ASSERT_TRUE(ExecJs(shell()->web_contents(), script));
   script = "history.pushState('', '','" + a2_url.spec() + "');";
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index d6f1713..d749cc9e 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -6971,10 +6971,8 @@
 
   // 5) Do a replaceState to another URL.
   {
-    GURL url_2(embedded_test_server()->GetURL("/title2.html"));
     TestNavigationObserver observer(web_contents);
-    std::string script =
-        "history.replaceState({}, '', '/" + url_2.spec() + "')";
+    std::string script = "history.replaceState({}, '', '/title2.html')";
     EXPECT_TRUE(ExecJs(root, script));
     observer.Wait();
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc b/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc
index b082b61..7333a39 100644
--- a/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/content/browser/service_worker/service_worker_clients_api_browsertest.cc b/content/browser/service_worker/service_worker_clients_api_browsertest.cc
index e4d7553e..58176494 100644
--- a/content/browser/service_worker/service_worker_clients_api_browsertest.cc
+++ b/content/browser/service_worker/service_worker_clients_api_browsertest.cc
@@ -15,7 +15,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/service_worker/service_worker_version.h"
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index efc8515..f55fa57f 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "components/offline_pages/buildflags/buildflags.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
 #include "content/browser/service_worker/service_worker_container_host.h"
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender.cc b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
index 0fe6c6e..a5a344d 100644
--- a/content/browser/service_worker/service_worker_installed_scripts_sender.cc
+++ b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
@@ -204,8 +204,13 @@
       if (owner_->context()) {
         ServiceWorkerRegistration* registration =
             owner_->context()->GetLiveRegistration(owner_->registration_id());
-        // This can destruct |this|.
-        registration->ForceDelete();
+        DCHECK(registration);
+        // Check if the registation is still alive. The registration may have
+        // already been deleted while this service worker was running.
+        if (!registration->is_uninstalled()) {
+          // This can destruct |this|.
+          registration->ForceDelete();
+        }
       }
       return;
     case ServiceWorkerInstalledScriptReader::FinishedReason::
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc b/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
index 28aa8ed..09296c0c 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/loader/navigation_loader_interceptor.h"
 #include "content/browser/loader/single_request_url_loader_factory.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
diff --git a/content/browser/service_worker/service_worker_process_manager_unittest.cc b/content/browser/service_worker/service_worker_process_manager_unittest.cc
index 49397d7..e988be5 100644
--- a/content/browser/service_worker/service_worker_process_manager_unittest.cc
+++ b/content/browser/service_worker/service_worker_process_manager_unittest.cc
@@ -7,7 +7,6 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/browser/storage_partition_impl.h"
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc
index 3809fae..014b0a9 100644
--- a/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -18,7 +18,6 @@
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/service_worker/service_worker_registry_unittest.cc b/content/browser/service_worker/service_worker_registry_unittest.cc
index 9f7a6a5..199b5be 100644
--- a/content/browser/service_worker/service_worker_registry_unittest.cc
+++ b/content/browser/service_worker/service_worker_registry_unittest.cc
@@ -12,6 +12,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_utils.h"
+#include "net/base/test_completion_callback.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
@@ -24,11 +25,24 @@
 
 namespace {
 
+struct ReadResponseHeadResult {
+  int result;
+  network::mojom::URLResponseHeadPtr response_head;
+  base::Optional<mojo_base::BigBuffer> metadata;
+};
+
 struct GetStorageUsageForOriginResult {
   blink::ServiceWorkerStatusCode status;
   int64_t usage;
 };
 
+storage::mojom::ServiceWorkerResourceRecordPtr
+CreateResourceRecord(int64_t resource_id, const GURL& url, int64_t size_bytes) {
+  EXPECT_TRUE(url.is_valid());
+  return storage::mojom::ServiceWorkerResourceRecord::New(resource_id, url,
+                                                          size_bytes);
+}
+
 void FindCallback(base::OnceClosure quit_closure,
                   base::Optional<blink::ServiceWorkerStatusCode>* result,
                   scoped_refptr<ServiceWorkerRegistration>* found,
@@ -39,6 +53,180 @@
   std::move(quit_closure).Run();
 }
 
+int WriteResponse(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id,
+    const std::string& headers,
+    mojo_base::BigBuffer body) {
+  mojo::Remote<storage::mojom::ServiceWorkerResourceWriter> writer;
+  storage->CreateResourceWriter(id, writer.BindNewPipeAndPassReceiver());
+
+  int rv = 0;
+  {
+    auto response_head = network::mojom::URLResponseHead::New();
+    response_head->request_time = base::Time::Now();
+    response_head->response_time = base::Time::Now();
+    response_head->headers = new net::HttpResponseHeaders(headers);
+    response_head->content_length = body.size();
+
+    base::RunLoop loop;
+    writer->WriteResponseHead(std::move(response_head),
+                              base::BindLambdaForTesting([&](int result) {
+                                rv = result;
+                                loop.Quit();
+                              }));
+    loop.Run();
+    if (rv < 0)
+      return rv;
+  }
+
+  {
+    base::RunLoop loop;
+    writer->WriteData(std::move(body),
+                      base::BindLambdaForTesting([&](int result) {
+                        rv = result;
+                        loop.Quit();
+                      }));
+    loop.Run();
+  }
+
+  return rv;
+}
+
+int WriteStringResponse(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id,
+    const std::string& headers,
+    const std::string& body) {
+  mojo_base::BigBuffer buffer(
+      base::as_bytes(base::make_span(body.data(), body.length())));
+  return WriteResponse(storage, id, headers, std::move(buffer));
+}
+
+int WriteBasicResponse(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id) {
+  const char kHttpHeaders[] = "HTTP/1.0 200 HONKYDORY\0Content-Length: 5\0\0";
+  const char kHttpBody[] = "Hello";
+  std::string headers(kHttpHeaders, base::size(kHttpHeaders));
+  return WriteStringResponse(storage, id, headers, std::string(kHttpBody));
+}
+
+ReadResponseHeadResult ReadResponseHead(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id) {
+  mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
+  storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
+
+  ReadResponseHeadResult out;
+  base::RunLoop loop;
+  reader->ReadResponseHead(base::BindLambdaForTesting(
+      [&](int result, network::mojom::URLResponseHeadPtr response_head,
+          base::Optional<mojo_base::BigBuffer> metadata) {
+        out.result = result;
+        out.response_head = std::move(response_head);
+        out.metadata = std::move(metadata);
+        loop.Quit();
+      }));
+  loop.Run();
+  return out;
+}
+
+bool VerifyBasicResponse(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id,
+    bool expected_positive_result) {
+  const std::string kExpectedHttpBody("Hello");
+  ReadResponseHeadResult out = ReadResponseHead(storage, id);
+  if (expected_positive_result)
+    EXPECT_LT(0, out.result);
+  if (out.result <= 0)
+    return false;
+
+  mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
+  storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
+
+  const int kBigEnough = 512;
+  MockServiceWorkerDataPipeStateNotifier notifier;
+  mojo::ScopedDataPipeConsumerHandle data_consumer;
+  base::RunLoop loop;
+  reader->ReadData(
+      kBigEnough, notifier.BindNewPipeAndPassRemote(),
+      base::BindLambdaForTesting([&](mojo::ScopedDataPipeConsumerHandle pipe) {
+        data_consumer = std::move(pipe);
+        loop.Quit();
+      }));
+  loop.Run();
+
+  std::string body = ReadDataPipe(std::move(data_consumer));
+  int rv = notifier.WaitUntilComplete();
+
+  EXPECT_EQ(static_cast<int>(kExpectedHttpBody.size()), rv);
+  if (rv <= 0)
+    return false;
+
+  bool status_match =
+      std::string("HONKYDORY") == out.response_head->headers->GetStatusText();
+  bool data_match = kExpectedHttpBody == body;
+
+  EXPECT_EQ(out.response_head->headers->GetStatusText(), "HONKYDORY");
+  EXPECT_EQ(body, kExpectedHttpBody);
+  return status_match && data_match;
+}
+
+int WriteResponseMetadata(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id,
+    const std::string& metadata) {
+  mojo_base::BigBuffer buffer(
+      base::as_bytes(base::make_span(metadata.data(), metadata.length())));
+
+  mojo::Remote<storage::mojom::ServiceWorkerResourceMetadataWriter>
+      metadata_writer;
+  storage->CreateResourceMetadataWriter(
+      id, metadata_writer.BindNewPipeAndPassReceiver());
+  int rv = 0;
+  base::RunLoop loop;
+  metadata_writer->WriteMetadata(std::move(buffer),
+                                 base::BindLambdaForTesting([&](int result) {
+                                   rv = result;
+                                   loop.Quit();
+                                 }));
+  loop.Run();
+  return rv;
+}
+
+int WriteMetadata(ServiceWorkerVersion* version,
+                  const GURL& url,
+                  const std::string& metadata) {
+  const std::vector<uint8_t> data(metadata.begin(), metadata.end());
+  EXPECT_TRUE(version);
+  net::TestCompletionCallback cb;
+  version->script_cache_map()->WriteMetadata(url, data, cb.callback());
+  return cb.WaitForResult();
+}
+
+int ClearMetadata(ServiceWorkerVersion* version, const GURL& url) {
+  EXPECT_TRUE(version);
+  net::TestCompletionCallback cb;
+  version->script_cache_map()->ClearMetadata(url, cb.callback());
+  return cb.WaitForResult();
+}
+
+bool VerifyResponseMetadata(
+    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
+    int64_t id,
+    const std::string& expected_metadata) {
+  mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
+  storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
+  ReadResponseHeadResult out = ReadResponseHead(storage, id);
+  if (!out.metadata.has_value())
+    return false;
+  EXPECT_EQ(0, memcmp(expected_metadata.data(), out.metadata->data(),
+                      expected_metadata.length()));
+  return true;
+}
+
 // This is a sample public key for testing the API. The corresponding private
 // key (use this to generate new samples for this test file) is:
 //
@@ -77,6 +265,9 @@
 
   ServiceWorkerContextCore* context() { return helper_->context(); }
   ServiceWorkerRegistry* registry() { return context()->registry(); }
+  mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage_control() {
+    return registry()->GetRemoteStorageControl();
+  }
 
   storage::MockSpecialStoragePolicy* special_storage_policy() {
     return special_storage_policy_.get();
@@ -136,6 +327,21 @@
     return result;
   }
 
+  blink::ServiceWorkerStatusCode DeleteRegistration(
+      scoped_refptr<ServiceWorkerRegistration> registration,
+      const GURL& origin) {
+    blink::ServiceWorkerStatusCode result;
+    base::RunLoop loop;
+    registry()->DeleteRegistration(
+        registration, origin,
+        base::BindLambdaForTesting([&](blink::ServiceWorkerStatusCode status) {
+          result = status;
+          loop.Quit();
+        }));
+    loop.Run();
+    return result;
+  }
+
   GetStorageUsageForOriginResult GetStorageUsageForOrigin(
       const url::Origin& origin) {
     GetStorageUsageForOriginResult result;
@@ -167,6 +373,35 @@
     return result.value();
   }
 
+  std::vector<int64_t> GetPurgeableResourceIds() {
+    std::vector<int64_t> ids;
+    base::RunLoop loop;
+    storage_control()->GetPurgeableResourceIdsForTest(
+        base::BindLambdaForTesting(
+            [&](ServiceWorkerDatabase::Status status,
+                const std::vector<int64_t>& resource_ids) {
+              EXPECT_EQ(status, ServiceWorkerDatabase::Status::kOk);
+              ids = resource_ids;
+              loop.Quit();
+            }));
+    loop.Run();
+    return ids;
+  }
+
+  std::vector<int64_t> GetPurgingResources() {
+    std::vector<int64_t> ids;
+    base::RunLoop loop;
+    storage_control()->GetPurgingResourceIdsForTest(base::BindLambdaForTesting(
+        [&](ServiceWorkerDatabase::Status status,
+            const std::vector<int64_t>& resource_ids) {
+          EXPECT_EQ(status, ServiceWorkerDatabase::Status::kOk);
+          ids = resource_ids;
+          loop.Quit();
+        }));
+    loop.Run();
+    return ids;
+  }
+
  private:
   // |user_data_directory_| must be declared first to preserve destructor order.
   base::ScopedTempDir user_data_directory_;
@@ -633,4 +868,395 @@
   EXPECT_EQ(kFeature2Token2, found_tokens.at("Feature2")[1]);
 }
 
+class ServiceWorkerRegistryResourceTest : public ServiceWorkerRegistryTest {
+ public:
+  void SetUp() override {
+    ServiceWorkerRegistryTest::SetUp();
+
+    scope_ = GURL("http://www.test.not/scope/");
+    script_ = GURL("http://www.test.not/script.js");
+    import_ = GURL("http://www.test.not/import.js");
+    document_url_ = GURL("http://www.test.not/scope/document.html");
+    resource_id1_ = GetNewResourceIdSync(storage_control());
+    resource_id2_ = GetNewResourceIdSync(storage_control());
+    resource_id1_size_ = 239193;
+    resource_id2_size_ = 59923;
+
+    // Cons up a new registration+version with two script resources.
+    blink::mojom::ServiceWorkerRegistrationOptions options;
+    options.scope = scope_;
+    registration_ = CreateNewServiceWorkerRegistration(registry(), options);
+    scoped_refptr<ServiceWorkerVersion> version = CreateNewServiceWorkerVersion(
+        registry(), registration_.get(), script_, options.type);
+    version->set_fetch_handler_existence(
+        ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+    version->SetStatus(ServiceWorkerVersion::INSTALLED);
+
+    std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> resources;
+    resources.push_back(
+        CreateResourceRecord(resource_id1_, script_, resource_id1_size_));
+    resources.push_back(
+        CreateResourceRecord(resource_id2_, import_, resource_id2_size_));
+    version->script_cache_map()->SetResources(resources);
+
+    registration_->SetWaitingVersion(version);
+
+    registration_id_ = registration_->id();
+    version_id_ = version->version_id();
+
+    // Add the resources ids to the uncommitted list.
+    registry()->StoreUncommittedResourceId(resource_id1_, scope_);
+    registry()->StoreUncommittedResourceId(resource_id2_, scope_);
+    // Make sure that StoreUncommittedResourceId mojo message is received.
+    storage_control().FlushForTesting();
+
+    std::vector<int64_t> verify_ids = GetUncommittedResourceIds();
+    EXPECT_EQ(2u, verify_ids.size());
+
+    // And dump something in the disk cache for them.
+    WriteBasicResponse(storage_control(), resource_id1_);
+    WriteBasicResponse(storage_control(), resource_id2_);
+    EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+    EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
+
+    // Storing the registration/version should take the resources ids out
+    // of the uncommitted list.
+    EXPECT_EQ(
+        blink::ServiceWorkerStatusCode::kOk,
+        StoreRegistration(registration_, registration_->waiting_version()));
+    verify_ids = GetUncommittedResourceIds();
+    EXPECT_TRUE(verify_ids.empty());
+  }
+
+  std::vector<int64_t> GetUncommittedResourceIds() {
+    std::vector<int64_t> ids;
+    base::RunLoop loop;
+    storage_control()->GetUncommittedResourceIdsForTest(
+        base::BindLambdaForTesting(
+            [&](ServiceWorkerDatabase::Status status,
+                const std::vector<int64_t>& resource_ids) {
+              EXPECT_EQ(status, ServiceWorkerDatabase::Status::kOk);
+              ids = resource_ids;
+              loop.Quit();
+            }));
+    loop.Run();
+    return ids;
+  }
+
+ protected:
+  GURL scope_;
+  GURL script_;
+  GURL import_;
+  GURL document_url_;
+  int64_t registration_id_;
+  int64_t version_id_;
+  int64_t resource_id1_;
+  uint64_t resource_id1_size_;
+  int64_t resource_id2_;
+  uint64_t resource_id2_size_;
+  scoped_refptr<ServiceWorkerRegistration> registration_;
+};
+
+TEST_F(ServiceWorkerRegistryResourceTest,
+       WriteMetadataWithServiceWorkerResponseMetadataWriter) {
+  const char kMetadata1[] = "Test metadata";
+  const char kMetadata2[] = "small";
+  int64_t new_resource_id_ = GetNewResourceIdSync(storage_control());
+  // Writing metadata to nonexistent resoirce ID must fail.
+  EXPECT_GE(0, WriteResponseMetadata(storage_control(), new_resource_id_,
+                                     kMetadata1));
+
+  // Check metadata is written.
+  EXPECT_EQ(
+      static_cast<int>(strlen(kMetadata1)),
+      WriteResponseMetadata(storage_control(), resource_id1_, kMetadata1));
+  EXPECT_TRUE(
+      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata1));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+
+  // Check metadata is written and truncated.
+  EXPECT_EQ(
+      static_cast<int>(strlen(kMetadata2)),
+      WriteResponseMetadata(storage_control(), resource_id1_, kMetadata2));
+  EXPECT_TRUE(
+      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata2));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+
+  // Check metadata is deleted.
+  EXPECT_EQ(0, WriteResponseMetadata(storage_control(), resource_id1_, ""));
+  EXPECT_FALSE(VerifyResponseMetadata(storage_control(), resource_id1_, ""));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest,
+       WriteMetadataWithServiceWorkerScriptCacheMap) {
+  const char kMetadata1[] = "Test metadata";
+  const char kMetadata2[] = "small";
+  ServiceWorkerVersion* version = registration_->waiting_version();
+  EXPECT_TRUE(version);
+
+  // Writing metadata to nonexistent URL must fail.
+  EXPECT_GE(0,
+            WriteMetadata(version, GURL("http://www.test.not/nonexistent.js"),
+                          kMetadata1));
+  // Clearing metadata of nonexistent URL must fail.
+  EXPECT_GE(0,
+            ClearMetadata(version, GURL("http://www.test.not/nonexistent.js")));
+
+  // Check metadata is written.
+  EXPECT_EQ(static_cast<int>(strlen(kMetadata1)),
+            WriteMetadata(version, script_, kMetadata1));
+  EXPECT_TRUE(
+      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata1));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+
+  // Check metadata is written and truncated.
+  EXPECT_EQ(static_cast<int>(strlen(kMetadata2)),
+            WriteMetadata(version, script_, kMetadata2));
+  EXPECT_TRUE(
+      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata2));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+
+  // Check metadata is deleted.
+  EXPECT_EQ(0, ClearMetadata(version, script_));
+  EXPECT_FALSE(VerifyResponseMetadata(storage_control(), resource_id1_, ""));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest, DeleteRegistration_NoLiveVersion) {
+  // Deleting the registration should result in the resources being added to the
+  // purgeable list and then doomed in the disk cache and removed from that
+  // list.
+  base::RunLoop loop;
+  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
+            DeleteRegistration(registration_, scope_.GetOrigin()));
+  // At this point registration_->waiting_version() has a remote reference, so
+  // the resources should be in the purgeable list.
+  EXPECT_EQ(2u, GetPurgeableResourceIds().size());
+
+  registration_->SetWaitingVersion(nullptr);
+  loop.Run();
+
+  // registration_->waiting_version() is cleared. The resources should be
+  // purged at this point.
+  EXPECT_TRUE(GetPurgeableResourceIds().empty());
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest, DeleteRegistration_WaitingVersion) {
+  // Deleting the registration should result in the resources being added to the
+  // purgeable list and then doomed in the disk cache and removed from that
+  // list.
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
+            DeleteRegistration(registration_, scope_.GetOrigin()));
+  EXPECT_EQ(2u, GetPurgeableResourceIds().size());
+
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+
+  // Doom the version. The resources should be purged.
+  base::RunLoop loop;
+  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
+  registration_->waiting_version()->Doom();
+  loop.Run();
+  EXPECT_TRUE(GetPurgeableResourceIds().empty());
+
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest, DeleteRegistration_ActiveVersion) {
+  // Promote the worker to active and add a controllee.
+  registration_->SetActiveVersion(registration_->waiting_version());
+  registration_->active_version()->SetStatus(ServiceWorkerVersion::ACTIVATED);
+  registry()->UpdateToActiveState(registration_->id(),
+                                  registration_->scope().GetOrigin(),
+                                  base::DoNothing());
+  ServiceWorkerRemoteContainerEndpoint remote_endpoint;
+  base::WeakPtr<ServiceWorkerContainerHost> container_host =
+      CreateContainerHostForWindow(33 /* dummy render process id */,
+                                   true /* is_parent_frame_secure */,
+                                   context()->AsWeakPtr(), &remote_endpoint);
+  registration_->active_version()->AddControllee(container_host.get());
+
+  // Deleting the registration should move the resources to the purgeable list
+  // but keep them available.
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
+            DeleteRegistration(registration_, scope_.GetOrigin()));
+  EXPECT_EQ(2u, GetPurgeableResourceIds().size());
+
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
+
+  // Dooming the version should cause the resources to be deleted.
+  base::RunLoop loop;
+  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
+  registration_->active_version()->RemoveControllee(
+      container_host->client_uuid());
+  registration_->active_version()->Doom();
+  loop.Run();
+  EXPECT_TRUE(GetPurgeableResourceIds().empty());
+
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest, UpdateRegistration) {
+  // Promote the worker to active worker and add a controllee.
+  registration_->SetActiveVersion(registration_->waiting_version());
+  registration_->active_version()->SetStatus(ServiceWorkerVersion::ACTIVATED);
+  registry()->UpdateToActiveState(registration_->id(),
+                                  registration_->scope().GetOrigin(),
+                                  base::DoNothing());
+  ServiceWorkerRemoteContainerEndpoint remote_endpoint;
+  base::WeakPtr<ServiceWorkerContainerHost> container_host =
+      CreateContainerHostForWindow(33 /* dummy render process id */,
+                                   true /* is_parent_frame_secure */,
+                                   context()->AsWeakPtr(), &remote_endpoint);
+  registration_->active_version()->AddControllee(container_host.get());
+
+  // Make an updated registration.
+  scoped_refptr<ServiceWorkerVersion> live_version =
+      CreateNewServiceWorkerVersion(registry(), registration_.get(), script_,
+                                    blink::mojom::ScriptType::kClassic);
+  live_version->SetStatus(ServiceWorkerVersion::NEW);
+  registration_->SetWaitingVersion(live_version);
+  std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> records;
+  records.push_back(CreateResourceRecord(10, live_version->script_url(), 100));
+  live_version->script_cache_map()->SetResources(records);
+  live_version->set_fetch_handler_existence(
+      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+
+  // Writing the registration should move the old version's resources to the
+  // purgeable list but keep them available.
+  EXPECT_EQ(
+      blink::ServiceWorkerStatusCode::kOk,
+      StoreRegistration(registration_.get(), registration_->waiting_version()));
+  EXPECT_EQ(2u, GetPurgeableResourceIds().size());
+  EXPECT_TRUE(GetPurgingResources().empty());
+
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+
+  // Remove the controllee to allow the new version to become active, making the
+  // old version redundant.
+  base::RunLoop loop;
+  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
+  scoped_refptr<ServiceWorkerVersion> old_version(
+      registration_->active_version());
+  old_version->RemoveControllee(container_host->client_uuid());
+  registration_->ActivateWaitingVersionWhenReady();
+  EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, old_version->status());
+
+  // Its resources should be purged.
+  loop.Run();
+  EXPECT_TRUE(GetPurgeableResourceIds().empty());
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest, UpdateRegistration_NoLiveVersion) {
+  // Promote the worker to active worker and add a controllee.
+  registration_->SetActiveVersion(registration_->waiting_version());
+  registry()->UpdateToActiveState(registration_->id(),
+                                  registration_->scope().GetOrigin(),
+                                  base::DoNothing());
+
+  // Make an updated registration.
+  scoped_refptr<ServiceWorkerVersion> live_version =
+      CreateNewServiceWorkerVersion(registry(), registration_.get(), script_,
+                                    blink::mojom::ScriptType::kClassic);
+  live_version->SetStatus(ServiceWorkerVersion::NEW);
+  registration_->SetWaitingVersion(live_version);
+  std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> records;
+  records.push_back(CreateResourceRecord(10, live_version->script_url(), 100));
+  live_version->script_cache_map()->SetResources(records);
+  live_version->set_fetch_handler_existence(
+      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+
+  // Writing the registration should purge the old version's resources,
+  // since it's not live.
+  base::RunLoop loop;
+  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
+  EXPECT_EQ(
+      blink::ServiceWorkerStatusCode::kOk,
+      StoreRegistration(registration_.get(), registration_->waiting_version()));
+  EXPECT_EQ(2u, GetPurgeableResourceIds().size());
+
+  // Destroy the active version.
+  registration_->UnsetVersion(registration_->active_version());
+
+  // The resources should be purged.
+  loop.Run();
+  EXPECT_TRUE(GetPurgeableResourceIds().empty());
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+}
+
+TEST_F(ServiceWorkerRegistryResourceTest, CleanupOnRestart) {
+  // Promote the worker to active and add a controllee.
+  registration_->SetActiveVersion(registration_->waiting_version());
+  registration_->active_version()->SetStatus(ServiceWorkerVersion::ACTIVATED);
+  registration_->SetWaitingVersion(nullptr);
+  registry()->UpdateToActiveState(registration_->id(),
+                                  registration_->scope().GetOrigin(),
+                                  base::DoNothing());
+  ServiceWorkerRemoteContainerEndpoint remote_endpoint;
+  base::WeakPtr<ServiceWorkerContainerHost> container_host =
+      CreateContainerHostForWindow(33 /* dummy render process id */,
+                                   true /* is_parent_frame_secure */,
+                                   context()->AsWeakPtr(), &remote_endpoint);
+  registration_->active_version()->AddControllee(container_host.get());
+
+  // Deleting the registration should move the resources to the purgeable list
+  // but keep them available.
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
+            DeleteRegistration(registration_, scope_.GetOrigin()));
+  std::vector<int64_t> verify_ids = GetPurgeableResourceIds();
+  EXPECT_EQ(2u, verify_ids.size());
+
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
+
+  // Also add an uncommitted resource.
+  int64_t kStaleUncommittedResourceId = GetNewResourceIdSync(storage_control());
+  registry()->StoreUncommittedResourceId(kStaleUncommittedResourceId,
+                                         registration_->scope());
+  // Make sure that StoreUncommittedResourceId mojo message is received.
+  storage_control().FlushForTesting();
+  verify_ids = GetUncommittedResourceIds();
+  EXPECT_EQ(1u, verify_ids.size());
+  WriteBasicResponse(storage_control(), kStaleUncommittedResourceId);
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(),
+                                  kStaleUncommittedResourceId, true));
+
+  // Simulate browser shutdown. The purgeable and uncommitted resources are now
+  // stale.
+  SimulateRestart();
+
+  // Store a new uncommitted resource. This triggers stale resource cleanup.
+  base::RunLoop loop;
+  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
+  int64_t kNewResourceId = GetNewResourceIdSync(storage_control());
+  WriteBasicResponse(storage_control(), kNewResourceId);
+  registry()->StoreUncommittedResourceId(kNewResourceId,
+                                         registration_->scope());
+  loop.Run();
+
+  // The stale resources should be purged, but the new resource should persist.
+  verify_ids = GetUncommittedResourceIds();
+  ASSERT_EQ(1u, verify_ids.size());
+  EXPECT_EQ(kNewResourceId, *verify_ids.begin());
+
+  verify_ids = GetPurgeableResourceIds();
+  EXPECT_TRUE(verify_ids.empty());
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
+  EXPECT_FALSE(VerifyBasicResponse(storage_control(),
+                                   kStaleUncommittedResourceId, false));
+  EXPECT_TRUE(VerifyBasicResponse(storage_control(), kNewResourceId, true));
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc b/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc
index d97e257b..25bf19b 100644
--- a/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc
+++ b/content/browser/service_worker/service_worker_script_loader_factory_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind_helpers.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_registration.h"
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc b/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc
index c544555..434b379 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc
+++ b/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/containers/queue.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/service_worker/service_worker_test_utils.h"
 #include "content/public/test/browser_task_environment.h"
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h
index ee113c1..00a5f08 100644
--- a/content/browser/service_worker/service_worker_storage.h
+++ b/content/browser/service_worker/service_worker_storage.h
@@ -43,9 +43,6 @@
 namespace service_worker_storage_unittest {
 class ServiceWorkerStorageTest;
 class ServiceWorkerStorageDiskTest;
-class ServiceWorkerResourceStorageTest;
-class ServiceWorkerResourceStorageDiskTest;
-FORWARD_DECLARE_TEST(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart);
 FORWARD_DECLARE_TEST(ServiceWorkerStorageDiskTest, DeleteAndStartOver);
 FORWARD_DECLARE_TEST(ServiceWorkerStorageDiskTest,
                      DeleteAndStartOver_UnrelatedFileExists);
@@ -298,11 +295,6 @@
  private:
   friend class ServiceWorkerStorageControlImplTest;
   friend class service_worker_storage_unittest::ServiceWorkerStorageTest;
-  friend class service_worker_storage_unittest::
-      ServiceWorkerResourceStorageTest;
-  FRIEND_TEST_ALL_PREFIXES(
-      service_worker_storage_unittest::ServiceWorkerResourceStorageDiskTest,
-      CleanupOnRestart);
   FRIEND_TEST_ALL_PREFIXES(
       service_worker_storage_unittest::ServiceWorkerStorageDiskTest,
       DeleteAndStartOver);
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc
index f7b78fe..93154e70 100644
--- a/content/browser/service_worker/service_worker_storage_unittest.cc
+++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -69,6 +69,29 @@
                                                           size_bytes);
 }
 
+storage::mojom::ServiceWorkerRegistrationDataPtr CreateRegistrationData(
+    int64_t registration_id,
+    int64_t version_id,
+    const GURL& scope,
+    const GURL& script_url,
+    const std::vector<ResourceRecord>& resources) {
+  auto data = storage::mojom::ServiceWorkerRegistrationData::New();
+  data->registration_id = registration_id;
+  data->version_id = version_id;
+  data->scope = scope;
+  data->script = script_url;
+  data->navigation_preload_state = blink::mojom::NavigationPreloadState::New();
+  data->is_active = true;
+
+  int64_t resources_total_size_bytes = 0;
+  for (auto& resource : resources) {
+    resources_total_size_bytes += resource->size_bytes;
+  }
+  data->resources_total_size_bytes = resources_total_size_bytes;
+
+  return data;
+}
+
 void StatusCallback(base::OnceClosure quit_closure,
                     base::Optional<blink::ServiceWorkerStatusCode>* result,
                     blink::ServiceWorkerStatusCode status) {
@@ -105,6 +128,10 @@
   std::move(quit).Run();
 }
 
+// TODO(crbug.com/1016064): Remove the following helper functions to read/write
+// resources once all tests that use these helper functions are moved to
+// service_worker_registry_unittest.cc
+
 int WriteResponse(
     mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
     int64_t id,
@@ -184,48 +211,6 @@
   return out;
 }
 
-bool VerifyBasicResponse(
-    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
-    int64_t id,
-    bool expected_positive_result) {
-  const std::string kExpectedHttpBody("Hello");
-  ReadResponseHeadResult out = ReadResponseHead(storage, id);
-  if (expected_positive_result)
-    EXPECT_LT(0, out.result);
-  if (out.result <= 0)
-    return false;
-
-  mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
-  storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
-
-  const int kBigEnough = 512;
-  MockServiceWorkerDataPipeStateNotifier notifier;
-  mojo::ScopedDataPipeConsumerHandle data_consumer;
-  base::RunLoop loop;
-  reader->ReadData(
-      kBigEnough, notifier.BindNewPipeAndPassRemote(),
-      base::BindLambdaForTesting([&](mojo::ScopedDataPipeConsumerHandle pipe) {
-        data_consumer = std::move(pipe);
-        loop.Quit();
-      }));
-  loop.Run();
-
-  std::string body = ReadDataPipe(std::move(data_consumer));
-  int rv = notifier.WaitUntilComplete();
-
-  EXPECT_EQ(static_cast<int>(kExpectedHttpBody.size()), rv);
-  if (rv <= 0)
-    return false;
-
-  bool status_match =
-      std::string("HONKYDORY") == out.response_head->headers->GetStatusText();
-  bool data_match = kExpectedHttpBody == body;
-
-  EXPECT_EQ(out.response_head->headers->GetStatusText(), "HONKYDORY");
-  EXPECT_EQ(body, kExpectedHttpBody);
-  return status_match && data_match;
-}
-
 int WriteResponseMetadata(
     mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
     int64_t id,
@@ -248,37 +233,6 @@
   return rv;
 }
 
-int WriteMetadata(ServiceWorkerVersion* version,
-                  const GURL& url,
-                  const std::string& metadata) {
-  const std::vector<uint8_t> data(metadata.begin(), metadata.end());
-  EXPECT_TRUE(version);
-  TestCompletionCallback cb;
-  version->script_cache_map()->WriteMetadata(url, data, cb.callback());
-  return cb.WaitForResult();
-}
-
-int ClearMetadata(ServiceWorkerVersion* version, const GURL& url) {
-  EXPECT_TRUE(version);
-  TestCompletionCallback cb;
-  version->script_cache_map()->ClearMetadata(url, cb.callback());
-  return cb.WaitForResult();
-}
-
-bool VerifyResponseMetadata(
-    mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
-    int64_t id,
-    const std::string& expected_metadata) {
-  mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
-  storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
-  ReadResponseHeadResult out = ReadResponseHead(storage, id);
-  if (!out.metadata.has_value())
-    return false;
-  EXPECT_EQ(0, memcmp(expected_metadata.data(), out.metadata->data(),
-                      expected_metadata.length()));
-  return true;
-}
-
 class ServiceWorkerStorageTest : public testing::Test {
  public:
   ServiceWorkerStorageTest()
@@ -635,53 +589,23 @@
     return ids;
   }
 
-  // Directly writes a registration using
-  // ServiceWorkerDatabase::WriteRegistration rather than
-  // ServiceWorkerStorage::StoreRegistration. Useful for simulating a
-  // registration written by an earlier version of Chrome.
-  void WriteRegistrationToDB(const RegistrationData& registration,
-                             const std::vector<ResourceRecord>& resources) {
-    ServiceWorkerDatabase* database_raw = database();
+  void StoreRegistrationData(
+      storage::mojom::ServiceWorkerRegistrationDataPtr registration_data,
+      std::vector<ResourceRecord> resources) {
     base::RunLoop loop;
-    storage()->database_task_runner_->PostTask(
-        FROM_HERE, base::BindLambdaForTesting([&]() {
-          ServiceWorkerDatabase::DeletedVersion deleted_version;
-          ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
-                    database_raw->WriteRegistration(registration, resources,
-                                                    &deleted_version));
-          loop.Quit();
-        }));
+    storage()->StoreRegistrationData(
+        std::move(registration_data), std::move(resources),
+        base::BindLambdaForTesting(
+            [&](storage::mojom::ServiceWorkerDatabaseStatus status,
+                int64_t /*deleted_version_id*/,
+                const std::vector<int64_t>& /*newly_purgeable_resources*/) {
+              ASSERT_EQ(storage::mojom::ServiceWorkerDatabaseStatus::kOk,
+                        status);
+              loop.Quit();
+            }));
     loop.Run();
   }
 
-  std::vector<int64_t> GetPurgeableResourceIdsFromDB() {
-    std::vector<int64_t> ids;
-    base::RunLoop loop;
-    storage()->GetPurgeableResourceIdsForTest(base::BindLambdaForTesting(
-        [&](ServiceWorkerDatabase::Status status,
-            const std::vector<int64_t>& resource_ids) {
-          EXPECT_EQ(status, ServiceWorkerDatabase::Status::kOk);
-          ids = resource_ids;
-          loop.Quit();
-        }));
-    loop.Run();
-    return ids;
-  }
-
-  std::vector<int64_t> GetUncommittedResourceIdsFromDB() {
-    std::vector<int64_t> ids;
-    base::RunLoop loop;
-    storage()->GetUncommittedResourceIdsForTest(base::BindLambdaForTesting(
-        [&](ServiceWorkerDatabase::Status status,
-            const std::vector<int64_t>& resource_ids) {
-          EXPECT_EQ(status, ServiceWorkerDatabase::Status::kOk);
-          ids = resource_ids;
-          loop.Quit();
-        }));
-    loop.Run();
-    return ids;
-  }
-
   // user_data_directory_ must be declared first to preserve destructor order.
   base::ScopedTempDir user_data_directory_;
   base::FilePath user_data_directory_path_;
@@ -1315,301 +1239,6 @@
   EXPECT_TRUE(data_list_out.empty());
 }
 
-class ServiceWorkerResourceStorageTest : public ServiceWorkerStorageTest {
- public:
-  void SetUp() override {
-    ServiceWorkerStorageTest::SetUp();
-    LazyInitialize();
-
-    scope_ = GURL("http://www.test.not/scope/");
-    script_ = GURL("http://www.test.not/script.js");
-    import_ = GURL("http://www.test.not/import.js");
-    document_url_ = GURL("http://www.test.not/scope/document.html");
-    resource_id1_ = GetNewResourceIdSync(storage_control());
-    resource_id2_ = GetNewResourceIdSync(storage_control());
-    resource_id1_size_ = 239193;
-    resource_id2_size_ = 59923;
-
-    // Cons up a new registration+version with two script resources.
-    blink::mojom::ServiceWorkerRegistrationOptions options;
-    options.scope = scope_;
-    registration_ = CreateNewServiceWorkerRegistration(registry(), options);
-    scoped_refptr<ServiceWorkerVersion> version = CreateNewServiceWorkerVersion(
-        registry(), registration_.get(), script_, options.type);
-    version->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
-    version->SetStatus(ServiceWorkerVersion::INSTALLED);
-
-    std::vector<ResourceRecord> resources;
-    resources.push_back(
-        CreateResourceRecord(resource_id1_, script_, resource_id1_size_));
-    resources.push_back(
-        CreateResourceRecord(resource_id2_, import_, resource_id2_size_));
-    version->script_cache_map()->SetResources(resources);
-
-    registration_->SetWaitingVersion(version);
-
-    registration_id_ = registration_->id();
-    version_id_ = version->version_id();
-
-    // Add the resources ids to the uncommitted list.
-    registry()->StoreUncommittedResourceId(resource_id1_, scope_);
-    registry()->StoreUncommittedResourceId(resource_id2_, scope_);
-    // Make sure that StoreUncommittedResourceId mojo message is received.
-    storage_control().FlushForTesting();
-
-    std::vector<int64_t> verify_ids = GetUncommittedResourceIdsFromDB();
-    EXPECT_EQ(2u, verify_ids.size());
-
-    // And dump something in the disk cache for them.
-    WriteBasicResponse(storage_control(), resource_id1_);
-    WriteBasicResponse(storage_control(), resource_id2_);
-    EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-    EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
-
-    // Storing the registration/version should take the resources ids out
-    // of the uncommitted list.
-    EXPECT_EQ(
-        blink::ServiceWorkerStatusCode::kOk,
-        StoreRegistration(registration_, registration_->waiting_version()));
-    verify_ids = GetUncommittedResourceIdsFromDB();
-    EXPECT_TRUE(verify_ids.empty());
-  }
-
- protected:
-  GURL scope_;
-  GURL script_;
-  GURL import_;
-  GURL document_url_;
-  int64_t registration_id_;
-  int64_t version_id_;
-  int64_t resource_id1_;
-  uint64_t resource_id1_size_;
-  int64_t resource_id2_;
-  uint64_t resource_id2_size_;
-  scoped_refptr<ServiceWorkerRegistration> registration_;
-};
-
-class ServiceWorkerResourceStorageDiskTest
-    : public ServiceWorkerResourceStorageTest {
- public:
-  void SetUp() override {
-    ASSERT_TRUE(InitUserDataDirectory());
-    ServiceWorkerResourceStorageTest::SetUp();
-  }
-};
-
-TEST_F(ServiceWorkerResourceStorageTest,
-       WriteMetadataWithServiceWorkerResponseMetadataWriter) {
-  const char kMetadata1[] = "Test metadata";
-  const char kMetadata2[] = "small";
-  int64_t new_resource_id_ = GetNewResourceIdSync(storage_control());
-  // Writing metadata to nonexistent resoirce ID must fail.
-  EXPECT_GE(0, WriteResponseMetadata(storage_control(), new_resource_id_,
-                                     kMetadata1));
-
-  // Check metadata is written.
-  EXPECT_EQ(
-      static_cast<int>(strlen(kMetadata1)),
-      WriteResponseMetadata(storage_control(), resource_id1_, kMetadata1));
-  EXPECT_TRUE(
-      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata1));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-
-  // Check metadata is written and truncated.
-  EXPECT_EQ(
-      static_cast<int>(strlen(kMetadata2)),
-      WriteResponseMetadata(storage_control(), resource_id1_, kMetadata2));
-  EXPECT_TRUE(
-      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata2));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-
-  // Check metadata is deleted.
-  EXPECT_EQ(0, WriteResponseMetadata(storage_control(), resource_id1_, ""));
-  EXPECT_FALSE(VerifyResponseMetadata(storage_control(), resource_id1_, ""));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-}
-
-TEST_F(ServiceWorkerResourceStorageTest,
-       WriteMetadataWithServiceWorkerScriptCacheMap) {
-  const char kMetadata1[] = "Test metadata";
-  const char kMetadata2[] = "small";
-  ServiceWorkerVersion* version = registration_->waiting_version();
-  EXPECT_TRUE(version);
-
-  // Writing metadata to nonexistent URL must fail.
-  EXPECT_GE(0,
-            WriteMetadata(version, GURL("http://www.test.not/nonexistent.js"),
-                          kMetadata1));
-  // Clearing metadata of nonexistent URL must fail.
-  EXPECT_GE(0,
-            ClearMetadata(version, GURL("http://www.test.not/nonexistent.js")));
-
-  // Check metadata is written.
-  EXPECT_EQ(static_cast<int>(strlen(kMetadata1)),
-            WriteMetadata(version, script_, kMetadata1));
-  EXPECT_TRUE(
-      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata1));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-
-  // Check metadata is written and truncated.
-  EXPECT_EQ(static_cast<int>(strlen(kMetadata2)),
-            WriteMetadata(version, script_, kMetadata2));
-  EXPECT_TRUE(
-      VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata2));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-
-  // Check metadata is deleted.
-  EXPECT_EQ(0, ClearMetadata(version, script_));
-  EXPECT_FALSE(VerifyResponseMetadata(storage_control(), resource_id1_, ""));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-}
-
-TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_NoLiveVersion) {
-  // Deleting the registration should result in the resources being added to the
-  // purgeable list and then doomed in the disk cache and removed from that
-  // list.
-  base::RunLoop loop;
-  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(registration_, scope_.GetOrigin()));
-  // At this point registration_->waiting_version() has a remote reference, so
-  // the resources should be in the purgeable list.
-  EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
-
-  registration_->SetWaitingVersion(nullptr);
-  loop.Run();
-
-  // registration_->waiting_version() is cleared. The resources should be
-  // purged at this point.
-  EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-}
-
-TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) {
-  // Deleting the registration should result in the resources being added to the
-  // purgeable list and then doomed in the disk cache and removed from that
-  // list.
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(registration_, scope_.GetOrigin()));
-  EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
-
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-
-  // Doom the version. The resources should be purged.
-  base::RunLoop loop;
-  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
-  registration_->waiting_version()->Doom();
-  loop.Run();
-  EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
-
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-}
-
-TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) {
-  // Promote the worker to active and add a controllee.
-  registration_->SetActiveVersion(registration_->waiting_version());
-  registration_->active_version()->SetStatus(ServiceWorkerVersion::ACTIVATED);
-  registry()->UpdateToActiveState(registration_->id(),
-                                  registration_->scope().GetOrigin(),
-                                  base::DoNothing());
-  ServiceWorkerRemoteContainerEndpoint remote_endpoint;
-  base::WeakPtr<ServiceWorkerContainerHost> container_host =
-      CreateContainerHostForWindow(33 /* dummy render process id */,
-                                   true /* is_parent_frame_secure */,
-                                   context()->AsWeakPtr(), &remote_endpoint);
-  registration_->active_version()->AddControllee(container_host.get());
-
-  // Deleting the registration should move the resources to the purgeable list
-  // but keep them available.
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(registration_, scope_.GetOrigin()));
-  EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
-
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
-
-  // Dooming the version should cause the resources to be deleted.
-  base::RunLoop loop;
-  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
-  registration_->active_version()->RemoveControllee(
-      container_host->client_uuid());
-  registration_->active_version()->Doom();
-  loop.Run();
-  EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
-
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-}
-
-TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) {
-  // Promote the worker to active and add a controllee.
-  registration_->SetActiveVersion(registration_->waiting_version());
-  registration_->active_version()->SetStatus(ServiceWorkerVersion::ACTIVATED);
-  registration_->SetWaitingVersion(nullptr);
-  registry()->UpdateToActiveState(registration_->id(),
-                                  registration_->scope().GetOrigin(),
-                                  base::DoNothing());
-  ServiceWorkerRemoteContainerEndpoint remote_endpoint;
-  base::WeakPtr<ServiceWorkerContainerHost> container_host =
-      CreateContainerHostForWindow(33 /* dummy render process id */,
-                                   true /* is_parent_frame_secure */,
-                                   context()->AsWeakPtr(), &remote_endpoint);
-  registration_->active_version()->AddControllee(container_host.get());
-
-  // Deleting the registration should move the resources to the purgeable list
-  // but keep them available.
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(registration_, scope_.GetOrigin()));
-  std::vector<int64_t> verify_ids = GetPurgeableResourceIdsFromDB();
-  EXPECT_EQ(2u, verify_ids.size());
-
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
-
-  // Also add an uncommitted resource.
-  int64_t kStaleUncommittedResourceId = GetNewResourceIdSync(storage_control());
-  registry()->StoreUncommittedResourceId(kStaleUncommittedResourceId,
-                                         registration_->scope());
-  // Make sure that StoreUncommittedResourceId mojo message is received.
-  storage_control().FlushForTesting();
-  verify_ids = GetUncommittedResourceIdsFromDB();
-  EXPECT_EQ(1u, verify_ids.size());
-  WriteBasicResponse(storage_control(), kStaleUncommittedResourceId);
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(),
-                                  kStaleUncommittedResourceId, true));
-
-  // Simulate browser shutdown. The purgeable and uncommitted resources are now
-  // stale.
-  InitializeTestHelper();
-  LazyInitialize();
-
-  // Store a new uncommitted resource. This triggers stale resource cleanup.
-  base::RunLoop loop;
-  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
-  int64_t kNewResourceId = GetNewResourceIdSync(storage_control());
-  WriteBasicResponse(storage_control(), kNewResourceId);
-  registry()->StoreUncommittedResourceId(kNewResourceId,
-                                         registration_->scope());
-  loop.Run();
-
-  // The stale resources should be purged, but the new resource should persist.
-  verify_ids = GetUncommittedResourceIdsFromDB();
-  ASSERT_EQ(1u, verify_ids.size());
-  EXPECT_EQ(kNewResourceId, *verify_ids.begin());
-
-  verify_ids = GetPurgeableResourceIdsFromDB();
-  EXPECT_TRUE(verify_ids.empty());
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(),
-                                   kStaleUncommittedResourceId, false));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), kNewResourceId, true));
-}
-
 // Test fixture that uses disk storage, rather than memory. Useful for tests
 // that test persistence by simulating browser shutdown and restart.
 class ServiceWorkerStorageDiskTest : public ServiceWorkerStorageTest {
@@ -1725,127 +1354,35 @@
 #endif
 }
 
-TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration) {
-  // Promote the worker to active worker and add a controllee.
-  registration_->SetActiveVersion(registration_->waiting_version());
-  registration_->active_version()->SetStatus(ServiceWorkerVersion::ACTIVATED);
-  registry()->UpdateToActiveState(registration_->id(),
-                                  registration_->scope().GetOrigin(),
-                                  base::DoNothing());
-  ServiceWorkerRemoteContainerEndpoint remote_endpoint;
-  base::WeakPtr<ServiceWorkerContainerHost> container_host =
-      CreateContainerHostForWindow(
-          33 /* dummy render process id */, true /* is_parent_frame_secure */,
-          helper_->context()->AsWeakPtr(), &remote_endpoint);
-  registration_->active_version()->AddControllee(container_host.get());
-
-  // Make an updated registration.
-  scoped_refptr<ServiceWorkerVersion> live_version =
-      CreateNewServiceWorkerVersion(registry(), registration_.get(), script_,
-                                    blink::mojom::ScriptType::kClassic);
-  live_version->SetStatus(ServiceWorkerVersion::NEW);
-  registration_->SetWaitingVersion(live_version);
-  std::vector<ResourceRecord> records;
-  records.push_back(CreateResourceRecord(10, live_version->script_url(), 100));
-  live_version->script_cache_map()->SetResources(records);
-  live_version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
-
-  // Writing the registration should move the old version's resources to the
-  // purgeable list but keep them available.
-  EXPECT_EQ(
-      blink::ServiceWorkerStatusCode::kOk,
-      StoreRegistration(registration_.get(), registration_->waiting_version()));
-  EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
-  EXPECT_TRUE(GetPurgingResources().empty());
-
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-
-  // Remove the controllee to allow the new version to become active, making the
-  // old version redundant.
-  base::RunLoop loop;
-  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
-  scoped_refptr<ServiceWorkerVersion> old_version(
-      registration_->active_version());
-  old_version->RemoveControllee(container_host->client_uuid());
-  registration_->ActivateWaitingVersionWhenReady();
-  EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, old_version->status());
-
-  // Its resources should be purged.
-  loop.Run();
-  EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-}
-
-TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration_NoLiveVersion) {
-  // Promote the worker to active worker and add a controllee.
-  registration_->SetActiveVersion(registration_->waiting_version());
-  registry()->UpdateToActiveState(registration_->id(),
-                                  registration_->scope().GetOrigin(),
-                                  base::DoNothing());
-
-  // Make an updated registration.
-  scoped_refptr<ServiceWorkerVersion> live_version =
-      CreateNewServiceWorkerVersion(registry(), registration_.get(), script_,
-                                    blink::mojom::ScriptType::kClassic);
-  live_version->SetStatus(ServiceWorkerVersion::NEW);
-  registration_->SetWaitingVersion(live_version);
-  std::vector<ResourceRecord> records;
-  records.push_back(CreateResourceRecord(10, live_version->script_url(), 100));
-  live_version->script_cache_map()->SetResources(records);
-  live_version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
-
-  // Writing the registration should purge the old version's resources,
-  // since it's not live.
-  base::RunLoop loop;
-  storage_control()->SetPurgingCompleteCallbackForTest(loop.QuitClosure());
-  EXPECT_EQ(
-      blink::ServiceWorkerStatusCode::kOk,
-      StoreRegistration(registration_.get(), registration_->waiting_version()));
-  EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
-
-  // Destroy the active version.
-  registration_->UnsetVersion(registration_->active_version());
-
-  // The resources should be purged.
-  loop.Run();
-  EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
-  EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
-}
-
 TEST_F(ServiceWorkerStorageTest, OriginTrialsAbsentEntryAndEmptyEntry) {
   const GURL origin1("http://www1.example.com");
   const GURL scope1("http://www1.example.com/foo/");
-  RegistrationData data1;
-  data1.registration_id = 100;
-  data1.scope = scope1;
-  data1.script = GURL(origin1.spec() + "/script.js");
-  data1.version_id = 1000;
-  data1.is_active = true;
-  data1.resources_total_size_bytes = 100;
-  // Don't set origin_trial_tokens to simulate old database entry.
+  const GURL script1(origin1.spec() + "/script.js");
   std::vector<ResourceRecord> resources1;
-  resources1.push_back(CreateResourceRecord(1, data1.script, 100));
-  WriteRegistrationToDB(data1, resources1);
+  resources1.push_back(CreateResourceRecord(1, script1, 100));
+  storage::mojom::ServiceWorkerRegistrationDataPtr data1 =
+      CreateRegistrationData(
+          /*registration_id=*/100,
+          /*version_id=*/1000,
+          /*scope=*/scope1,
+          /*script_url=*/script1, resources1);
+  // Don't set origin_trial_tokens to simulate old database entry.
+  StoreRegistrationData(std::move(data1), std::move(resources1));
 
   const GURL origin2("http://www2.example.com");
   const GURL scope2("http://www2.example.com/foo/");
-  RegistrationData data2;
-  data2.registration_id = 200;
-  data2.scope = scope2;
-  data2.script = GURL(origin2.spec() + "/script.js");
-  data2.version_id = 2000;
-  data2.is_active = true;
-  data2.resources_total_size_bytes = 200;
-  // Set empty origin_trial_tokens.
-  data2.origin_trial_tokens = blink::TrialTokenValidator::FeatureToTokensMap();
+  const GURL script2(origin2.spec() + "/script.js");
   std::vector<ResourceRecord> resources2;
-  resources2.push_back(CreateResourceRecord(2, data2.script, 200));
-  WriteRegistrationToDB(data2, resources2);
+  resources2.push_back(CreateResourceRecord(2, script2, 200));
+  storage::mojom::ServiceWorkerRegistrationDataPtr data2 =
+      CreateRegistrationData(
+          /*registration_id=*/200,
+          /*version_id=*/2000,
+          /*scope=*/scope2,
+          /*script_url=*/script2, resources2);
+  // Set empty origin_trial_tokens.
+  data2->origin_trial_tokens = blink::TrialTokenValidator::FeatureToTokensMap();
+  StoreRegistrationData(std::move(data2), std::move(resources2));
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
 
@@ -1868,17 +1405,17 @@
 TEST_F(ServiceWorkerStorageTest, AbsentNavigationPreloadState) {
   const GURL origin1("http://www1.example.com");
   const GURL scope1("http://www1.example.com/foo/");
-  RegistrationData data1;
-  data1.registration_id = 100;
-  data1.scope = scope1;
-  data1.script = GURL(origin1.spec() + "/script.js");
-  data1.version_id = 1000;
-  data1.is_active = true;
-  data1.resources_total_size_bytes = 100;
-  // Don't set navigation preload state to simulate old database entry.
+  const GURL script1(origin1.spec() + "/script.js");
   std::vector<ResourceRecord> resources1;
-  resources1.push_back(CreateResourceRecord(1, data1.script, 100));
-  WriteRegistrationToDB(data1, std::move(resources1));
+  resources1.push_back(CreateResourceRecord(1, script1, 100));
+  storage::mojom::ServiceWorkerRegistrationDataPtr data1 =
+      CreateRegistrationData(
+          /*registration_id=*/100,
+          /*version_id=*/1000,
+          /*scope=*/scope1,
+          /*script_url=*/script1, resources1);
+  // Don't set navigation preload state to simulate old database entry.
+  StoreRegistrationData(std::move(data1), std::move(resources1));
 
   scoped_refptr<ServiceWorkerRegistration> found_registration;
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
@@ -1896,60 +1433,55 @@
 
 // Tests reading storage usage from database.
 TEST_F(ServiceWorkerStorageTest, GetStorageUsageForOrigin) {
+  const int64_t kRegistrationId1 = 1;
   const GURL kScope1("https://www.example.com/foo/");
   const GURL kScript1("https://www.example.com/foo/sw.js");
+  const int64_t kRegistrationId2 = 2;
   const GURL kScope2("https://www.example.com/bar/");
   const GURL kScript2("https://www.example.com/bar/sw.js");
   const GURL kScript3("https://www.example.com/bar/sub.js");
 
   // Preparation: Store two registrations.
-  RegistrationData data1;
-  data1.registration_id = 1;
-  data1.scope = kScope1;
-  data1.script = kScript1;
-  data1.version_id = 1;
-  data1.is_active = true;
   std::vector<ResourceRecord> resources1;
   resources1.push_back(CreateResourceRecord(1, kScript1, 123));
-  data1.resources_total_size_bytes = 0;
-  for (auto& resource : resources1) {
-    data1.resources_total_size_bytes += resource->size_bytes;
-  }
-  WriteRegistrationToDB(data1, std::move(resources1));
+  storage::mojom::ServiceWorkerRegistrationDataPtr data1 =
+      CreateRegistrationData(
+          /*registration_id=*/kRegistrationId1,
+          /*version_id=*/1,
+          /*scope=*/kScope1,
+          /*script_url=*/kScript1, resources1);
+  int64_t resources_total_size_bytes1 = data1->resources_total_size_bytes;
+  StoreRegistrationData(std::move(data1), std::move(resources1));
 
-  RegistrationData data2;
-  data2.registration_id = 2;
-  data2.scope = kScope2;
-  data2.script = kScript2;
-  data2.version_id = 1;
-  data2.is_active = true;
   std::vector<ResourceRecord> resources2;
   resources2.push_back(CreateResourceRecord(2, kScript2, 456));
   resources2.push_back(CreateResourceRecord(3, kScript3, 789));
-  data2.resources_total_size_bytes = 0;
-  for (auto& resource : resources2) {
-    data2.resources_total_size_bytes += resource->size_bytes;
-  }
-  WriteRegistrationToDB(data2, std::move(resources2));
+  storage::mojom::ServiceWorkerRegistrationDataPtr data2 =
+      CreateRegistrationData(
+          /*registration_id=*/kRegistrationId2,
+          /*version_id=*/1,
+          /*scope=*/kScope1,
+          /*script_url=*/kScript2, resources2);
+  int64_t resources_total_size_bytes2 = data2->resources_total_size_bytes;
+  StoreRegistrationData(std::move(data2), std::move(resources2));
 
   // Storage usage should report total resource size from two registrations.
   const url::Origin origin = url::Origin::Create(kScope1.GetOrigin());
   int64_t usage;
   EXPECT_EQ(GetStorageUsageForOrigin(origin, usage),
             blink::ServiceWorkerStatusCode::kOk);
-  EXPECT_EQ(usage, data1.resources_total_size_bytes +
-                       data2.resources_total_size_bytes);
+  EXPECT_EQ(usage, resources_total_size_bytes1 + resources_total_size_bytes2);
 
   // Delete the first registration. Storage usage should report only the second
   // registration.
-  EXPECT_EQ(DeleteRegistrationById(data1.registration_id, origin.GetURL()),
+  EXPECT_EQ(DeleteRegistrationById(kRegistrationId1, origin.GetURL()),
             ServiceWorkerDatabase::Status::kOk);
   EXPECT_EQ(GetStorageUsageForOrigin(origin, usage),
             blink::ServiceWorkerStatusCode::kOk);
-  EXPECT_EQ(usage, data2.resources_total_size_bytes);
+  EXPECT_EQ(usage, resources_total_size_bytes2);
 
   // Delete the second registration. No storage usage should be reported.
-  EXPECT_EQ(DeleteRegistrationById(data2.registration_id, origin.GetURL()),
+  EXPECT_EQ(DeleteRegistrationById(kRegistrationId2, origin.GetURL()),
             ServiceWorkerDatabase::Status::kOk);
   EXPECT_EQ(GetStorageUsageForOrigin(origin, usage),
             blink::ServiceWorkerStatusCode::kOk);
diff --git a/content/browser/service_worker/service_worker_updated_script_loader_unittest.cc b/content/browser/service_worker/service_worker_updated_script_loader_unittest.cc
index f844e8a9..fc4877b 100644
--- a/content/browser/service_worker/service_worker_updated_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_updated_script_loader_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
 #include "content/browser/service_worker/service_worker_consts.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc
index 38585978..4d47f0a 100644
--- a/content/browser/webui/shared_resources_data_source.cc
+++ b/content/browser/webui/shared_resources_data_source.cc
@@ -326,10 +326,10 @@
   DCHECK_NE(-1, idr) << " path: " << path;
   scoped_refptr<base::RefCountedMemory> bytes;
 
-  if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS) {
+  if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS) {
     std::string css = webui::GetWebUiCssTextDefaults();
     bytes = base::RefCountedString::TakeString(&css);
-  } else if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS_MD) {
+  } else if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS_MD_CSS) {
     std::string css = webui::GetWebUiCssTextDefaultsMd();
     bytes = base::RefCountedString::TakeString(&css);
   } else {
diff --git a/content/public/android/java/strings/translations/android_content_strings_mn.xtb b/content/public/android/java/strings/translations/android_content_strings_mn.xtb
index ec4896c..735ef0e 100644
--- a/content/public/android/java/strings/translations/android_content_strings_mn.xtb
+++ b/content/public/android/java/strings/translations/android_content_strings_mn.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mn">
 <translation id="1412240523210238692">Текст сонголт</translation>
-<translation id="1542044944667958430">Вэб хайлт</translation>
+<translation id="1542044944667958430">Веб хайлт</translation>
 <translation id="1768717197362323622">Миллисекунд</translation>
 <translation id="1822429046913737220">AM/PM</translation>
 <translation id="2094750046714988961">Гадаад хадгалалтын сан бэлэн биш байгаа учраас хувийн мэдээлэл үүсгэгчийг эхлүүлж чадахгүй</translation>
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 06e26f4..f4ac21f 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -1777,7 +1777,7 @@
   // Inject WebUI test runner script first prior to other scripts required to
   // run the test as scripts may depend on it being declared.
   std::vector<int> ids;
-  ids.push_back(IDR_WEBUI_JS_WEBUI_RESOURCE_TEST);
+  ids.push_back(IDR_WEBUI_JS_WEBUI_RESOURCE_TEST_JS);
   ids.insert(ids.end(), js_resource_ids.begin(), js_resource_ids.end());
 
   std::string script;
diff --git a/content/public/test/referrer_unittest.cc b/content/public/test/referrer_unittest.cc
index c3ff9a0..1c4fcb7 100644
--- a/content/public/test/referrer_unittest.cc
+++ b/content/public/test/referrer_unittest.cc
@@ -5,7 +5,6 @@
 #include "content/public/common/referrer.h"
 
 #include "base/test/gtest_util.h"
-#include "base/test/scoped_feature_list.h"
 #include "net/url_request/referrer_policy.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
diff --git a/content/renderer/peripheral_content_heuristic_unittest.cc b/content/renderer/peripheral_content_heuristic_unittest.cc
index c74f934..56a6caf 100644
--- a/content/renderer/peripheral_content_heuristic_unittest.cc
+++ b/content/renderer/peripheral_content_heuristic_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "content/renderer/peripheral_content_heuristic.h"
 
-#include "base/test/scoped_feature_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
diff --git a/content/test/data/accessibility/aria/aria-level-expected-mac.txt b/content/test/data/accessibility/aria/aria-level-expected-mac.txt
index 2977dc8..19b7c2b 100644
--- a/content/test/data/accessibility/aria/aria-level-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-level-expected-mac.txt
@@ -14,21 +14,21 @@
 ++AXHeading AXTitle='Level 5' AXValue=5
 ++++AXStaticText AXValue='Level 5'
 ++AXOutline
-++++AXRow AXSubrole=AXOutlineRow AXDisclosing=1 AXDisclosureLevel=0 AXTitle='Tree item at level 1'
+++++AXRow AXSubrole=AXOutlineRow AXDisclosing=1 AXDisclosureLevel=0 AXIndex=0 AXTitle='Tree item at level 1'
 ++++++AXStaticText AXValue='Tree item at level 1'
 ++++++AXGroup
-++++++++AXRow AXSubrole=AXOutlineRow AXDisclosing=0 AXDisclosureLevel=1 AXTitle='Tree item at level 2'
+++++++++AXRow AXSubrole=AXOutlineRow AXDisclosing=0 AXDisclosureLevel=1 AXIndex=1 AXTitle='Tree item at level 2'
 ++++++++++AXStaticText AXValue='Tree item at level 2'
-++++AXRow AXSubrole=AXOutlineRow AXDisclosing=0 AXDisclosureLevel=2 AXTitle='Tree item at level 3'
+++++AXRow AXSubrole=AXOutlineRow AXDisclosing=0 AXDisclosureLevel=2 AXIndex=2 AXTitle='Tree item at level 3'
 ++++++AXStaticText AXValue='Tree item at level 3'
 ++AXTable
-++++AXRow AXDisclosureLevel=0
+++++AXRow AXDisclosureLevel=0 AXIndex=0
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 1'
-++++AXRow AXDisclosureLevel=1
+++++AXRow AXDisclosureLevel=1 AXIndex=1
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 2'
-++++AXColumn
+++++AXColumn AXIndex=0
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 1'
 ++++++AXCell
diff --git a/content/test/data/accessibility/aria/aria-level.html b/content/test/data/accessibility/aria/aria-level.html
index 930ed59..f2d666a 100644
--- a/content/test/data/accessibility/aria/aria-level.html
+++ b/content/test/data/accessibility/aria/aria-level.html
@@ -3,6 +3,7 @@
 @MAC-ALLOW:AXSubrole=AXOutlineRow
 @MAC-ALLOW:AXDisclosing
 @MAC-ALLOW:AXDisclosureLevel
+@MAC-ALLOW:AXIndex
 @WIN-ALLOW:level:*
 @WIN-ALLOW:EXPANDED
 @WIN-DENY:name=''
diff --git a/content/test/data/accessibility/aria/aria-tree-discontinuous-expected-mac.txt b/content/test/data/accessibility/aria/aria-tree-discontinuous-expected-mac.txt
index 3f22596..48afda0 100644
--- a/content/test/data/accessibility/aria/aria-tree-discontinuous-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-tree-discontinuous-expected-mac.txt
@@ -1,7 +1,7 @@
 AXWebArea
 ++AXOutline AXARIASetSize=2
-++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXTitle='card content'
+++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXIndex=0 AXTitle='card content'
 ++++++AXStaticText AXValue='card content'
 ++++AXGroup
-++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXTitle='card content'
+++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXIndex=1 AXTitle='card content'
 ++++++AXStaticText AXValue='card content'
diff --git a/content/test/data/accessibility/aria/aria-tree-discontinuous.html b/content/test/data/accessibility/aria/aria-tree-discontinuous.html
index c0ef927..f14ce533 100644
--- a/content/test/data/accessibility/aria/aria-tree-discontinuous.html
+++ b/content/test/data/accessibility/aria/aria-tree-discontinuous.html
@@ -1,6 +1,7 @@
 <!--
 @MAC-ALLOW:AXARIASetSize
 @MAC-ALLOW:AXARIAPosInSet
+@MAC-ALLOW:AXIndex
 @WIN-ALLOW:setsize*
 @WIN-ALLOW:posinset*
 @UIA-WIN-ALLOW:SizeOfSet*
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-mac.txt b/content/test/data/accessibility/aria/aria-tree-expected-mac.txt
index 5d40b45..2580c40 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-mac.txt
@@ -1,22 +1,22 @@
 AXWebArea
 ++AXOutline AXARIASetSize=2
-++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXTitle='Animals' AXValue=2
+++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXIndex=0 AXTitle='Animals' AXValue=2
 ++++++AXLink AXDescription='Animals'
 ++++++++AXStaticText AXValue='Animals'
 ++++++AXGroup AXARIASetSize=2
-++++++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXTitle='Domesticated'
+++++++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXIndex=1 AXTitle='Domesticated'
 ++++++++++AXLink AXDescription='Domesticated'
 ++++++++++++AXStaticText AXValue='Domesticated'
 ++++++++++AXGroup AXARIASetSize=2
-++++++++++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXTitle='Dog' AXValue=1
+++++++++++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXIndex=2 AXTitle='Dog' AXValue=1
 ++++++++++++++AXLink AXDescription='Dog'
 ++++++++++++++++AXStaticText AXValue='Dog'
-++++++++++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXTitle='Cat' AXValue=0
+++++++++++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXIndex=3 AXTitle='Cat' AXValue=0
 ++++++++++++++AXLink AXDescription='Cat'
 ++++++++++++++++AXStaticText AXValue='Cat'
-++++++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXTitle='Wild'
+++++++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXIndex=4 AXTitle='Wild'
 ++++++++++AXLink AXDescription='Wild'
 ++++++++++++AXStaticText AXValue='Wild'
-++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXTitle='Plants'
+++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXIndex=5 AXTitle='Plants'
 ++++++AXLink AXDescription='Plants'
 ++++++++AXStaticText AXValue='Plants'
diff --git a/content/test/data/accessibility/aria/aria-tree.html b/content/test/data/accessibility/aria/aria-tree.html
index f2974e8..7b98467 100644
--- a/content/test/data/accessibility/aria/aria-tree.html
+++ b/content/test/data/accessibility/aria/aria-tree.html
@@ -1,4 +1,5 @@
 <!--
+@MAC-ALLOW:AXIndex
 @MAC-ALLOW:AXARIASetSize
 @MAC-ALLOW:AXARIAPosInSet
 @WIN-ALLOW:setsize*
diff --git a/content/test/data/accessibility/aria/aria-treegrid-expected-mac.txt b/content/test/data/accessibility/aria/aria-treegrid-expected-mac.txt
index 3c28472..d4d0a70 100644
--- a/content/test/data/accessibility/aria/aria-treegrid-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-treegrid-expected-mac.txt
@@ -1,12 +1,12 @@
 AXWebArea
 ++AXTable
-++++AXRow AXDisclosureLevel=0
+++++AXRow AXDisclosureLevel=0 AXIndex=0
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 1'
-++++AXRow AXDisclosureLevel=1
+++++AXRow AXDisclosureLevel=1 AXIndex=1
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 2'
-++++AXColumn
+++++AXColumn AXIndex=0
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 1'
 ++++++AXCell
@@ -14,10 +14,10 @@
 ++++AXGroup
 ++AXTable
 ++++AXGroup
-++++++AXRow AXDisclosureLevel=0
+++++++AXRow AXDisclosureLevel=0 AXIndex=0
 ++++++++AXCell
 ++++++++++AXStaticText AXValue='Cell at level 1'
-++++AXColumn
+++++AXColumn AXIndex=0
 ++++++AXCell
 ++++++++AXStaticText AXValue='Cell at level 1'
 ++++AXGroup
diff --git a/content/test/data/accessibility/aria/aria-treegrid.html b/content/test/data/accessibility/aria/aria-treegrid.html
index 0566552..bff5ed27 100644
--- a/content/test/data/accessibility/aria/aria-treegrid.html
+++ b/content/test/data/accessibility/aria/aria-treegrid.html
@@ -1,5 +1,6 @@
 <!--
 @BLINK-ALLOW:hierarchicalLevel*
+@MAC-ALLOW:AXIndex
 @MAC-ALLOW:AXRole=*
 @MAC-ALLOW:AXDisclosureLevel
 @WIN-ALLOW:xml-roles:*
diff --git a/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists-expected-mac.txt b/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists-expected-mac.txt
index 0b7abc2..523458d 100644
--- a/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists-expected-mac.txt
@@ -1,17 +1,17 @@
 AXWebArea AXRoleDescription='HTML content'
 ++AXOutline AXARIASetSize=5 AXRoleDescription='outline'
 ++++AXGroup AXRoleDescription='group'
-++++++AXRow AXARIAPosInSet=2 AXARIASetSize=5 AXRoleDescription='row' AXTitle='treeitem 2 of 5, level 1'
+++++++AXRow AXARIAPosInSet=2 AXARIASetSize=5 AXIndex=0 AXRoleDescription='row' AXTitle='treeitem 2 of 5, level 1'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='treeitem 2 of 5, level 1'
 ++++AXGroup AXRoleDescription='group'
-++++++AXRow AXARIAPosInSet=3 AXARIASetSize=5 AXRoleDescription='row' AXTitle='treeitem 3 of 5, level 1'
+++++++AXRow AXARIAPosInSet=3 AXARIASetSize=5 AXIndex=1 AXRoleDescription='row' AXTitle='treeitem 3 of 5, level 1'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='treeitem 3 of 5, level 1'
 ++++AXGroup AXRoleDescription='group'
-++++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXRoleDescription='row' AXTitle='treeitem 1 of 2, level 2'
+++++++AXRow AXARIAPosInSet=1 AXARIASetSize=2 AXIndex=2 AXRoleDescription='row' AXTitle='treeitem 1 of 2, level 2'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='treeitem 1 of 2, level 2'
 ++++AXGroup AXRoleDescription='group'
-++++++AXRow AXARIAPosInSet=1 AXARIASetSize=1 AXRoleDescription='row' AXTitle='treeitem 1 of 1, level 3'
+++++++AXRow AXARIAPosInSet=1 AXARIASetSize=1 AXIndex=3 AXRoleDescription='row' AXTitle='treeitem 1 of 1, level 3'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='treeitem 1 of 1, level 3'
 ++++AXGroup AXRoleDescription='group'
-++++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXRoleDescription='row' AXTitle='treeitem 2 of 2, level 2'
+++++++AXRow AXARIAPosInSet=2 AXARIASetSize=2 AXIndex=4 AXRoleDescription='row' AXTitle='treeitem 2 of 2, level 2'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='treeitem 2 of 2, level 2'
diff --git a/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists.html b/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists.html
index 0386d93..38f77c6 100644
--- a/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists.html
+++ b/content/test/data/accessibility/aria/aria-treeitem-nested-in-lists.html
@@ -4,6 +4,7 @@
 @MAC-ALLOW:AXARIAPosInSet
 @MAC-DENY:AXARIASetSize=0
 @MAC-DENY:AXARIAPosInSet=0
+@MAC-ALLOW:AXIndex
 @WIN-ALLOW:xml-roles*
 @WIN-ALLOW:level*
 @WIN-ALLOW:setsize*
diff --git a/content/test/fuzzer/code_cache_host_mojolpm_fuzzer.cc b/content/test/fuzzer/code_cache_host_mojolpm_fuzzer.cc
index 513419c..777e14e 100644
--- a/content/test/fuzzer/code_cache_host_mojolpm_fuzzer.cc
+++ b/content/test/fuzzer/code_cache_host_mojolpm_fuzzer.cc
@@ -11,7 +11,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/i18n/icu_util.h"
 #include "base/task/post_task.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/test_switches.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
diff --git a/content/test/fuzzer/file_system_manager_mojolpm_fuzzer.cc b/content/test/fuzzer/file_system_manager_mojolpm_fuzzer.cc
index 6334f54..e7f5789 100644
--- a/content/test/fuzzer/file_system_manager_mojolpm_fuzzer.cc
+++ b/content/test/fuzzer/file_system_manager_mojolpm_fuzzer.cc
@@ -11,7 +11,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/i18n/icu_util.h"
 #include "base/task/post_task.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/test_switches.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
diff --git a/content/test/webui_resource_browsertest.cc b/content/test/webui_resource_browsertest.cc
index 8da137c..892932a 100644
--- a/content/test/webui_resource_browsertest.cc
+++ b/content/test/webui_resource_browsertest.cc
@@ -41,8 +41,8 @@
   }
 
   void RunMediaInternalsTest(const base::FilePath::CharType* file) {
-    AddLibrary(IDR_WEBUI_JS_UTIL);
-    AddLibrary(IDR_WEBUI_JS_CR);
+    AddLibrary(IDR_WEBUI_JS_UTIL_JS);
+    AddLibrary(IDR_WEBUI_JS_CR_JS);
     AddLibrary(IDR_MEDIA_INTERNALS_JS);
     RunTest(GetTestFilePath("media", "webui").Append(file));
   }
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
index 10987b9..65f190e4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
@@ -69,6 +69,7 @@
 <translation id="8240981428553046115">Chromium couldn't check for updates. Try again later.</translation>
 <translation id="8252885722420466166">Get a better Google experience in Chromium based on your location.</translation>
 <translation id="8586442755830160949">Copyright <ph name="YEAR" /> The Chromium Authors. All rights reserved.</translation>
+<translation id="8663480472502753423">Keep Chromium up to date</translation>
 <translation id="8776843108004031667">This account and any unsaved data will be removed from Chromium.</translation>
 <translation id="9022552996538154597">Sign in to Chromium</translation>
 <translation id="9089354809943900324">Chromium is out of date</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
index fc0b24b..2ce27a5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
@@ -9,8 +9,8 @@
 <translation id="1507010443238049608">Chromium-н онцлог болон гүйцэтгэлийг сайжруулахад туслах</translation>
 <translation id="1617663976202781617">Chromium синкийн өгөгдөл</translation>
 <translation id="1736662517232558588">Chromium-н өгөгдлийг устгасан</translation>
-<translation id="1838412507805038478">Энэ вэбсайтын сертификатыг <ph name="ISSUER" /> олгосон болохыг Chromium баталж байна.</translation>
-<translation id="1843424232666537147">Та Chromium-н онцлогийн тусламжтайгаар интернэт өгөгдлөө удирдах, вэб хуудсыг богино хугацаанд ачаалах боломжтой.
+<translation id="1838412507805038478">Энэ вебсайтын сертификатыг <ph name="ISSUER" /> олгосон болохыг Chromium баталж байна.</translation>
+<translation id="1843424232666537147">Та Chromium-н онцлогийн тусламжтайгаар интернэт өгөгдлөө удирдах, веб хуудсыг богино хугацаанд ачаалах боломжтой.
 <ph name="BEGIN_LINK" />Дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation>
 <translation id="2006345422933397527">Chromium-н шинэчлэлтийг шалгаж чадсангүй. Интернэт холболтоо шалгаж үзнэ үү.</translation>
 <translation id="2075400798887076382">Таны компьютерт нээлттэй байгаа чихтэй хуудсанд эндээс хандана уу. Компьютероос Chromium-г нээж, цэс рүү очоод "Chromium-д нэвтрэх..." гэснийг сонгоно уу</translation>
@@ -52,7 +52,7 @@
 <translation id="7099326575020694068">Chromium таны камерыг хувааж харах горимд ашиглах боломжгүй</translation>
 <translation id="7118091470949186573">Та одоо Chromium-г хэзээд ч зурвас, документ болон бусад аппын холбоосон дээр товшин ашиглах боломжтой.</translation>
 <translation id="7208566199746267865">Chromium таны бүртгэлийг вэбэд оруулснаар таны цагийг хэмнэдэг. Та тохиргоо хэсэгт бүртгэл нэмэх, эсвэл устгах боломжтой.</translation>
-<translation id="725427773388857052">Chromium нь таныг өгөгдлийн зөрчил, аюултай вэб сайт болон бусад зүйлээс хамгаалахад туслах боломжтой.</translation>
+<translation id="725427773388857052">Chromium нь таныг өгөгдлийн зөрчил, аюултай вебсайт болон бусад зүйлээс хамгаалахад туслах боломжтой.</translation>
 <translation id="7269362888766543920">Зарим нэмэлт онцлог нь Chromium-г эвдрэхэд хүргэдэг. Тэдгээрийг устгана уу.</translation>
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Сонгосон өгөгдлийг Chromium болон синк хийсэн төхөөрөмжөөс устгaлаа. Tаны Google Бүртгэл history.google.com-д Google-н бусад үйлчилгээнээс авсан үйл ажиллагаа, хайлт зэрэг өөр хэлбэрийн хайлтын түүхтэй байж болно.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
index 6382429..e2d3262 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
@@ -55,6 +55,7 @@
 <translation id="6648150602980899529">You are signing in with an account managed by <ph name="DOMAIN" /> and giving its administrator control over your Chrome data. Your data will become permanently tied to this account. Signing out of Chrome will delete your data from this device, but it will remain stored in your Google Account.</translation>
 <translation id="6676840375528380067">Clear your Chrome data from this device?</translation>
 <translation id="6822673484890854830">Chrome couldn't check all passwords. Try again later.</translation>
+<translation id="7124339256045485976">Keep Chrome up to date</translation>
 <translation id="7161390184744336561">Google Chrome is out of date</translation>
 <translation id="7165736900384873061">Start Using Google Chrome QR Scanner</translation>
 <translation id="7172660552945675509">Tip: <ph name="BEGIN_LINK" />Move Chrome to your dock<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
index 392e054..5bd885d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
@@ -8,7 +8,7 @@
 <translation id="1759842336958782510">Хромэ</translation>
 <translation id="1917964099031477364">Энэ бүртгэл болон хадгалаагүй аливаа өгөгдлийг Chrome болон энэ төхөөрөмж дээрх Google-н бусад аппаас хасна.</translation>
 <translation id="2009224836393115614">Chrome таны нууц үгнүүдийг шалгаж чадсангүй. Интернэт холболтоо шалгаж үзнэ үү.</translation>
-<translation id="2147651015520127414">Энэхүү вэбсайтын сертификатыг <ph name="ISSUER" /> олгосон болохыг Chrome баталж байна.</translation>
+<translation id="2147651015520127414">Энэхүү вебсайтын сертификатыг <ph name="ISSUER" /> олгосон болохыг Chrome баталж байна.</translation>
 <translation id="2199719347983604670">Chrome синкийн өгөгдөл</translation>
 <translation id="2347208864470321755">Энэ горим асаалттай байгаа үед Google нь Chrome Translate-ыг ашиглан бусад хэл дээр бичигдсэн хуудсуудыг орчуулахыг санал болгоно. <ph name="BEGIN_LINK" />Илүү ихийг мэдэж аваарай<ph name="END_LINK" /></translation>
 <translation id="2415682770504543561">Chrome-г өгөгдмөлөө болгох</translation>
@@ -40,7 +40,7 @@
 <translation id="4633328489441962921">Chrome-н шинэчлэлтийг шалгах боломжгүй байна</translation>
 <translation id="4698415050768537821">Chrome бүх нууц үгийг шалгаж чадсангүй. Маргааш дахин оролдох буюу эсхүл <ph name="BEGIN_LINK" />Google Бүртгэлдээ байгаа нууц үгнүүдийг шалгана уу.<ph name="END_LINK" /></translation>
 <translation id="484033449593719797">Chrome Бэта дээр дэмжихгүй</translation>
-<translation id="5030102366287574140">Chrome нь таныг өгөгдлийн зөрчил, аюултай вэб сайт болон бусад зүйлээс хамгаалахад туслах боломжтой.</translation>
+<translation id="5030102366287574140">Chrome нь таныг өгөгдлийн зөрчил, аюултай вебсайт болон бусад зүйлээс хамгаалахад туслах боломжтой.</translation>
 <translation id="5162467219239570114">Chrome хуучирсан байна. <ph name="BEGIN_LINK" />Апп дэлгүүр<ph name="END_LINK" />-т шинэчлэлт байхгүй бол төхөөрөмж тань Chrome-н шинэ хувилбарыг цаашид дэмжихгүй байж болзошгүй.</translation>
 <translation id="5389212809648216794">Таны камерыг өөр апп ашиглаж байгаа тул үүнийг Google Chrome ашиглах боломжгүй</translation>
 <translation id="5639704535586432836">Тохиргоо &gt; Нууцлал &gt; Камер &gt; Google Chrome-г нээж, камерыг асаана уу.</translation>
@@ -48,7 +48,7 @@
 <translation id="5690427481109656848">Google ХХК</translation>
 <translation id="571296537125272375">Офлайн байна, Chrome-н шинэчлэлтийг шалгах боломжгүй байна</translation>
 <translation id="5854621639439811139">Chrome-н зөвлөгөө. Буцаах, Урагшлуулах, Хайх зэрэг зарим товчлуур таны дэлгэцийн доод хэсэгт байрладаг боллоо.</translation>
-<translation id="6036420186814142909">Google Chrome нь танд интернэтийн мэдээллээ удирдах болон вэб хуудсуудыг богино хугацаанд хэрхэн хурдан ачаалах боломжтой болгоход туслах тохиргоонуудтай <ph name="BEGIN_LINK" />Илүү ихийг мэдэж аваарай<ph name="END_LINK" /></translation>
+<translation id="6036420186814142909">Google Chrome нь танд интернэтийн мэдээллээ удирдах болон веб хуудсуудыг богино хугацаанд хэрхэн хурдан ачаалах боломжтой болгоход туслах тохиргоонуудтай <ph name="BEGIN_LINK" />Илүү ихийг мэдэж аваарай<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Таны бусад төхөөрөмжөөрөө Chrome-д нээсэн чихтэй хуудас энд харагдах болно.</translation>
 <translation id="6600954340915313787">Chrome руу хуулсан</translation>
 <translation id="6648150602980899529">Та <ph name="DOMAIN" />-с удирдсан бүртгэлээр нэвтэрч байгаа бөгөөд үүнд таны Chrome-н өгөгдлийг удирдах админы удирдлагыг өгч байна. Таны өгөгдөл энэ бүртгэлтэй бүрмөсөн холбоотой болно. Chrome-с гарснаар таны бүх өгөгдлийг энэ төхөөрөмжөөс устгах бөгөөд тэдгээр өгөгдлүүд таны Google бүртгэлд хадгалагдсан хэвээр байна.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 5daacc36..056583b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -61,6 +61,7 @@
 <translation id="1545749641540134597">Scan QR Code</translation>
 <translation id="1552525382687785070">Sync is Disabled by your Administrator</translation>
 <translation id="1554477036522844996">New window</translation>
+<translation id="1580715474678097352">Stay protected from dangerous websites</translation>
 <translation id="1580783302095112590">Mail sent.</translation>
 <translation id="1582732959743469162">This will stop all progress for your current download.</translation>
 <translation id="1605405588277479165">Off – Not recommended</translation>
@@ -728,6 +729,7 @@
 <translation id="9087108903408689779">Chrome suggested password:</translation>
 <translation id="9094033019050270033">Update password</translation>
 <translation id="9100610230175265781">Passphrase required</translation>
+<translation id="9107664647686727385">Check for compromised passwords</translation>
 <translation id="9137526406337347448">Google Services</translation>
 <translation id="9148126808321036104">Sign in again</translation>
 <translation id="9152539721251340337">Create a QR code</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 403e703..60c622d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -7,7 +7,7 @@
 <translation id="1044891598689252897">Сайтууд хэвийн ажиллана</translation>
 <translation id="1047726139967079566">Энэ хуудсыг хадгал...</translation>
 <translation id="1049743911850919806">Нууцлал</translation>
-<translation id="105093091697134113">Дараах бүртгэлүүд нь гуравдагч талын өгөгдлийн зөрчлөөр задруулсан эсвэл хуурамч вэб сайтад оруулсан нууц үгнүүдийг ашигладаг. Бүртгэлээ аюулгүй байлгахын тулд эдгээр нууц үгийг нэн даруй солино уу.</translation>
+<translation id="105093091697134113">Дараах бүртгэлүүд нь гуравдагч талын өгөгдлийн зөрчлөөр задруулсан эсвэл хуурамч веб сайтад оруулсан нууц үгнүүдийг ашигладаг. Бүртгэлээ аюулгүй байлгахын тулд эдгээр нууц үгийг нэн даруй солино уу.</translation>
 <translation id="1063454504051558093">Өөр нууц үг ашиглана уу...</translation>
 <translation id="1066060668811609597">Синкийг удирдах</translation>
 <translation id="1076421457278169141">Кодыг скан хийсэн</translation>
@@ -52,7 +52,7 @@
 <translation id="1449835205994625556">Нууц үгийг нуух</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> зүйлс</translation>
 <translation id="1491277525950327607">Унтраах/асаах тохиргоог хийхийн тулд хоёр удаа товшино уу</translation>
-<translation id="1509486075633541495">Вэб сайтад нэвтрэх</translation>
+<translation id="1509486075633541495">Веб сайтад нэвтрэх</translation>
 <translation id="1509960214886564027">Олон сайтын онцлогууд ажиллахгүй байж болзошгүй</translation>
 <translation id="152234381334907219">Огт хадгалаагүй</translation>
 <translation id="1523341279170789507">Бүх күүкиг зөвшөөрөх</translation>
@@ -80,7 +80,7 @@
 <translation id="1692118695553449118">Тохиргоо асаалттай байна.</translation>
 <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> сонгогдсон</translation>
 <translation id="1740468249224277719">Суулгахын тулд хоёр удаа товшино уу.</translation>
-<translation id="1746815479209538200">Вэбийг хөтлөхийн тулд шинэ чихтэй хуудас нэмнэ үү.</translation>
+<translation id="1746815479209538200">Вебийг хөтлөхийн тулд шинэ чихтэй хуудас нэмнэ үү.</translation>
 <translation id="1752547299766512813">Нууц үг хадгалах</translation>
 <translation id="1753905327828125965">Түгээмэл зочилсон</translation>
 <translation id="1803264062614276815">Карт эзэмшигчийн нэр</translation>
@@ -92,7 +92,7 @@
 <translation id="1911619930368729126">Google Drive руу татаж оруул</translation>
 <translation id="1923342640370224680">Сүүлийн цаг</translation>
 <translation id="1941314575388338491">Хуулахын тулд хоёр удаа товшино уу.</translation>
-<translation id="1952172573699511566">Вэбсайт текстийг таны сонгосон хэлээр (хэрэв тухайн хэл боломжтой бол) харуулна.</translation>
+<translation id="1952172573699511566">Вебсайт текстийг таны сонгосон хэлээр (хэрэв тухайн хэл боломжтой бол) харуулна.</translation>
 <translation id="1952728750904661634">Удирдсан бүртгэлээр нэвтрэх</translation>
 <translation id="1965935827552890526">Chrome-н нээлттэй нөгөө цонхон дээрээ хийж байсан зүйлээ дуусгах.</translation>
 <translation id="1974060860693918893">Боловсронгуй</translation>
@@ -111,14 +111,14 @@
 <translation id="2175927920773552910">QR код</translation>
 <translation id="2198757192731523470">Google таны түүхийг хайлт, зар болон Google-н бусад үйлчилгээг хувийн болгохын тулд ашиглаж болзошгүй.</translation>
 <translation id="2218443599109088993">Жижигрүүлэх</translation>
-<translation id="2230173723195178503">Вэб хуудсыг ачаалласан</translation>
+<translation id="2230173723195178503">Веб хуудсыг ачаалласан</translation>
 <translation id="2239626343334228536">Хөтчийн өгөгдлийг устгаж байна...</translation>
 <translation id="2257567812274161158">Синк хийх ажиллахгүй байна.</translation>
 <translation id="225943865679747347">Алдааны код: <ph name="ERROR_CODE" /></translation>
 <translation id="2267753748892043616">Бүртгэл нэмэх</translation>
 <translation id="2268044343513325586">Боловсронгуй болгох</translation>
 <translation id="2273327106802955778">Дэлгэрэнгүй цэс</translation>
-<translation id="2302742851632557585">Нууц үгээ вэб сайт дээр өөрчлөх</translation>
+<translation id="2302742851632557585">Нууц үгээ вебсайт дээр өөрчлөх</translation>
 <translation id="2316709634732130529">Санал болгосон нууц үгийг ашиглах</translation>
 <translation id="2320166752086256636">Компьютерийн гарыг нуух</translation>
 <translation id="2339560363438331454">Синк болон Google үйлчилгээ</translation>
@@ -196,7 +196,7 @@
 <translation id="3157684681743766797">Бүгдийг тэмдэглэх...</translation>
 <translation id="3161291298470460782">Ингэснээр таныг гаргаж, синк хийхийг унтраах бөгөөд Chrome-н бүх өгөгдлийг энэ төхөөрөмжөөс устгана. Таны cинк хийсэн өгөгдөл Google Бүртгэлд тань үлдэнэ.</translation>
 <translation id="3169472444629675720">Олох</translation>
-<translation id="3175081911749765310">Вэб үйлчилгээнүүд</translation>
+<translation id="3175081911749765310">Веб үйлчилгээнүүд</translation>
 <translation id="3178650076442119961">Өнөөдөр идэвхтэй</translation>
 <translation id="3181954750937456830">Аюулгүй хөтөч (таныг болон таны төхөөрөмжийг аюултай сайтаас хамгаалдаг)</translation>
 <translation id="3196681740617426482">Сайтууд нь, жишээлбэл таныг нэвтэрсэн хэвээр байлгах эсвэл таны худалдан авалтын сагсан дахь зүйлсийг санах зэргээр таны хөтчийн туршлагыг сайжруулахын тулд күүки ашиглах боломжтой.
@@ -234,7 +234,7 @@
 <translation id="3493531032208478708">Санал болгосон агуулгын талаар <ph name="BEGIN_LINK" />дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation>
 <translation id="3494788280727468875">Хайлтын өгөгдөл цэвэрлэхийг зөвшөөрөх</translation>
 <translation id="35083190962747987">${url}-г нээх</translation>
-<translation id="3519193562722059437">Вэб-д зочлохын тулд цонх нээнэ үү.</translation>
+<translation id="3519193562722059437">Веб-д зочлохын тулд цонх нээнэ үү.</translation>
 <translation id="3523473570015918798">Гарснаар таны хавчуурга, түүх, нууц үгс болон Chrome-н бусад өгөгдлийг таны Google Бүртгэлд цаашид синк хийхгүй.</translation>
 <translation id="3527085408025491307">Хавтас</translation>
 <translation id="3529024052484145543">Аюултай</translation>
@@ -249,7 +249,7 @@
 <translation id="3603009562372709545">Холбоосын URL-ыг хуулах</translation>
 <translation id="3607167657931203000">Автоматаар бөглөх хэсгийн өгөгдөл</translation>
 <translation id="3609785682760573515">Sync хийж байна ...</translation>
-<translation id="3638472932233958418">Вэб хуудсуудыг урьдчилан ачаалах</translation>
+<translation id="3638472932233958418">Веб хуудсуудыг урьдчилан ачаалах</translation>
 <translation id="3670030362669914947">Тоо</translation>
 <translation id="3691593122358196899"><ph name="FOLDER_TITLE" />-д хавчуулсан</translation>
 <translation id="3709582977625132201">Уншаагүй болгож тэмдэглэх</translation>
@@ -402,7 +402,7 @@
 <translation id="5490005495580364134">Бүх күүкиг блоклох (Зөвлөдөггүй)</translation>
 <translation id="5508435575041083207">Гарч, энэ төхөөрөмжөөс өгөгдлийг устгах</translation>
 <translation id="5525269841082836315">Нэвтрэх үгийг үүсгэх</translation>
-<translation id="5548760955356983418">Handoff нь танд энэ төхөөрөмж дээр вэб хуудсыг ачаалж, дараа нь Mac дээр хялбархан үргэжлүүлэн ажиллах боломжийг олгодог. Одоо нээлттэй байгаа вэбсайт таны Mac-ийн Dock дотор гарч ирнэ.
+<translation id="5548760955356983418">Handoff нь танд энэ төхөөрөмж дээр веб хуудсыг ачаалж, дараа нь Mac дээр хялбархан үргэжлүүлэн ажиллах боломжийг олгодог. Одоо нээлттэй байгаа вебсайт таны Mac-ийн Dock дотор гарч ирнэ.
 
 Handoff-ыг Тохиргооны ерөнхий хэсэгт идэвхижүүлсэн байх ёстой бөгөөд таны төхөөрөмжүүд ижилхэн iCloud акаунт ашиглах ёстой.</translation>
 <translation id="5551897871312988470">Орчуулахыг санал болгох</translation>
@@ -417,10 +417,10 @@
 <translation id="567881659373499783">Хувилбар <ph name="PRODUCT_VERSION" /></translation>
 <translation id="5706552126692816153">1 өдрийн өмнө идэвхтэй</translation>
 <translation id="5711039611392265845">Нууцлал, аюулгүй байдал болон өгөгдөл цуглуулахтай холбоотой бусад тохиргоог <ph name="BEGIN_LINK" />Синк хийх болон Google-н үйлчилгээ<ph name="END_LINK" />-с харна уу.</translation>
-<translation id="5724941645893276623">Вэбийг хувийн байдлаар үзэхийн тулд шинэ таб нэмнэ үү</translation>
+<translation id="5724941645893276623">Вебийг хувийн байдлаар үзэхийн тулд шинэ таб нэмнэ үү</translation>
 <translation id="5728700505257787410">Уучлаарай, таны акаунт руу нэвтрэх үед алдаа гарсан байна.</translation>
 <translation id="5737974891429562743">Бүртгэлийн нэвтрэх мэдээлэл хуучирсан байна. Синкийг эхлүүлэхийн тулд шинэчилнэ үү.</translation>
-<translation id="5738887413654608789">Та үүгээр ойролцоох хамааралтай вэб хуудсыг олох боломжтой.</translation>
+<translation id="5738887413654608789">Та үүгээр ойролцоох хамааралтай веб хуудсыг олох боломжтой.</translation>
 <translation id="5758631781033351321">Та унших жагсаалтаа эндээс олох болно</translation>
 <translation id="5782227691023083829">Орчуулж байна...</translation>
 <translation id="5803566855766646066">Та энэ шинэ картыг устгахдаа итгэлтэй байна уу?</translation>
@@ -607,7 +607,7 @@
 <translation id="7638584964844754484">Нэвтрэх хэллэг буруу байна</translation>
 <translation id="7649070708921625228">Тусламж</translation>
 <translation id="7658239707568436148">Болих</translation>
-<translation id="766891008101699113">Вэбийг нуугдаж хөтлөхийн тулд шинэ чихтэй хуудас нэмнэ үү.</translation>
+<translation id="766891008101699113">Вебийг нуугдаж хөтлөхийн тулд шинэ чихтэй хуудас нэмнэ үү.</translation>
 <translation id="7671141431838911305">СУУЛГАХ</translation>
 <translation id="7701040980221191251">Тодорхойгүй</translation>
 <translation id="7765158879357617694">Зөөх</translation>
diff --git a/ios/chrome/browser/omaha/BUILD.gn b/ios/chrome/browser/omaha/BUILD.gn
index 67d17a4..2fb3799 100644
--- a/ios/chrome/browser/omaha/BUILD.gn
+++ b/ios/chrome/browser/omaha/BUILD.gn
@@ -45,7 +45,8 @@
     "//components/version_info",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state:test_support",
-    "//ios/chrome/browser/upgrade:upgrade",
+    "//ios/chrome/browser/upgrade",
+    "//ios/chrome/browser/upgrade:public",
     "//ios/chrome/common",
     "//ios/chrome/test:test_support",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/omaha/omaha_service.h b/ios/chrome/browser/omaha/omaha_service.h
index e9d3557..720ecbbf 100644
--- a/ios/chrome/browser/omaha/omaha_service.h
+++ b/ios/chrome/browser/omaha/omaha_service.h
@@ -82,6 +82,8 @@
   FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, NonSpammingTest);
   FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, ActivePingAfterInstallEventTest);
   FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, InstallRetryTest);
+  FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, PingUpToDateUpdatesUserDefaults);
+  FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, PingOutOfDateUpdatesUserDefaults);
   FRIEND_TEST_ALL_PREFIXES(OmahaServiceInternalTest,
                            PingMessageTestWithProfileData);
 
diff --git a/ios/chrome/browser/omaha/omaha_service.mm b/ios/chrome/browser/omaha/omaha_service.mm
index 96869ae..e403c93a 100644
--- a/ios/chrome/browser/omaha/omaha_service.mm
+++ b/ios/chrome/browser/omaha/omaha_service.mm
@@ -248,8 +248,12 @@
         _urlIsParsed = YES;
         _manifestIsParsed = YES;
         _updateInformation->is_up_to_date = true;
+        [[NSUserDefaults standardUserDefaults] setBool:true
+                                                forKey:kIOSChromeUpToDateKey];
       } else if ([status isEqualToString:@"ok"]) {
         _updateInformation->is_up_to_date = false;
+        [[NSUserDefaults standardUserDefaults] setBool:false
+                                                forKey:kIOSChromeUpToDateKey];
       } else {
         _updateInformation = nullptr;
         _hasError = YES;
@@ -845,4 +849,5 @@
   [defaults removeObjectForKey:kLastSentTimeKey];
   [defaults removeObjectForKey:kRetryRequestIdKey];
   [defaults removeObjectForKey:kLastServerDateKey];
+  [defaults removeObjectForKey:kIOSChromeUpToDateKey];
 }
diff --git a/ios/chrome/browser/omaha/omaha_service_unittest.mm b/ios/chrome/browser/omaha/omaha_service_unittest.mm
index f9c453b..7efeb170 100644
--- a/ios/chrome/browser/omaha/omaha_service_unittest.mm
+++ b/ios/chrome/browser/omaha/omaha_service_unittest.mm
@@ -18,6 +18,7 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state_manager.h"
 #include "ios/chrome/browser/install_time_util.h"
+#import "ios/chrome/browser/upgrade/upgrade_constants.h"
 #include "ios/chrome/browser/upgrade/upgrade_recommended_details.h"
 #include "ios/chrome/common/channel_info.h"
 #include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager.h"
@@ -268,6 +269,67 @@
   EXPECT_FALSE(ScheduledCallbackUsed());
 }
 
+TEST_F(OmahaServiceTest, PingUpToDateUpdatesUserDefaults) {
+  OmahaService service(false);
+  service.StartInternal();
+
+  service.set_upgrade_recommended_callback(
+      base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
+  service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
+  CleanService(&service, version_info::GetVersionNumber());
+
+  service.SendPing();
+
+  auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
+  test_url_loader_factory_.SimulateResponseForPendingRequest(
+      pending_request->request.url.spec(), GetResponseSuccess());
+
+  EXPECT_TRUE(
+      [[NSUserDefaults standardUserDefaults] boolForKey:kIOSChromeUpToDateKey]);
+  EXPECT_FALSE(NeedUpdate());
+  EXPECT_FALSE(ScheduledCallbackUsed());
+}
+
+TEST_F(OmahaServiceTest, PingOutOfDateUpdatesUserDefaults) {
+  OmahaService service(false);
+  service.StartInternal();
+
+  service.set_upgrade_recommended_callback(
+      base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
+  service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
+  CleanService(&service, version_info::GetVersionNumber());
+
+  service.SendPing();
+
+  std::string response =
+      std::string(
+          "<?xml version=\"1.0\"?><response protocol=\"3.0\" server=\"prod\">"
+          "<daystart elapsed_seconds=\"56754\"/><app appid=\"") +
+      test_application_id() +
+      "\" status=\"ok\">"
+      "<updatecheck status=\"ok\"><urls>"
+      "<url codebase=\"http://www.goo.fr/foo/\"/></urls>"
+      "<manifest version=\"0.0.1075.1441\">"
+      "<packages>"
+      "<package hash=\"0\" name=\"Chrome\" required=\"true\" size=\"0\"/>"
+      "</packages>"
+      "<actions>"
+      "<action event=\"update\" run=\"Chrome\"/>"
+      "<action event=\"postinstall\" osminversion=\"6.0\"/>"
+      "</actions>"
+      "</manifest>"
+      "</updatecheck><ping status=\"ok\"/>"
+      "</app></response>";
+  auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
+  test_url_loader_factory_.SimulateResponseForPendingRequest(
+      pending_request->request.url.spec(), response);
+
+  EXPECT_FALSE(
+      [[NSUserDefaults standardUserDefaults] boolForKey:kIOSChromeUpToDateKey]);
+  EXPECT_TRUE(NeedUpdate());
+  EXPECT_TRUE(ScheduledCallbackUsed());
+}
+
 TEST_F(OmahaServiceTest, CallbackForScheduledNotUsedOnErrorResponse) {
   base::Time now = base::Time::Now();
   OmahaService service(false);
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm
index 3a3c235..c8668e3 100644
--- a/ios/chrome/browser/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -268,9 +268,6 @@
   prefs->ClearPref(kGoogleServicesUsername);
   prefs->ClearPref(kGoogleServicesUserAccountId);
 
-  // Added 10/2019.
-  syncer::DeviceInfoPrefs::MigrateRecentLocalCacheGuidsPref(prefs);
-
   // Added 1/2020.
   prefs->ClearPref(kGCMChannelStatus);
   prefs->ClearPref(kGCMChannelPollIntervalSeconds);
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
index 07b9f17..8f7ee04 100644
--- a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
+++ b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
@@ -50,9 +50,6 @@
 #pragma mark - Public
 
 bool SigninShouldPresentUserSigninUpgrade(ChromeBrowserState* browserState) {
-  if (signin::ForceStartupSigninPromo())
-    return true;
-
   if (tests_hook::DisableSigninRecallPromo())
     return false;
 
@@ -70,6 +67,9 @@
   if (authService->IsAuthenticated())
     return false;
 
+  if (signin::ForceStartupSigninPromo())
+    return true;
+
   // Show the promo at most every two major versions.
   NSUserDefaults* standardDefaults = [NSUserDefaults standardUserDefaults];
   NSString* versionShown =
diff --git a/ios/chrome/browser/ui/main/scene_delegate.mm b/ios/chrome/browser/ui/main/scene_delegate.mm
index e5407690..bd379f6 100644
--- a/ios/chrome/browser/ui/main/scene_delegate.mm
+++ b/ios/chrome/browser/ui/main/scene_delegate.mm
@@ -39,6 +39,16 @@
     // Sizing of the window is handled by UIKit.
     _window = [[ChromeOverlayWindow alloc] init];
     CustomizeUIWindowAppearance(_window);
+
+    if (@available(iOS 13, *)) {
+      // Assign an a11y identifier for using in EGTest.
+      // See comment for [ChromeMatchersAppInterface windowWithNumber:] matcher
+      // for context.
+      self.sceneState.window.accessibilityIdentifier =
+          [NSString stringWithFormat:@"%ld", UIApplication.sharedApplication
+                                                     .connectedScenes.count -
+                                                 1];
+    }
   }
   return _window;
 }
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
index 1588511..2a1ba57 100644
--- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -28,6 +28,7 @@
     "manage_sync_settings_table_view_controller.h",
     "manage_sync_settings_table_view_controller.mm",
     "manage_sync_settings_view_controller_model_delegate.h",
+    "sync_error_settings_command_handler.h",
   ]
   deps = [
     ":constants",
@@ -58,6 +59,7 @@
     "//ios/chrome/browser/ui/alert_coordinator",
     "//ios/chrome/browser/ui/authentication",
     "//ios/chrome/browser/ui/authentication/cells",
+    "//ios/chrome/browser/ui/authentication/signin:signin_protected",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/icons",
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_command_handler.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_command_handler.h
index a8c6451..9c24d6b4 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_command_handler.h
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_command_handler.h
@@ -8,15 +8,6 @@
 // Protocol to communicate user actions from the mediator to its coordinator.
 @protocol GoogleServicesSettingsCommandHandler <NSObject>
 
-// Restarts the authentication flow.
-- (void)restartAuthenticationFlow;
-
-// Opens the reauth sync dialog.
-- (void)openReauthDialogAsSyncIsInAuthError;
-
-// Opens the passphrase dialog.
-- (void)openPassphraseDialog;
-
 // Presents the sign-in dialog to the user.
 - (void)showSignIn;
 
@@ -33,9 +24,6 @@
 // TODO(crbug.com/1043080): Remove web page API once MyGoogle UI is launched.
 - (void)openManageGoogleAccountWebPage;
 
-// Opens the trusted vault reauthentication dialog.
-- (void)openTrustedVaultReauth;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_GOOGLE_SERVICES_SETTINGS_COMMAND_HANDLER_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
index 9de3b39..f354cd4 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
@@ -28,6 +28,7 @@
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h"
+#import "ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h"
 #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -42,7 +43,8 @@
 @interface GoogleServicesSettingsCoordinator () <
     GoogleServicesSettingsCommandHandler,
     GoogleServicesSettingsViewControllerPresentationDelegate,
-    ManageSyncSettingsCoordinatorDelegate>
+    ManageSyncSettingsCoordinatorDelegate,
+    SyncErrorSettingsCommandHandler>
 
 // Google services settings mode.
 @property(nonatomic, assign, readonly) GoogleServicesSettingsMode mode;
@@ -111,6 +113,7 @@
   self.mediator.identityManager = IdentityManagerFactory::GetForBrowserState(
       self.browser->GetBrowserState());
   self.mediator.commandHandler = self;
+  self.mediator.syncErrorHandler = self;
   self.mediator.syncService = ProfileSyncServiceFactory::GetForBrowserState(
       self.browser->GetBrowserState());
   viewController.modelDelegate = self.mediator;
@@ -170,7 +173,7 @@
       isEqual:self.baseNavigationController.topViewController];
 }
 
-#pragma mark - GoogleServicesSettingsCommandHandler
+#pragma mark - SyncErrorSettingsCommandHandler
 
 - (void)restartAuthenticationFlow {
   ChromeIdentity* authenticatedIdentity =
@@ -222,6 +225,20 @@
   [self.baseNavigationController pushViewController:controller animated:YES];
 }
 
+- (void)openTrustedVaultReauth {
+  id<ApplicationCommands> applicationCommands =
+      static_cast<id<ApplicationCommands>>(
+          self.browser->GetCommandDispatcher());
+  [applicationCommands
+      showTrustedVaultReauthenticationFromViewController:
+          self.googleServicesSettingsViewController
+                                        retrievalTrigger:
+                                            syncer::KeyRetrievalTriggerForUMA::
+                                                kSettings];
+}
+
+#pragma mark - GoogleServicesSettingsCommandHandler
+
 - (void)showSignIn {
   __weak __typeof(self) weakSelf = self;
   DCHECK(self.handler);
@@ -287,18 +304,6 @@
   [handler closeSettingsUIAndOpenURL:command];
 }
 
-- (void)openTrustedVaultReauth {
-  id<ApplicationCommands> applicationCommands =
-      static_cast<id<ApplicationCommands>>(
-          self.browser->GetCommandDispatcher());
-  [applicationCommands
-      showTrustedVaultReauthenticationFromViewController:
-          self.googleServicesSettingsViewController
-                                        retrievalTrigger:
-                                            syncer::KeyRetrievalTriggerForUMA::
-                                                kSettings];
-}
-
 #pragma mark - GoogleServicesSettingsViewControllerPresentationDelegate
 
 - (void)googleServicesSettingsViewControllerDidRemove:
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h
index 5b52197..1a9f551 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h
@@ -17,6 +17,7 @@
 @protocol GoogleServicesSettingsCommandHandler;
 @class GoogleServicesSettingsViewController;
 class PrefService;
+@protocol SyncErrorSettingsCommandHandler;
 class SyncSetupService;
 
 namespace syncer {
@@ -41,6 +42,8 @@
 // Command handler.
 @property(nonatomic, weak) id<GoogleServicesSettingsCommandHandler>
     commandHandler;
+// Sync error handler.
+@property(nonatomic, weak) id<SyncErrorSettingsCommandHandler> syncErrorHandler;
 // Sync service.
 @property(nonatomic, assign) syncer::SyncService* syncService;
 // Identity manager;
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
index 0f9f7e7..10fd81b 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -30,6 +30,7 @@
 #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h"
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_command_handler.h"
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h"
+#import "ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h"
 #import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h"
 #import "ios/chrome/browser/ui/settings/utils/observable_boolean.h"
 #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
@@ -323,6 +324,11 @@
 // Updates the sync section. If |notifyConsumer| is YES, the consumer is
 // notified about model changes.
 - (void)updateSyncSection:(BOOL)notifyConsumer {
+  if (base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency)) {
+    // Chrome adds the sync section within "Manage Your Settings" for the MICE
+    // experiment.
+    return;
+  }
   BOOL needsAccountSigninItemUpdate = [self updateAccountSignInItem];
   BOOL needsSyncErrorItemsUpdate = [self updateSyncErrorItems];
   BOOL needsSyncChromeDataItemUpdate = [self updateSyncChromeDataItem];
@@ -596,12 +602,7 @@
 }
 
 - (BOOL)shouldDisplaySync {
-  BOOL experimentEnabled =
-      base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency);
-  BOOL firstSetupWithExperiment =
-      !self.syncSetupService->IsFirstSetupComplete() && experimentEnabled;
-  return (firstSetupWithExperiment || !experimentEnabled) &&
-         self.isAuthenticated && !self.isSyncDisabledByAdministrator;
+  return self.isAuthenticated && !self.isSyncDisabledByAdministrator;
 }
 
 - (ItemArray)nonPersonalizedItems {
@@ -815,7 +816,11 @@
     (GoogleServicesSettingsViewController*)controller {
   DCHECK_EQ(self.consumer, controller);
   [self loadIdentitySection];
-  [self loadSyncSection];
+  // For the MICE experiment Chrome will display the Sync section within "Manage
+  // Sync Settings".
+  if (!base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency)) {
+    [self loadSyncSection];
+  }
   [self loadNonPersonalizedSection];
   _identityManagerObserverBridge.reset(
       new signin::IdentityManagerObserverBridge(self.identityManager, self));
@@ -905,16 +910,16 @@
       [self.commandHandler showSignIn];
       break;
     case RestartAuthenticationFlowErrorItemType:
-      [self.commandHandler restartAuthenticationFlow];
+      [self.syncErrorHandler restartAuthenticationFlow];
       break;
     case ReauthDialogAsSyncIsInAuthErrorItemType:
-      [self.commandHandler openReauthDialogAsSyncIsInAuthError];
+      [self.syncErrorHandler openReauthDialogAsSyncIsInAuthError];
       break;
     case ShowPassphraseDialogErrorItemType:
-      [self.commandHandler openPassphraseDialog];
+      [self.syncErrorHandler openPassphraseDialog];
       break;
     case SyncNeedsTrustedVaultKeyErrorItemType:
-      [self.commandHandler openTrustedVaultReauth];
+      [self.syncErrorHandler openTrustedVaultReauth];
       break;
     case ManageSyncItemType:
       [self.commandHandler openManageSyncSettings];
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_command_handler.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_command_handler.h
index 0608b2c..aa599976 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_command_handler.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_command_handler.h
@@ -10,12 +10,9 @@
 // Protocol to communicate user actions from the mediator to its coordinator.
 @protocol ManageSyncSettingsCommandHandler <NSObject>
 
-// Opens the passphrase dialog.
-- (void)openPassphraseDialog;
-// Opens the trusted vault reauthentication dialog.
-- (void)openTrustedVaultReauth;
 // Opens the "Web & App Activity" dialog.
 - (void)openWebAppActivityDialog;
+
 // Opens the "Data from Chrome sync" web page.
 - (void)openDataFromChromeSyncWebPage;
 
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h
index 9b14499..3160b33 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h
@@ -20,6 +20,9 @@
 // yet.
 - (void)reloadItem:(TableViewItem*)item;
 
+// Reloads |sections|. Does nothing if the model is not loaded yet.
+- (void)reloadSections:(NSIndexSet*)sections;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_MANAGE_SYNC_SETTINGS_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
index 575b8e3..c743199 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -20,13 +20,16 @@
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #include "ios/chrome/browser/sync/sync_observer_bridge.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
+#import "ios/chrome/browser/ui/authentication/authentication_flow.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/commands/browsing_data_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_command_handler.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h"
+#import "ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h"
 #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -38,9 +41,13 @@
 #error "This file requires ARC support."
 #endif
 
+using signin_metrics::AccessPoint;
+using signin_metrics::PromoAction;
+
 @interface ManageSyncSettingsCoordinator () <
     ChromeIdentityBrowserOpener,
     ManageSyncSettingsCommandHandler,
+    SyncErrorSettingsCommandHandler,
     ManageSyncSettingsTableViewControllerPresentationDelegate,
     SyncObserverModelBridge> {
   // Sync observer.
@@ -54,9 +61,13 @@
 @property(nonatomic, strong) ManageSyncSettingsMediator* mediator;
 // Sync service.
 @property(nonatomic, assign, readonly) syncer::SyncService* syncService;
+// Authentication service.
+@property(nonatomic, assign, readonly) AuthenticationService* authService;
 // Dismiss callback for Web and app setting details view.
 @property(nonatomic, copy) ios::DismissASMViewControllerBlock
     dismissWebAndAppSettingDetailsControllerBlock;
+// Manages the authentication flow for a given identity.
+@property(nonatomic, strong) AuthenticationFlow* authenticationFlow;
 
 @end
 
@@ -81,7 +92,9 @@
           userPrefService:self.browser->GetBrowserState()->GetPrefs()];
   self.mediator.syncSetupService = SyncSetupServiceFactory::GetForBrowserState(
       self.browser->GetBrowserState());
+  self.mediator.authService = self.authService;
   self.mediator.commandHandler = self;
+  self.mediator.syncErrorHandler = self;
   self.viewController = [[ManageSyncSettingsTableViewController alloc]
       initWithStyle:UITableViewStyleGrouped];
   self.viewController.serviceDelegate = self.mediator;
@@ -100,6 +113,11 @@
       self.browser->GetBrowserState());
 }
 
+- (AuthenticationService*)authService {
+  return AuthenticationServiceFactory::GetForBrowserState(
+      self.browser->GetBrowserState());
+}
+
 #pragma mark - Private
 
 // Closes the Manage sync settings view controller.
@@ -137,6 +155,32 @@
 
 #pragma mark - ManageSyncSettingsCommandHandler
 
+- (void)openWebAppActivityDialog {
+  AuthenticationService* authService =
+      AuthenticationServiceFactory::GetForBrowserState(
+          self.browser->GetBrowserState());
+  base::RecordAction(base::UserMetricsAction(
+      "Signin_AccountSettings_GoogleActivityControlsClicked"));
+  self.dismissWebAndAppSettingDetailsControllerBlock =
+      ios::GetChromeBrowserProvider()
+          ->GetChromeIdentityService()
+          ->PresentWebAndAppSettingDetailsController(
+              authService->GetAuthenticatedIdentity(), self.viewController,
+              YES);
+}
+
+- (void)openDataFromChromeSyncWebPage {
+  GURL url = google_util::AppendGoogleLocaleParam(
+      GURL(kSyncGoogleDashboardURL),
+      GetApplicationContext()->GetApplicationLocale());
+  OpenNewTabCommand* command = [OpenNewTabCommand commandWithURLFromChrome:url];
+  id<ApplicationCommands> handler = HandlerForProtocol(
+      self.browser->GetCommandDispatcher(), ApplicationCommands);
+  [handler closeSettingsUIAndOpenURL:command];
+}
+
+#pragma mark - SyncErrorSettingsCommandHandler
+
 - (void)openPassphraseDialog {
   DCHECK(self.mediator.shouldEncryptionItemBeEnabled);
   UIViewController<SettingsRootViewControlling>* controllerToPush;
@@ -169,28 +213,44 @@
                                                 kSettings];
 }
 
-- (void)openWebAppActivityDialog {
-  AuthenticationService* authService =
+- (void)restartAuthenticationFlow {
+  ChromeIdentity* authenticatedIdentity =
       AuthenticationServiceFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
-  base::RecordAction(base::UserMetricsAction(
-      "Signin_AccountSettings_GoogleActivityControlsClicked"));
-  self.dismissWebAndAppSettingDetailsControllerBlock =
-      ios::GetChromeBrowserProvider()
-          ->GetChromeIdentityService()
-          ->PresentWebAndAppSettingDetailsController(
-              authService->GetAuthenticatedIdentity(), self.viewController,
-              YES);
+          self.browser->GetBrowserState())
+          ->GetAuthenticatedIdentity();
+  [self.viewController preventUserInteraction];
+  DCHECK(!self.authenticationFlow);
+  self.authenticationFlow =
+      [[AuthenticationFlow alloc] initWithBrowser:self.browser
+                                         identity:authenticatedIdentity
+                                  shouldClearData:SHOULD_CLEAR_DATA_USER_CHOICE
+                                 postSignInAction:POST_SIGNIN_ACTION_START_SYNC
+                         presentingViewController:self.viewController];
+  self.authenticationFlow.dispatcher = HandlerForProtocol(
+      self.browser->GetCommandDispatcher(), BrowsingDataCommands);
+  __weak ManageSyncSettingsCoordinator* weakSelf = self;
+  [self.authenticationFlow startSignInWithCompletion:^(BOOL success) {
+    // TODO(crbug.com/889919): Needs to add histogram for |success|.
+    DCHECK(weakSelf.authenticationFlow);
+    weakSelf.authenticationFlow = nil;
+    [weakSelf.viewController allowUserInteraction];
+  }];
 }
 
-- (void)openDataFromChromeSyncWebPage {
-  GURL url = google_util::AppendGoogleLocaleParam(
-      GURL(kSyncGoogleDashboardURL),
-      GetApplicationContext()->GetApplicationLocale());
-  OpenNewTabCommand* command = [OpenNewTabCommand commandWithURLFromChrome:url];
-  id<ApplicationCommands> handler = HandlerForProtocol(
-      self.browser->GetCommandDispatcher(), ApplicationCommands);
-  [handler closeSettingsUIAndOpenURL:command];
+- (void)openReauthDialogAsSyncIsInAuthError {
+  ChromeIdentity* identity = self.authService->GetAuthenticatedIdentity();
+  if (self.authService->HasCachedMDMErrorForIdentity(identity)) {
+    self.authService->ShowMDMErrorDialogForIdentity(identity);
+    return;
+  }
+  // Sync enters in a permanent auth error state when fetching an access token
+  // fails with invalid credentials. This corresponds to Gaia responding with an
+  // "invalid grant" error. The current implementation of the iOS SSOAuth
+  // library user by Chrome removes the identity from the device when receiving
+  // an "invalid grant" response, which leads to the account being also signed
+  // out of Chrome. So the sync permanent auth error is a transient state on
+  // iOS. The decision was to avoid handling this error in the UI, which means
+  // that the reauth dialog is not actually presented on iOS.
 }
 
 #pragma mark - SyncObserverModelBridge
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
index fe34aa6e..b3d0f91 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
@@ -10,8 +10,10 @@
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_service_delegate.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_view_controller_model_delegate.h"
 
+@protocol SyncErrorSettingsCommandHandler;
 @protocol ManageSyncSettingsCommandHandler;
 @protocol ManageSyncSettingsConsumer;
+class AuthenticationService;
 class PrefService;
 class SyncSetupService;
 namespace syncer {
@@ -27,8 +29,12 @@
 @property(nonatomic, weak) id<ManageSyncSettingsConsumer> consumer;
 // Sync setup service.
 @property(nonatomic, assign) SyncSetupService* syncSetupService;
+// Authentication service.
+@property(nonatomic, assign) AuthenticationService* authService;
 // Command handler.
 @property(nonatomic, weak) id<ManageSyncSettingsCommandHandler> commandHandler;
+// Error command handler.
+@property(nonatomic, weak) id<SyncErrorSettingsCommandHandler> syncErrorHandler;
 // Returns YES if the encryption item should be enabled.
 @property(nonatomic, assign, readonly) BOOL shouldEncryptionItemBeEnabled;
 
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
index 14c879f..82e819e6 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -9,16 +9,21 @@
 #include "base/mac/foundation_util.h"
 #include "base/notreached.h"
 #include "components/autofill/core/common/autofill_prefs.h"
+#import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/sync/driver/sync_service.h"
+#import "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #include "ios/chrome/browser/sync/sync_observer_bridge.h"
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
+#import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h"
 #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_command_handler.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h"
+#import "ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h"
+#import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h"
 #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_image_item.h"
@@ -43,6 +48,8 @@
   SyncDataTypeSectionIdentifier = kSectionIdentifierEnumZero,
   // Advanced settings.
   AdvancedSettingsSectionIdentifier,
+  // Sync errors.
+  SyncErrorsSectionIdentifier,
 };
 
 // List of items. For implementation details in
@@ -77,13 +84,23 @@
   GoogleActivityControlsItemType,
   // Data from Chrome sync.
   DataFromChromeSync,
+  // Sync errors.
+  RestartAuthenticationFlowErrorItemType,
+  ReauthDialogAsSyncIsInAuthErrorItemType,
+  ShowPassphraseDialogErrorItemType,
+  SyncNeedsTrustedVaultKeyErrorItemType,
+  SyncDisabledByAdministratorErrorItemType,
+  SyncSettingsNotCofirmedErrorItemType,
 };
 
+// Enterprise icon.
+NSString* kGoogleServicesEnterpriseImage = @"google_services_enterprise";
+// Sync error icon.
 NSString* kGoogleServicesSyncErrorImage = @"google_services_sync_error";
-
 }  // namespace
 
 @interface ManageSyncSettingsMediator () <BooleanObserver,
+                                          IdentityManagerObserverBridgeDelegate,
                                           SyncObserverModelBridge> {
   // Sync observer.
   std::unique_ptr<SyncObserverBridge> _syncObserver;
@@ -104,10 +121,16 @@
 @property(nonatomic, strong) SyncSwitchItem* autocompleteWalletItem;
 // Encryption item.
 @property(nonatomic, strong) TableViewImageItem* encryptionItem;
+// Sync error item.
+@property(nonatomic, strong) TableViewItem* syncErrorItem;
 // Returns YES if the sync data items should be enabled.
 @property(nonatomic, assign, readonly) BOOL shouldSyncDataItemEnabled;
 // Returns whether the Sync settings should be disabled because of a Sync error.
 @property(nonatomic, assign, readonly) BOOL disabledBecauseOfSyncError;
+// Returns YES if the user cannot turn on sync for enterprise policy reasons.
+@property(nonatomic, assign, readonly) BOOL isSyncDisabledByAdministrator;
+// Returns YES if the user is authenticated.
+@property(nonatomic, assign, readonly) BOOL isAuthenticated;
 
 @end
 
@@ -392,6 +415,7 @@
 - (void)manageSyncSettingsTableViewControllerLoadModel:
     (id<ManageSyncSettingsConsumer>)controller {
   DCHECK_EQ(self.consumer, controller);
+  [self loadSyncErrorsSection];
   [self loadSyncDataTypeSection];
   [self loadAdvancedSettingsSection];
 }
@@ -409,11 +433,23 @@
     // The UI should not updated so the switch animations can run smoothly.
     return;
   }
+  [self updateSyncErrorsSection:YES];
   [self updateSyncEverythingItemNotifyConsumer:YES];
   [self updateSyncItemsNotifyConsumer:YES];
   [self updateEncryptionItem:YES];
 }
 
+#pragma mark - IdentityManagerObserverBridgeDelegate
+
+- (void)onPrimaryAccountSet:(const CoreAccountInfo&)primaryAccountInfo {
+  [self updateSyncErrorsSection:YES];
+}
+
+- (void)onPrimaryAccountCleared:
+    (const CoreAccountInfo&)previousPrimaryAccountInfo {
+  [self updateSyncErrorsSection:YES];
+}
+
 #pragma mark - ManageSyncSettingsServiceDelegate
 
 - (void)toggleSwitchItem:(TableViewItem*)item withValue:(BOOL)value {
@@ -465,6 +501,12 @@
       case EncryptionItemType:
       case GoogleActivityControlsItemType:
       case DataFromChromeSync:
+      case RestartAuthenticationFlowErrorItemType:
+      case ReauthDialogAsSyncIsInAuthErrorItemType:
+      case ShowPassphraseDialogErrorItemType:
+      case SyncNeedsTrustedVaultKeyErrorItemType:
+      case SyncDisabledByAdministratorErrorItemType:
+      case SyncSettingsNotCofirmedErrorItemType:
         NOTREACHED();
         break;
     }
@@ -479,10 +521,10 @@
     case EncryptionItemType:
       if (self.syncSetupService->GetSyncServiceState() ==
           SyncSetupService::kSyncServiceNeedsTrustedVaultKey) {
-        [self.commandHandler openTrustedVaultReauth];
+        [self.syncErrorHandler openTrustedVaultReauth];
         break;
       }
-      [self.commandHandler openPassphraseDialog];
+      [self.syncErrorHandler openPassphraseDialog];
       break;
     case GoogleActivityControlsItemType:
       [self.commandHandler openWebAppActivityDialog];
@@ -490,6 +532,18 @@
     case DataFromChromeSync:
       [self.commandHandler openDataFromChromeSyncWebPage];
       break;
+    case RestartAuthenticationFlowErrorItemType:
+      [self.syncErrorHandler restartAuthenticationFlow];
+      break;
+    case ReauthDialogAsSyncIsInAuthErrorItemType:
+      [self.syncErrorHandler openReauthDialogAsSyncIsInAuthError];
+      break;
+    case ShowPassphraseDialogErrorItemType:
+      [self.syncErrorHandler openPassphraseDialog];
+      break;
+    case SyncNeedsTrustedVaultKeyErrorItemType:
+      [self.syncErrorHandler openTrustedVaultReauth];
+      break;
     case SyncEverythingItemType:
     case AutofillDataTypeItemType:
     case BookmarksDataTypeItemType:
@@ -499,9 +553,165 @@
     case ReadingListDataTypeItemType:
     case SettingsDataTypeItemType:
     case AutocompleteWalletItemType:
+    case SyncDisabledByAdministratorErrorItemType:
+    case SyncSettingsNotCofirmedErrorItemType:
       // Nothing to do.
       break;
   }
 }
 
+// Creates an item to display the sync error. |itemType| should only be one of
+// those types:
+//   + RestartAuthenticationFlowErrorItemType
+//   + ReauthDialogAsSyncIsInAuthErrorItemType
+//   + ShowPassphraseDialogErrorItemType
+//   + SyncNeedsTrustedVaultKeyErrorItemType
+//   + SyncSettingsNotCofirmedErrorItemType
+- (TableViewItem*)createSyncErrorItemWithItemType:(NSInteger)itemType {
+  DCHECK(itemType == RestartAuthenticationFlowErrorItemType ||
+         itemType == ReauthDialogAsSyncIsInAuthErrorItemType ||
+         itemType == ShowPassphraseDialogErrorItemType ||
+         itemType == SyncNeedsTrustedVaultKeyErrorItemType ||
+         itemType == SyncSettingsNotCofirmedErrorItemType);
+  SettingsImageDetailTextItem* syncErrorItem =
+      [[SettingsImageDetailTextItem alloc] initWithType:itemType];
+  syncErrorItem.text = GetNSString(IDS_IOS_SYNC_ERROR_TITLE);
+  syncErrorItem.detailText =
+      GetSyncErrorDescriptionForSyncSetupService(self.syncSetupService);
+  if (itemType == SyncSettingsNotCofirmedErrorItemType) {
+    // Special case for the sync error title.
+    syncErrorItem.text = GetNSString(IDS_IOS_SYNC_SETUP_NOT_CONFIRMED_TITLE);
+  } else if (itemType == ShowPassphraseDialogErrorItemType) {
+    // Special case only for the sync passphrase error message. The regular
+    // error message should be still be displayed in the first settings screen.
+    syncErrorItem.detailText = GetNSString(
+        IDS_IOS_GOOGLE_SERVICES_SETTINGS_ENTER_PASSPHRASE_TO_START_SYNC);
+  } else if (itemType == SyncNeedsTrustedVaultKeyErrorItemType) {
+    // Special case only for the sync encryption key error message. The regular
+    // error message should be still be displayed in the first settings screen.
+    syncErrorItem.detailText =
+        GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_ENCRYPTION_FIX_NOW);
+
+    // Also override the title to be more accurate, if only passwords are being
+    // encrypted.
+    if (!self.syncSetupService->IsEncryptEverythingEnabled()) {
+      syncErrorItem.text = GetNSString(IDS_IOS_SYNC_PASSWORDS_ERROR_TITLE);
+    }
+  }
+  syncErrorItem.image = [UIImage imageNamed:kGoogleServicesSyncErrorImage];
+  return syncErrorItem;
+}
+
+// Loads the sync errors section.
+- (void)loadSyncErrorsSection {
+  [self.consumer.tableViewModel
+      addSectionWithIdentifier:SyncErrorsSectionIdentifier];
+  [self updateSyncErrorsSection:NO];
+}
+
+// Updates the sync errors section. If |notifyConsumer| is YES, the consumer is
+// notified about model changes.
+- (void)updateSyncErrorsSection:(BOOL)notifyConsumer {
+  if (!base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency)) {
+    return;
+  }
+  BOOL needsSyncErrorItemsUpdate = [self updateSyncErrorItems];
+  if (notifyConsumer && needsSyncErrorItemsUpdate) {
+    NSUInteger sectionIndex = [self.consumer.tableViewModel
+        sectionForSectionIdentifier:SyncErrorsSectionIdentifier];
+    NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:sectionIndex];
+    [self.consumer reloadSections:indexSet];
+  }
+}
+
+// Adds, removes and updates the sync error item in the model as needed. Returns
+// YES if the consumer should be notified.
+- (BOOL)updateSyncErrorItems {
+  TableViewModel* model = self.consumer.tableViewModel;
+  BOOL hasError = NO;
+  ItemType type;
+
+  if (self.isSyncDisabledByAdministrator) {
+    type = SyncDisabledByAdministratorErrorItemType;
+    hasError = YES;
+  } else if (self.isAuthenticated && self.syncSetupService->IsSyncEnabled()) {
+    switch (self.syncSetupService->GetSyncServiceState()) {
+      case SyncSetupService::kSyncServiceUnrecoverableError:
+        type = RestartAuthenticationFlowErrorItemType;
+        hasError = YES;
+        break;
+      case SyncSetupService::kSyncServiceSignInNeedsUpdate:
+        type = ReauthDialogAsSyncIsInAuthErrorItemType;
+        hasError = YES;
+        break;
+      case SyncSetupService::kSyncServiceNeedsPassphrase:
+        type = ShowPassphraseDialogErrorItemType;
+        hasError = YES;
+        break;
+      case SyncSetupService::kSyncServiceNeedsTrustedVaultKey:
+        type = SyncNeedsTrustedVaultKeyErrorItemType;
+        hasError = YES;
+        break;
+      case SyncSetupService::kSyncSettingsNotConfirmed:
+        type = SyncSettingsNotCofirmedErrorItemType;
+        hasError = YES;
+        break;
+      case SyncSetupService::kNoSyncServiceError:
+      case SyncSetupService::kSyncServiceCouldNotConnect:
+      case SyncSetupService::kSyncServiceServiceUnavailable:
+        break;
+    }
+  }
+
+  if ((!hasError && !self.syncErrorItem) ||
+      (hasError && self.syncErrorItem && type == self.syncErrorItem.type)) {
+    // Nothing to update.
+    return NO;
+  }
+
+  if (self.syncErrorItem) {
+    // Remove the previous sync error item, since it is either the wrong error
+    // (if hasError is YES), or there is no error anymore.
+    [model removeItemWithType:self.syncErrorItem.type
+        fromSectionWithIdentifier:SyncErrorsSectionIdentifier];
+    self.syncErrorItem = nil;
+    if (!hasError)
+      return YES;
+  }
+  // Add the sync error item and its section.
+  if (type == SyncDisabledByAdministratorErrorItemType) {
+    self.syncErrorItem = [self createSyncDisabledByAdministratorErrorItem];
+  } else {
+    self.syncErrorItem = [self createSyncErrorItemWithItemType:type];
+  }
+  [model insertItem:self.syncErrorItem
+      inSectionWithIdentifier:SyncErrorsSectionIdentifier
+                      atIndex:0];
+  return YES;
+}
+
+// Returns an item to show to the user the sync cannot be turned on for an
+// enterprise policy reason.
+- (TableViewItem*)createSyncDisabledByAdministratorErrorItem {
+  TableViewImageItem* item = [[TableViewImageItem alloc]
+      initWithType:SyncDisabledByAdministratorErrorItemType];
+  item.image = [UIImage imageNamed:kGoogleServicesEnterpriseImage];
+  item.title = GetNSString(
+      IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_DISABLBED_BY_ADMINISTRATOR_TITLE);
+  item.enabled = NO;
+  item.textColor = UIColor.cr_secondaryLabelColor;
+  return item;
+}
+
+#pragma mark - Properties
+
+- (BOOL)isSyncDisabledByAdministrator {
+  return self.syncService->GetDisableReasons().Has(
+      syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
+}
+
+- (BOOL)isAuthenticated {
+  return self.authService->IsAuthenticated();
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
index cbc07bc3..1a4f645 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
@@ -90,6 +90,15 @@
                         withRowAnimation:UITableViewRowAnimationNone];
 }
 
+- (void)reloadSections:(NSIndexSet*)sections {
+  if (!self.tableViewModel) {
+    // No need to reload since the model has not been loaded yet.
+    return;
+  }
+  [self.tableView reloadSections:sections
+                withRowAnimation:UITableViewRowAnimationNone];
+}
+
 #pragma mark - UITableViewDelegate
 
 - (void)tableView:(UITableView*)tableView
diff --git a/ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h b/ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h
new file mode 100644
index 0000000..2389c3d
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_SYNC_ERROR_SETTINGS_COMMAND_HANDLER_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_SYNC_ERROR_SETTINGS_COMMAND_HANDLER_H_
+
+// Protocol to communicate actions following Sync errors from the mediator to
+// its coordinator.
+@protocol SyncErrorSettingsCommandHandler <NSObject>
+
+// Restarts the authentication flow.
+- (void)restartAuthenticationFlow;
+
+// Opens the reauth sync dialog.
+- (void)openReauthDialogAsSyncIsInAuthError;
+
+// Opens the passphrase dialog.
+- (void)openPassphraseDialog;
+
+// Opens the trusted vault reauthentication dialog.
+- (void)openTrustedVaultReauth;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_SYNC_ERROR_SETTINGS_COMMAND_HANDLER_H_
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
index 3f29c1b..3110260 100644
--- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
@@ -824,7 +824,6 @@
     base::UmaHistogramEnumeration(
         kSafetyCheckMetricsUpdates,
         safety_check::SafetyCheck::UpdateStatus::kUpdated);
-    [defaults setBool:details.is_up_to_date forKey:kIOSChromeUpToDateKey];
   } else {
     // upgradeURL and next_version are only set if not up to date.
     const GURL& upgradeUrl = details.upgrade_url;
@@ -861,7 +860,6 @@
                 forKey:kIOSChromeUpgradeURLKey];
     [defaults setValue:base::SysUTF8ToNSString(details.next_version)
                 forKey:kIOSChromeNextVersionKey];
-    [defaults setBool:details.is_up_to_date forKey:kIOSChromeUpToDateKey];
 
     // Treat the safety check finding the device out of date as if the update
     // infobar was just shown to not overshow the infobar to the user.
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 51480d7..15f5add 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -1482,6 +1482,9 @@
   [_privacyCoordinator stop];
   _privacyCoordinator = nil;
 
+  [_manageSyncSettingsCoordinator stop];
+  _manageSyncSettingsCoordinator = nil;
+
   _settingsHasBeenDismissed = YES;
   DCHECK(!self.isSigninInProgress);
   [_signinPromoViewMediator signinPromoViewIsRemoved];
diff --git a/ios/chrome/browser/upgrade/BUILD.gn b/ios/chrome/browser/upgrade/BUILD.gn
index 504846e..78c57b32 100644
--- a/ios/chrome/browser/upgrade/BUILD.gn
+++ b/ios/chrome/browser/upgrade/BUILD.gn
@@ -34,11 +34,7 @@
     "upgrade_utils.h",
     "upgrade_utils.mm",
   ]
-  deps = [
-    "//base",
-    "//components/version_info:version_info",
-    "//ios/chrome/browser",
-  ]
+  deps = [ "//ios/chrome/browser" ]
   frameworks = [ "UIKit.framework" ]
 }
 
diff --git a/ios/chrome/browser/upgrade/upgrade_center.mm b/ios/chrome/browser/upgrade/upgrade_center.mm
index 2f49c10..98bc4c703 100644
--- a/ios/chrome/browser/upgrade/upgrade_center.mm
+++ b/ios/chrome/browser/upgrade/upgrade_center.mm
@@ -430,7 +430,6 @@
   [defaults setValue:base::SysUTF8ToNSString(upgradeUrl.spec())
               forKey:kIOSChromeUpgradeURLKey];
   [defaults setValue:newVersionString forKey:kIOSChromeNextVersionKey];
-  [defaults setBool:details.is_up_to_date forKey:kIOSChromeUpToDateKey];
 
   if ([self shouldShowInfoBar])
     [self showUpgradeInfoBars];
diff --git a/ios/chrome/browser/upgrade/upgrade_utils.mm b/ios/chrome/browser/upgrade/upgrade_utils.mm
index 1f8b3777..90497bc6 100644
--- a/ios/chrome/browser/upgrade/upgrade_utils.mm
+++ b/ios/chrome/browser/upgrade/upgrade_utils.mm
@@ -4,11 +4,7 @@
 
 #import "ios/chrome/browser/upgrade/upgrade_utils.h"
 
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/version.h"
-#include "components/version_info/version_info.h"
+#import <Foundation/Foundation.h>
 #include "ios/chrome/browser/upgrade/upgrade_constants.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -16,19 +12,6 @@
 #endif
 
 bool IsAppUpToDate() {
-  // See if the user is out of date based on current information.
-  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
-  NSString* nextVersionString =
-      [defaults stringForKey:kIOSChromeNextVersionKey];
-  base::Version nextVersion =
-      base::Version(base::SysNSStringToUTF8(nextVersionString));
-
-  const base::Version& currentVersion = version_info::GetVersion();
-
-  // TODO(crbug.com/1078782): Add max supported version support.
-  if (nextVersion.IsValid() && nextVersion > currentVersion &&
-      (nextVersion.components()[0] - currentVersion.components()[0]) < 9) {
-    return NO;
-  }
-  return YES;
+  return
+      [[NSUserDefaults standardUserDefaults] boolForKey:kIOSChromeUpToDateKey];
 }
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn
index 2a2ff175..fbf1799 100644
--- a/ios/chrome/browser/web/BUILD.gn
+++ b/ios/chrome/browser/web/BUILD.gn
@@ -449,7 +449,6 @@
     "//ios/chrome/browser:chrome_url_constants",
     "//ios/chrome/browser/ui/infobars/banners:public",
     "//ios/chrome/browser/ui/popup_menu:constants",
-    "//ios/chrome/browser/ui/util:multiwindow_util",
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/net:test_support",
diff --git a/ios/chrome/browser/web/restore_egtest.mm b/ios/chrome/browser/web/restore_egtest.mm
index e47210e6..3fe0f3f1 100644
--- a/ios/chrome/browser/web/restore_egtest.mm
+++ b/ios/chrome/browser/web/restore_egtest.mm
@@ -5,7 +5,6 @@
 #include "base/bind.h"
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
-#import "ios/chrome/browser/ui/util/multi_window_support.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -191,10 +190,6 @@
 // Tests that only the selected web state is loaded Restore-after-Crash.  This
 // is only possible in EG2.
 - (void)testRestoreOneWebstateOnlyAfterCrash {
-  if (IsSceneStartupSupported()) {
-    // TODO(crbug.com/1108433): Session restoration not available yet in MW.
-    EARL_GREY_TEST_DISABLED(@"Disabled in Multiwindow.");
-  }
   // Visit the background page.
   int visitCounter = 0;
   self.testServer->RegisterRequestHandler(
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h
index 8b101fa..722764e7 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.h
+++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -13,6 +13,14 @@
 
 namespace chrome_test_util {
 
+// Matcher for a window with a given number.
+// Window numbers are assigned at scene creation. Normally, each EGTest will
+// start with exactly one window with number 0. Each time a window is created,
+// it is assigned an accessibility identifier equal to the number of connected
+// scenes (stored as NSString). This means typically any windows created in a
+// test will have consecutive numbers.
+id<GREYMatcher> WindowWithNumber(int window_number);
+
 // Matcher for element with accessibility label corresponding to |message_id|
 // and accessibility trait UIAccessibilityTraitButton.
 id<GREYMatcher> ButtonWithAccessibilityLabelId(int message_id);
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index 24c4dac..7d24e7d8 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -16,6 +16,10 @@
 
 namespace chrome_test_util {
 
+id<GREYMatcher> WindowWithNumber(int window_number) {
+  return [ChromeMatchersAppInterface windowWithNumber:window_number];
+}
+
 id<GREYMatcher> ButtonWithAccessibilityLabel(NSString* label) {
   return [ChromeMatchersAppInterface buttonWithAccessibilityLabel:label];
 }
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
index a381260..6658ba0 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
@@ -15,6 +15,14 @@
 // define the matchers in the app process.
 @interface ChromeMatchersAppInterface : NSObject
 
+// Matcher for a window with a given number.
+// Window numbers are assigned at scene creation. Normally, each EGTest will
+// start with exactly one window with number 0. Each time a window is created,
+// it is assigned an accessibility identifier equal to the number of connected
+// scenes (stored as NSString). This means typically any windows created in a
+// test will have consecutive numbers.
++ (id<GREYMatcher>)windowWithNumber:(int)windowNumber;
+
 // Matcher for element with accessibility label corresponding to |label| and
 // accessibility trait UIAccessibilityTraitButton.
 + (id<GREYMatcher>)buttonWithAccessibilityLabel:(NSString*)label;
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
index 7e6879a..4a82bbac 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -129,6 +129,12 @@
 
 @implementation ChromeMatchersAppInterface
 
++ (id<GREYMatcher>)windowWithNumber:(int)windowNumber {
+  return grey_allOf(
+      grey_accessibilityLabel([NSString stringWithFormat:@"%d", windowNumber]),
+      grey_kindOfClass([UIWindow class]), nil);
+}
+
 + (id<GREYMatcher>)buttonWithAccessibilityLabel:(NSString*)label {
   return grey_allOf(grey_accessibilityLabel(label),
                     grey_accessibilityTrait(UIAccessibilityTraitButton), nil);
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn
index 284a43b..e098bc7 100644
--- a/ios/chrome/test/earl_grey2/BUILD.gn
+++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -197,7 +197,6 @@
     "//ios/chrome/browser:pref_names",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/settings/password:password_constants",
-    "//ios/chrome/browser/ui/util:multiwindow_util",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ios/third_party/earl_grey2:test_lib",
diff --git a/ios/chrome/test/earl_grey2/smoke_egtest.mm b/ios/chrome/test/earl_grey2/smoke_egtest.mm
index 22cfe8d..425e5116 100644
--- a/ios/chrome/test/earl_grey2/smoke_egtest.mm
+++ b/ios/chrome/test/earl_grey2/smoke_egtest.mm
@@ -8,7 +8,6 @@
 #include "ios/chrome/browser/pref_names.h"
 #import "ios/chrome/browser/ui/settings/password/passwords_table_view_constants.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
-#import "ios/chrome/browser/ui/util/multi_window_support.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -261,10 +260,6 @@
 
 // Tests hard kill(crash) through AppLaunchManager.
 - (void)testAppLaunchManagerForceRelaunchByKilling {
-  if (IsSceneStartupSupported()) {
-    // TODO(crbug.com/1108395): Session restoration not available yet in MW.
-    EARL_GREY_TEST_DISABLED(@"Disabled in Multiwindow.");
-  }
   [ChromeEarlGrey openNewTab];
   [[AppLaunchManager sharedManager] ensureAppLaunchedWithFeaturesEnabled:{}
       disabled:{}
diff --git a/ios/components/webui/sync_internals/sync_internals_message_handler.h b/ios/components/webui/sync_internals/sync_internals_message_handler.h
index 9f2ac70..cf43a55 100644
--- a/ios/components/webui/sync_internals/sync_internals_message_handler.h
+++ b/ios/components/webui/sync_internals/sync_internals_message_handler.h
@@ -12,7 +12,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
 #include "components/sync/driver/sync_service_observer.h"
-#include "components/sync/engine/cycle/type_debug_info_observer.h"
 #include "components/sync/engine/events/protocol_event_observer.h"
 #include "components/sync/js/js_controller.h"
 #include "components/sync/js/js_event_handler.h"
@@ -26,8 +25,7 @@
 class SyncInternalsMessageHandler : public web::WebUIIOSMessageHandler,
                                     public syncer::JsEventHandler,
                                     public syncer::SyncServiceObserver,
-                                    public syncer::ProtocolEventObserver,
-                                    public syncer::TypeDebugInfoObserver {
+                                    public syncer::ProtocolEventObserver {
  public:
   SyncInternalsMessageHandler();
   ~SyncInternalsMessageHandler() override;
@@ -37,9 +35,6 @@
   // Sets up observers to receive events and forward them to the UI.
   void HandleRegisterForEvents(const base::ListValue* args);
 
-  // Sets up observers to receive per-type counters and forward them to the UI.
-  void HandleRegisterForPerTypeCounters(const base::ListValue* args);
-
   // Fires an event to send updated info back to the page.
   void HandleRequestUpdatedAboutInfo(const base::ListValue* args);
 
@@ -82,23 +77,6 @@
   // ProtocolEventObserver implementation.
   void OnProtocolEvent(const syncer::ProtocolEvent& e) override;
 
-  // TypeDebugInfoObserver implementation.
-  void OnCommitCountersUpdated(syncer::ModelType type,
-                               const syncer::CommitCounters& counters) override;
-  void OnUpdateCountersUpdated(syncer::ModelType type,
-                               const syncer::UpdateCounters& counters) override;
-  void OnStatusCountersUpdated(syncer::ModelType type,
-                               const syncer::StatusCounters& counters) override;
-
-  // Helper to emit counter updates.
-  //
-  // Used in implementation of On*CounterUpdated methods.  Emits the given
-  // dictionary value with additional data to specify the model type and
-  // counter type.
-  void EmitCounterUpdate(syncer::ModelType type,
-                         const std::string& counter_type,
-                         std::unique_ptr<base::DictionaryValue> value);
-
  private:
   // Fetches updated aboutInfo and sends it to the page in the form of an
   // onAboutInfoUpdated event.
@@ -113,10 +91,6 @@
   // A flag used to prevent double-registration with ProfileSyncService.
   bool is_registered_ = false;
 
-  // A flag used to prevent double-registration as TypeDebugInfoObserver with
-  // ProfileSyncService.
-  bool is_registered_for_counters_ = false;
-
   // Whether specifics should be included when converting protocol events to a
   // human readable format.
   bool include_specifics_ = false;
diff --git a/ios/components/webui/sync_internals/sync_internals_message_handler.mm b/ios/components/webui/sync_internals/sync_internals_message_handler.mm
index 7978eea..1b88615 100644
--- a/ios/components/webui/sync_internals/sync_internals_message_handler.mm
+++ b/ios/components/webui/sync_internals/sync_internals_message_handler.mm
@@ -16,9 +16,6 @@
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_user_settings.h"
-#include "components/sync/engine/cycle/commit_counters.h"
-#include "components/sync/engine/cycle/status_counters.h"
-#include "components/sync/engine/cycle/update_counters.h"
 #include "components/sync/engine/events/protocol_event.h"
 #include "components/sync/js/js_event_details.h"
 #include "ios/components/webui/web_ui_provider.h"
@@ -54,10 +51,6 @@
     service->RemoveObserver(this);
     service->RemoveProtocolEventObserver(this);
   }
-
-  if (service && is_registered_for_counters_) {
-    service->RemoveTypeDebugInfoObserver(this);
-  }
 }
 
 void SyncInternalsMessageHandler::RegisterMessages() {
@@ -69,12 +62,6 @@
                           base::Unretained(this)));
 
   web_ui()->RegisterMessageCallback(
-      syncer::sync_ui_util::kRegisterForPerTypeCounters,
-      base::BindRepeating(
-          &SyncInternalsMessageHandler::HandleRegisterForPerTypeCounters,
-          base::Unretained(this)));
-
-  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestUpdatedAboutInfo,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleRequestUpdatedAboutInfo,
@@ -143,22 +130,6 @@
   }
 }
 
-void SyncInternalsMessageHandler::HandleRegisterForPerTypeCounters(
-    const base::ListValue* args) {
-  DCHECK(args->empty());
-
-  if (syncer::SyncService* service = GetSyncService()) {
-    if (!is_registered_for_counters_) {
-      service->AddTypeDebugInfoObserver(this);
-      is_registered_for_counters_ = true;
-    } else {
-      // Re-register to ensure counters get re-emitted.
-      service->RemoveTypeDebugInfoObserver(this);
-      service->AddTypeDebugInfoObserver(this);
-    }
-  }
-}
-
 void SyncInternalsMessageHandler::HandleRequestUpdatedAboutInfo(
     const base::ListValue* args) {
   DCHECK(args->empty());
@@ -287,35 +258,6 @@
   DispatchEvent(syncer::sync_ui_util::kOnProtocolEvent, *value);
 }
 
-void SyncInternalsMessageHandler::OnCommitCountersUpdated(
-    syncer::ModelType type,
-    const syncer::CommitCounters& counters) {
-  EmitCounterUpdate(type, syncer::sync_ui_util::kCommit, counters.ToValue());
-}
-
-void SyncInternalsMessageHandler::OnUpdateCountersUpdated(
-    syncer::ModelType type,
-    const syncer::UpdateCounters& counters) {
-  EmitCounterUpdate(type, syncer::sync_ui_util::kUpdate, counters.ToValue());
-}
-
-void SyncInternalsMessageHandler::OnStatusCountersUpdated(
-    syncer::ModelType type,
-    const syncer::StatusCounters& counters) {
-  EmitCounterUpdate(type, syncer::sync_ui_util::kStatus, counters.ToValue());
-}
-
-void SyncInternalsMessageHandler::EmitCounterUpdate(
-    syncer::ModelType type,
-    const std::string& counter_type,
-    std::unique_ptr<base::DictionaryValue> value) {
-  std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue());
-  details->SetString(syncer::sync_ui_util::kModelType, ModelTypeToString(type));
-  details->SetString(syncer::sync_ui_util::kCounterType, counter_type);
-  details->Set(syncer::sync_ui_util::kCounters, std::move(value));
-  DispatchEvent(syncer::sync_ui_util::kOnCountersUpdated, *details);
-}
-
 void SyncInternalsMessageHandler::HandleJsEvent(
     const std::string& name,
     const syncer::JsEventDetails& details) {
diff --git a/ios/components/webui/sync_internals/sync_internals_ui.mm b/ios/components/webui/sync_internals/sync_internals_ui.mm
index f7324919..b6b8e0f 100644
--- a/ios/components/webui/sync_internals/sync_internals_ui.mm
+++ b/ios/components/webui/sync_internals/sync_internals_ui.mm
@@ -30,8 +30,6 @@
                           IDR_SYNC_DRIVER_SYNC_INTERNALS_INDEX_JS);
   source->AddResourcePath(syncer::sync_ui_util::kChromeSyncJS,
                           IDR_SYNC_DRIVER_SYNC_INTERNALS_CHROME_SYNC_JS);
-  source->AddResourcePath(syncer::sync_ui_util::kTypesJS,
-                          IDR_SYNC_DRIVER_SYNC_INTERNALS_TYPES_JS);
   source->AddResourcePath(syncer::sync_ui_util::kSyncLogJS,
                           IDR_SYNC_DRIVER_SYNC_INTERNALS_SYNC_LOG_JS);
   source->AddResourcePath(syncer::sync_ui_util::kSyncNodeBrowserJS,
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index 70b4210..dde5282 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-6a41b66afa6ac4c91bc706153c5be6bb95fe6763
\ No newline at end of file
+65ad565e081aca74635611002601c8ca899fc86f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index 607822f..fce6d2aeb 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-02d9adc00c779c1458c25922f6c4bc31bb907fda
\ No newline at end of file
+9ffb7bd60462ff3f2b68ba80f9c78955789dbadf
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index f47763b..92461bc 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-d542615e0f8f7d1435e3a6f5b46a72d4f8b0bef5
\ No newline at end of file
+6eac65decfaf310fd4e01b1ed517c5591891ab16
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index 741d96f8..b8078b9 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-a3bf5eb4b75ecbc7b63099d4181b8cb53cb711a5
\ No newline at end of file
+1259d430abbe6abd5f4c5f3d092da46ebbda5b69
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index c1a1929..3373108 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-f2db4822560a37253f71fa4e0665bc94c9b00dc3
\ No newline at end of file
+1e3518b33a67181b1f4818430c4846315c553612
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index bbc4d9b..a8054dbb 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-956e8850ee3b807336cb51b9cbc9bc18e6d14f86
\ No newline at end of file
+1afa8c567d40c75c876f526f211b8c3d0f4f9543
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index eb13d7f9..629d1f1 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-6f86879748d907678a57fe676f2e440b3cb5fec4
\ No newline at end of file
+b609dffca2a8133aed5cbfe8f737366ac3f59cdb
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index 5c78455..9c0a0ba 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-da0a5e5763b30ba640a6ae6fac13980a6b8a6a7f
\ No newline at end of file
+337964a3e8b8eeba5d9bd32c2abaca8006e70b31
\ No newline at end of file
diff --git a/ios/web/webui/shared_resources_data_source_ios.mm b/ios/web/webui/shared_resources_data_source_ios.mm
index 1b6e58c..3a72e3df 100644
--- a/ios/web/webui/shared_resources_data_source_ios.mm
+++ b/ios/web/webui/shared_resources_data_source_ios.mm
@@ -57,7 +57,7 @@
   WebClient* web_client = GetWebClient();
 
   int idr = resource ? resource->value : -1;
-  if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS) {
+  if (idr == IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS) {
     std::string css = webui::GetWebUiCssTextDefaults();
     bytes = base::RefCountedString::TakeString(&css);
   } else {
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc
index e8032e4..f905fbd 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc
@@ -26,7 +26,6 @@
 #include "base/threading/thread_id_name_manager.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
-#include "base/trace_event/task_execution_macros.h"
 #include "base/trace_event/thread_instruction_count.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_log.h"
@@ -1019,17 +1018,20 @@
 TEST_F(TraceEventDataSourceTest, TaskExecutionEvent) {
   CreateTraceEventDataSource();
 
-  base::PendingTask task;
-  task.posted_from =
-      base::Location("my_func", "my_file", 0, /*program_counter=*/&task);
-  { TRACE_TASK_EXECUTION("ThreadControllerImpl::RunTask1", task); }
-  { TRACE_TASK_EXECUTION("ThreadControllerImpl::RunTask1", task); }
+  INTERNAL_TRACE_EVENT_ADD(
+      TRACE_EVENT_PHASE_INSTANT, "toplevel", "ThreadControllerImpl::RunTask",
+      TRACE_EVENT_SCOPE_THREAD | TRACE_EVENT_FLAG_TYPED_PROTO_ARGS, "src_file",
+      "my_file", "src_func", "my_func");
+  INTERNAL_TRACE_EVENT_ADD(
+      TRACE_EVENT_PHASE_INSTANT, "toplevel", "ThreadControllerImpl::RunTask",
+      TRACE_EVENT_SCOPE_THREAD | TRACE_EVENT_FLAG_TYPED_PROTO_ARGS, "src_file",
+      "my_file", "src_func", "my_func");
 
   size_t packet_index = ExpectStandardPreamble();
 
   auto* e_packet = producer_client()->GetFinalizedPacket(packet_index++);
   ExpectTraceEvent(e_packet, /*category_iid=*/1u, /*name_iid=*/1u,
-                   TRACE_EVENT_PHASE_BEGIN);
+                   TRACE_EVENT_PHASE_INSTANT, TRACE_EVENT_SCOPE_THREAD);
 
   const auto& annotations = e_packet->track_event().debug_annotations();
   EXPECT_EQ(annotations.size(), 0);
@@ -1041,9 +1043,9 @@
   EXPECT_EQ(locations[0].function_name(), "my_func");
 
   // Second event should refer to the same interning entries.
-  auto* e_packet2 = producer_client()->GetFinalizedPacket(++packet_index);
+  auto* e_packet2 = producer_client()->GetFinalizedPacket(packet_index++);
   ExpectTraceEvent(e_packet2, /*category_iid=*/1u, /*name_iid=*/1u,
-                   TRACE_EVENT_PHASE_BEGIN);
+                   TRACE_EVENT_PHASE_INSTANT, TRACE_EVENT_SCOPE_THREAD);
 
   EXPECT_EQ(e_packet2->track_event().task_execution().posted_from_iid(), 1u);
   EXPECT_EQ(e_packet2->interned_data().source_locations().size(), 0);
@@ -1052,16 +1054,16 @@
 TEST_F(TraceEventDataSourceTest, TaskExecutionEventWithoutFunction) {
   CreateTraceEventDataSource();
 
-  base::PendingTask task;
-  task.posted_from = base::Location(/*function_name=*/nullptr, "my_file", 0,
-                                    /*program_counter=*/&task);
-  { TRACE_TASK_EXECUTION("ThreadControllerImpl::RunTask", task); }
+  INTERNAL_TRACE_EVENT_ADD(
+      TRACE_EVENT_PHASE_INSTANT, "toplevel", "ThreadControllerImpl::RunTask",
+      TRACE_EVENT_SCOPE_THREAD | TRACE_EVENT_FLAG_TYPED_PROTO_ARGS, "src",
+      "my_file");
 
   size_t packet_index = ExpectStandardPreamble();
 
   auto* e_packet = producer_client()->GetFinalizedPacket(packet_index++);
   ExpectTraceEvent(e_packet, /*category_iid=*/1u, /*name_iid=*/1u,
-                   TRACE_EVENT_PHASE_BEGIN, TRACE_EVENT_SCOPE_THREAD);
+                   TRACE_EVENT_PHASE_INSTANT, TRACE_EVENT_SCOPE_THREAD);
 
   const auto& annotations = e_packet->track_event().debug_annotations();
   EXPECT_EQ(annotations.size(), 0);
diff --git a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
index 75d5d52..38ee903 100644
--- a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
+++ b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
@@ -67,6 +67,12 @@
 constexpr uint64_t kThreadInstructionCountTrackUuidBit =
     static_cast<uint64_t>(1u) << 34;
 
+// Names of events that should be converted into a TaskExecution event.
+const char* kTaskExecutionEventCategory = "toplevel";
+const char* kTaskExecutionEventNames[3] = {"ThreadControllerImpl::RunTask",
+                                           "ThreadPool_RunTask",
+                                           "SimpleAlarmTimer::OnTimerFired"};
+
 void AddConvertableToTraceFormat(
     base::trace_event::ConvertableToTraceFormat* value,
     perfetto::protos::pbzero::DebugAnnotation* annotation) {
@@ -468,6 +474,13 @@
   const size_t kMaxSize = base::trace_event::TraceArguments::kMaxSize;
   InterningIndexEntry interned_annotation_names[kMaxSize] = {
       InterningIndexEntry{}};
+  InterningIndexEntry interned_source_location{};
+  InterningIndexEntry interned_log_message_body{};
+
+  const char* src_file = nullptr;
+  const char* src_func = nullptr;
+  const char* log_message_body = nullptr;
+  int line_number = 0;
 
   // No need to write the event name for end events (sync or nestable async).
   // Trace processor will match them without, provided event nesting is correct.
@@ -497,8 +510,49 @@
       }
     }
   } else {
+    // TODO(eseckler): Remove special handling of typed events here once we
+    // support them in TRACE_EVENT macros.
+
     if (flags & TRACE_EVENT_FLAG_TYPED_PROTO_ARGS) {
-      NOTREACHED();
+      if (trace_event->arg_size() == 2u) {
+        DCHECK_EQ(strcmp(category_name, kTaskExecutionEventCategory), 0);
+        DCHECK(strcmp(trace_event->name(), kTaskExecutionEventNames[0]) == 0 ||
+               strcmp(trace_event->name(), kTaskExecutionEventNames[1]) == 0 ||
+               strcmp(trace_event->name(), kTaskExecutionEventNames[2]) == 0);
+        // Double argument task execution event (src_file, src_func).
+        DCHECK_EQ(trace_event->arg_type(0), TRACE_VALUE_TYPE_STRING);
+        DCHECK_EQ(trace_event->arg_type(1), TRACE_VALUE_TYPE_STRING);
+        src_file = trace_event->arg_value(0).as_string;
+        src_func = trace_event->arg_value(1).as_string;
+      } else {
+        // arg_size == 1 enforced by the maximum number of parameter == 2.
+        DCHECK_EQ(trace_event->arg_size(), 1u);
+
+        if (trace_event->arg_type(0) == TRACE_VALUE_TYPE_STRING) {
+          // Single argument task execution event (src_file).
+          DCHECK_EQ(strcmp(category_name, kTaskExecutionEventCategory), 0);
+          DCHECK(
+              strcmp(trace_event->name(), kTaskExecutionEventNames[0]) == 0 ||
+              strcmp(trace_event->name(), kTaskExecutionEventNames[1]) == 0 ||
+              strcmp(trace_event->name(), kTaskExecutionEventNames[2]) == 0);
+          src_file = trace_event->arg_value(0).as_string;
+        } else {
+          DCHECK_EQ(trace_event->arg_type(0), TRACE_VALUE_TYPE_CONVERTABLE);
+          DCHECK(strcmp(category_name, "log") == 0);
+          DCHECK(strcmp(trace_event->name(), "LogMessage") == 0);
+          const base::trace_event::LogMessage* value =
+              static_cast<base::trace_event::LogMessage*>(
+                  trace_event->arg_value(0).as_convertable);
+          src_file = value->file();
+          line_number = value->line_number();
+          log_message_body = value->message().c_str();
+
+          interned_log_message_body =
+              interned_log_message_bodies_.LookupOrAdd(value->message());
+        }  // else
+      }    // else
+      interned_source_location = interned_source_locations_.LookupOrAdd(
+          std::make_tuple(src_file, src_func, line_number));
     } else if (!privacy_filtering_enabled_) {
       for (size_t i = 0;
            i < trace_event->arg_size() && trace_event->arg_name(i); ++i) {
@@ -572,7 +626,14 @@
     track_event->add_category_iids(interned_category.id);
   }
 
-  if (!privacy_filtering_enabled_) {
+  if (interned_log_message_body.id) {
+    auto* log_message = track_event->set_log_message();
+    log_message->set_source_location_iid(interned_source_location.id);
+    log_message->set_body_iid(interned_log_message_body.id);
+  } else if (interned_source_location.id) {
+    track_event->set_task_execution()->set_posted_from_iid(
+        interned_source_location.id);
+  } else if (!privacy_filtering_enabled_) {
     WriteDebugAnnotations(trace_event, track_event, interned_annotation_names);
   }
 
@@ -735,7 +796,19 @@
         std::make_tuple(IndexType::kName, IndexData{trace_event_name},
                         std::move(interned_name)));
   }
-  if (!privacy_filtering_enabled_) {
+  if (interned_log_message_body.id && !interned_log_message_body.was_emitted) {
+    pending_interning_updates_.push_back(
+        std::make_tuple(IndexType::kLogMessage, IndexData{log_message_body},
+                        std::move(interned_log_message_body)));
+  }
+  if (interned_source_location.id) {
+    if (!interned_source_location.was_emitted) {
+      pending_interning_updates_.push_back(std::make_tuple(
+          IndexType::kSourceLocation,
+          IndexData{std::make_tuple(src_file, src_func, line_number)},
+          std::move(interned_source_location)));
+    }
+  } else if (!privacy_filtering_enabled_) {
     for (size_t i = 0; i < trace_event->arg_size() && trace_event->arg_name(i);
          ++i) {
       DCHECK(interned_annotation_names[i].id);
diff --git a/testing/buildbot/filters/lacros.browser_tests.filter b/testing/buildbot/filters/lacros.browser_tests.filter
index df10860..750dcf3 100644
--- a/testing/buildbot/filters/lacros.browser_tests.filter
+++ b/testing/buildbot/filters/lacros.browser_tests.filter
@@ -5,15 +5,8 @@
 -AdsPageLoadMetricsObserverBrowserTest.PageAdDensityIgnoreDisplayNoneFrame

 -AdsPageLoadMetricsObserverBrowserTest.PageAdDensityMultipleFrames

 -AdsPageLoadMetricsObserverBrowserTest.PageAdDensityRecordsPageMax

--All/CustomTabBarViewBrowserTest.BackToAppButtonIsNotVisibleInOutOfScopePopups/BookmarkApps

--All/CustomTabBarViewBrowserTest.BackToAppButtonIsNotVisibleInOutOfScopePopups/WebApps

--All/CustomTabBarViewBrowserTest.IsNotCreatedInPopup/BookmarkApps

--All/CustomTabBarViewBrowserTest.IsNotCreatedInPopup/WebApps

--All/CustomTabBarViewBrowserTest.RightClickMenuShowsCopyUrl/BookmarkApps

--All/CustomTabBarViewBrowserTest.RightClickMenuShowsCopyUrl/WebApps

 -All/DownloadReferrerPolicyTest.SaveLinkAsReferrerPolicy*

 -All/HostedAppProcessModelTest.BackgroundPageWithAppCoveringDifferentSites/0

--All/HostedOrWebAppTest.CtrlClickLink/BookmarkApp

 -All/HostedOrWebAppTest.CtrlClickLink/HostedApp

 -All/HostedOrWebAppTest.CtrlClickLink/WebApp

 -All/HostedOrWebAppTest.OpenLinkInNewTab*

@@ -23,13 +16,8 @@
 -All/PopupBrowserTest.MoveClampedToCurrentDisplay*

 -All/SystemWebAppLinkCaptureBrowserTest.IncognitoBrowserOmniboxLinkCapture*

 -All/SystemWebAppLinkCaptureBrowserTest.WindowOpenFromOtherSWA*

--All/WebAppBrowserTest.CopyURL/BookmarkApps

--All/WebAppBrowserTest.CopyURL/WebApps

 -All/WebAppBrowserTest.InScopePWAPopupsHaveCorrectSize*

 -All/WebAppBrowserTest.OffScopePWAPopupsHaveCorrectSize*

--All/WebAppEngagementBrowserTest.CommandLineWindow/WebApps

--All/WebAppFileHandlingOriginTrialBrowserTest.ExpiredTrialHandlersAreCleanedUpAtLaunch/BookmarkApps

--All/WebAppProfileDeletionBrowserTest.AppRegistrarNotifiesProfileDeletion/BookmarkApps

 -AppViewTest.KillGuestCommunicatingWithWrongAppView

 -AppViewTest.KillGuestWithInvalidInstanceID

 -AudioFocusWebContentsObserverBrowserTest.PlatformAppHasDifferentAudioFocus

@@ -80,6 +68,9 @@
 -CrSettingsSiteDetailsV3Test.SiteDetails

 -CrSettingsSiteListEntryV3Test.All

 -CrSettingsSyncAccountControlV3Test.All

+-CustomTabBarViewBrowserTest.BackToAppButtonIsNotVisibleInOutOfScopePopups

+-CustomTabBarViewBrowserTest.IsNotCreatedInPopup

+-CustomTabBarViewBrowserTest.RightClickMenuShowsCopyUrl

 -DeclarativeContentApiTest.RulesPersistence

 -DeepScanningDialogDelegateBlockLargeFileTransferBrowserTest.Test/3

 -DesktopCaptureApiTest.ChooseDesktopMedia

@@ -205,6 +196,8 @@
 -TranslateLanguageBrowserTest.TranslateAndRevert

 -TranslateLanguageBrowserTestWithTranslateRecentTarget.RecentTargetLanguage

 -TranslateManagerBrowserTest.PageTranslationTimeoutError

+-WebAppBrowserTest.CopyURL

+-WebAppEngagementBrowserTest.CommandLineWindow

 -WebAppLinkCapturingBrowserTest.AboutBlankNavigationReparented

 -WebRtcDesktopCaptureBrowserTest.RunsScreenshareFromOneTabToAnother

 -WebRtcGetDisplayMediaBrowserTestWithPicker.GetDisplayMediaVideo

diff --git a/third_party/blink/common/web_preferences/web_preferences.cc b/third_party/blink/common/web_preferences/web_preferences.cc
index 477623c..b433e67 100644
--- a/third_party/blink/common/web_preferences/web_preferences.cc
+++ b/third_party/blink/common/web_preferences/web_preferences.cc
@@ -144,7 +144,8 @@
       record_whole_document(false),
       cookie_enabled(true),
       accelerated_video_decode_enabled(false),
-      animation_policy(kImageAnimationPolicyAllowed),
+      animation_policy(
+          blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed),
       user_gesture_required_for_presentation(true),
       text_tracks_enabled(false),
       text_track_margin_percentage(0.0f),
diff --git a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
index e01bbea..41103b52 100644
--- a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
+++ b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
@@ -77,50 +77,6 @@
 }
 
 // static
-blink::mojom::ImageAnimationPolicy
-EnumTraits<blink::mojom::ImageAnimationPolicy,
-           blink::web_pref::ImageAnimationPolicy>::
-    ToMojom(blink::web_pref::ImageAnimationPolicy policy) {
-  switch (policy) {
-    case blink::web_pref::ImageAnimationPolicy::kImageAnimationPolicyAllowed:
-      return blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
-    case blink::web_pref::ImageAnimationPolicy::
-        kImageAnimationPolicyAnimateOnce:
-      return blink::mojom::ImageAnimationPolicy::
-          kImageAnimationPolicyAnimateOnce;
-    case blink::web_pref::ImageAnimationPolicy::
-        kImageAnimationPolicyNoAnimation:
-      return blink::mojom::ImageAnimationPolicy::
-          kImageAnimationPolicyNoAnimation;
-  }
-  NOTREACHED();
-  return blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation;
-}
-
-// static
-bool EnumTraits<blink::mojom::ImageAnimationPolicy,
-                blink::web_pref::ImageAnimationPolicy>::
-    FromMojom(blink::mojom::ImageAnimationPolicy input,
-              blink::web_pref::ImageAnimationPolicy* out) {
-  switch (input) {
-    case blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed:
-      *out =
-          blink::web_pref::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
-      return true;
-    case blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce:
-      *out = blink::web_pref::ImageAnimationPolicy::
-          kImageAnimationPolicyAnimateOnce;
-      return true;
-    case blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation:
-      *out = blink::web_pref::ImageAnimationPolicy::
-          kImageAnimationPolicyNoAnimation;
-      return true;
-  }
-  NOTREACHED();
-  return false;
-}
-
-// static
 blink::mojom::ViewportStyle
 EnumTraits<blink::mojom::ViewportStyle, blink::web_pref::ViewportStyle>::
     ToMojom(blink::web_pref::ViewportStyle style) {
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index 6e58fb3f..d8538dd 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -190,7 +190,6 @@
     "web_package/signed_exchange_consts.h",
     "web_package/web_package_request_matcher.h",
     "web_preferences/autoplay_policy.h",
-    "web_preferences/image_animation_policy.h",
     "web_preferences/viewport_style.h",
     "web_preferences/web_preferences.h",
     "widget/device_emulation_params.h",
diff --git a/third_party/blink/public/common/web_preferences/image_animation_policy.h b/third_party/blink/public/common/web_preferences/image_animation_policy.h
deleted file mode 100644
index e181fff6..0000000
--- a/third_party/blink/public/common/web_preferences/image_animation_policy.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_WEB_PREFERENCES_IMAGE_ANIMATION_POLICY_H_
-#define THIRD_PARTY_BLINK_PUBLIC_COMMON_WEB_PREFERENCES_IMAGE_ANIMATION_POLICY_H_
-
-namespace blink {
-namespace web_pref {
-
-// ImageAnimationPolicy is used for controlling image animation
-// when image frame is rendered for animation
-enum ImageAnimationPolicy {
-  // Animate the image (the default).
-  kImageAnimationPolicyAllowed,
-  // Animate image just once.
-  kImageAnimationPolicyAnimateOnce,
-  // Show the first frame and do not animate.
-  kImageAnimationPolicyNoAnimation
-};
-
-}  // namespace web_pref
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_WEB_PREFERENCES_IMAGE_ANIMATION_POLICY_H_
diff --git a/third_party/blink/public/common/web_preferences/web_preferences.h b/third_party/blink/public/common/web_preferences/web_preferences.h
index 4c59d24..85ad421 100644
--- a/third_party/blink/public/common/web_preferences/web_preferences.h
+++ b/third_party/blink/public/common/web_preferences/web_preferences.h
@@ -15,11 +15,10 @@
 #include "net/nqe/effective_connection_type.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/web_preferences/autoplay_policy.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
 #include "third_party/blink/public/common/web_preferences/viewport_style.h"
 #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-shared.h"
 #include "third_party/blink/public/mojom/v8_cache_options.mojom-forward.h"
-#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-forward.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-shared.h"
 #include "ui/base/pointer/pointer_device.h"
 #include "url/gurl.h"
 
@@ -168,7 +167,8 @@
   // Defaults to false.
   bool accelerated_video_decode_enabled;
 
-  ImageAnimationPolicy animation_policy;
+  blink::mojom::ImageAnimationPolicy animation_policy =
+      blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
 
   bool user_gesture_required_for_presentation;
 
diff --git a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
index 05ebe11..aff1ec1 100644
--- a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
+++ b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
@@ -10,7 +10,6 @@
 #include "net/nqe/effective_connection_type.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/web_preferences/autoplay_policy.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom.h"
 #include "ui/base/pointer/pointer_device.h"
@@ -33,16 +32,6 @@
 };
 
 template <>
-struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::ImageAnimationPolicy,
-                                      blink::web_pref::ImageAnimationPolicy> {
-  static blink::mojom::ImageAnimationPolicy ToMojom(
-      blink::web_pref::ImageAnimationPolicy policy);
-
-  static bool FromMojom(blink::mojom::ImageAnimationPolicy input,
-                        blink::web_pref::ImageAnimationPolicy* out);
-};
-
-template <>
 struct BLINK_COMMON_EXPORT
     EnumTraits<blink::mojom::ViewportStyle, blink::web_pref::ViewportStyle> {
   static blink::mojom::ViewportStyle ToMojom(
@@ -493,7 +482,7 @@
     return r.accelerated_video_decode_enabled;
   }
 
-  static blink::web_pref::ImageAnimationPolicy animation_policy(
+  static blink::mojom::ImageAnimationPolicy animation_policy(
       const blink::web_pref::WebPreferences& r) {
     return r.animation_policy;
   }
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 7cbeab18..6a0296f 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2743,15 +2743,15 @@
   kUnspecifiedTargetOriginPostMessage = 3414,
   kSchemelesslySameSitePostMessageSecureToInsecure = 3415,
   kSchemelesslySameSitePostMessageInsecureToSecure = 3416,
-  kBCPBroadcast = 3417,
-  kBCPRead = 3418,
-  kBCPWriteWithoutResponse = 3419,
-  kBCPWrite = 3420,
-  kBCPNotify = 3421,
-  kBCPIndicate = 3422,
-  kBCPAuthenticatedSignedWrites = 3423,
-  kBCPReliableWrite = 3424,
-  kBCPWritableAuxiliaries = 3425,
+  kOBSOLETE_BCPBroadcast = 3417,
+  kOBSOLETE_BCPRead = 3418,
+  kOBSOLETE_BCPWriteWithoutResponse = 3419,
+  kOBSOLETE_BCPWrite = 3420,
+  kOBSOLETE_BCPNotify = 3421,
+  kOBSOLETE_BCPIndicate = 3422,
+  kOBSOLETE_BCPAuthenticatedSignedWrites = 3423,
+  kOBSOLETE_BCPReliableWrite = 3424,
+  kOBSOLETE_BCPWritableAuxiliaries = 3425,
   kTextAlignSpecifiedToLegend = 3426,
   kV8Document_FragmentDirective_AttributeGetter = 3427,
   kV8StorageManager_GetDirectory_Method = 3428,
diff --git a/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb b/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
index 7fba41b..ae4496015 100644
--- a/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
@@ -29,6 +29,7 @@
 <translation id="1806710327868736751">alert_dialogue</translation>
 <translation id="1821985195704844674">tree grid</translation>
 <translation id="1822429046913737220">AM/PM</translation>
+<translation id="1823704031293214298">page footer</translation>
 <translation id="1832974991323546415">play on remote device</translation>
 <translation id="190587075670221089">deletion</translation>
 <translation id="1907737156431278478">example</translation>
@@ -103,6 +104,7 @@
 <translation id="4201051445878709314">Show previous month</translation>
 <translation id="421884353938374759">colour picker</translation>
 <translation id="4248100235867064564">menu bar</translation>
+<translation id="4293574643247337246">page header</translation>
 <translation id="4360991593054037559">Please enter a valid value. The two nearest valid values are <ph name="VALID_VALUE_LOW" /> and <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4444765639179266822">Appears to say: <ph name="OCR_TEXT" /></translation>
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h
index a444271..e80a1b7 100644
--- a/third_party/blink/public/web/web_settings.h
+++ b/third_party/blink/public/web/web_settings.h
@@ -152,7 +152,7 @@
   virtual void SetHighlightAds(bool) = 0;
   virtual void SetHyperlinkAuditingEnabled(bool) = 0;
   virtual void SetIgnoreMainFrameOverflowHiddenQuirk(bool) = 0;
-  virtual void SetImageAnimationPolicy(web_pref::ImageAnimationPolicy) = 0;
+  virtual void SetImageAnimationPolicy(mojom::ImageAnimationPolicy) = 0;
   virtual void SetImagesEnabled(bool) = 0;
   virtual void SetInlineTextBoxAccessibilityEnabled(bool) = 0;
   virtual void SetJavaScriptCanAccessClipboard(bool) = 0;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index 8e096f7c..2e4d273 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/css/parser/css_parser_fast_paths.h"
 
 #include "build/build_config.h"
+#include "third_party/blink/public/public_buildflags.h"
 #include "third_party/blink/renderer/core/css/css_color_value.h"
 #include "third_party/blink/renderer/core/css/css_function_value.h"
 #include "third_party/blink/renderer/core/css/css_identifier_value.h"
@@ -899,7 +900,7 @@
       return value_id == CSSValueID::kNowrap || value_id == CSSValueID::kWrap ||
              value_id == CSSValueID::kWrapReverse;
     case CSSPropertyID::kHyphens:
-#if defined(OS_ANDROID) || defined(OS_MAC)
+#if BUILDFLAG(USE_MINIKIN_HYPHENATION) || defined(OS_MAC)
       return value_id == CSSValueID::kAuto || value_id == CSSValueID::kNone ||
              value_id == CSSValueID::kManual;
 #else
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
index d440389..34237b59 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -142,6 +142,7 @@
 }  // namespace
 
 MatchResult& StyleCascade::MutableMatchResult() {
+  DCHECK(!generation_) << "Apply has already been called";
   needs_match_result_analyze_ = true;
   return match_result_;
 }
@@ -519,7 +520,8 @@
   DCHECK(priority.GetOrigin() < CascadeOrigin::kAnimation);
   const CSSValue* value = ValueAt(match_result_, priority.GetPosition());
   DCHECK(value);
-  value = Resolve(property, *value, priority.GetOrigin(), resolver);
+  CascadeOrigin origin = priority.GetOrigin();
+  value = Resolve(property, *value, origin, resolver);
   DCHECK(!value->IsVariableReferenceValue());
   DCHECK(!value->IsPendingSubstitutionValue());
   StyleBuilder::ApplyProperty(property, state_, *value);
@@ -684,7 +686,7 @@
 
 const CSSValue* StyleCascade::Resolve(const CSSProperty& property,
                                       const CSSValue& value,
-                                      CascadeOrigin origin,
+                                      CascadeOrigin& origin,
                                       CascadeResolver& resolver) {
   DCHECK(!property.IsSurrogate());
   if (IsRevert(value))
@@ -832,7 +834,7 @@
 
 const CSSValue* StyleCascade::ResolveRevert(const CSSProperty& property,
                                             const CSSValue& value,
-                                            CascadeOrigin origin,
+                                            CascadeOrigin& origin,
                                             CascadeResolver& resolver) {
   MaybeUseCountRevert(value);
 
@@ -848,10 +850,13 @@
     case CascadeOrigin::kAnimation: {
       CascadePriority* p =
           map_.Find(property.GetCSSPropertyName(), target_origin);
-      if (!p)
+      if (!p) {
+        origin = CascadeOrigin::kNone;
         return cssvalue::CSSUnsetValue::Create();
+      }
+      origin = p->GetOrigin();
       return Resolve(property, *ValueAt(match_result_, p->GetPosition()),
-                     target_origin, resolver);
+                     origin, resolver);
     }
   }
 }
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.h b/third_party/blink/renderer/core/css/resolver/style_cascade.h
index 78b5587..be7eec5 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.h
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.h
@@ -71,8 +71,10 @@
   const MatchResult& GetMatchResult() { return match_result_; }
 
   // Access the MatchResult in order to add declarations to it.
-  // The modifications made will be taken into account during the next call to
-  // Apply.
+  // The modifications made will be taken into account during Apply().
+  //
+  // It is invalid to modify the MatchResult after Apply has been called
+  // (unless Reset is called first).
   //
   // TODO(andruud): ElementRuleCollector could emit MatchedProperties
   // directly to the cascade.
@@ -81,6 +83,9 @@
   // Add ActiveInterpolationsMap to the cascade. The interpolations present
   // in the map will be taken into account during the next call to Apply.
   //
+  // It is valid to add interpolations to the StyleCascade even after Apply
+  // has been called.
+  //
   // Note that it's assumed that the incoming ActiveInterpolationsMap outlives
   // the StyleCascade object.
   void AddInterpolations(const ActiveInterpolationsMap*, CascadeOrigin);
@@ -283,7 +288,7 @@
 
   const CSSValue* Resolve(const CSSProperty&,
                           const CSSValue&,
-                          CascadeOrigin,
+                          CascadeOrigin&,
                           CascadeResolver&);
   const CSSValue* ResolveCustomProperty(const CSSProperty&,
                                         const CSSCustomPropertyDeclaration&,
@@ -296,7 +301,7 @@
                                              CascadeResolver&);
   const CSSValue* ResolveRevert(const CSSProperty&,
                                 const CSSValue&,
-                                CascadeOrigin,
+                                CascadeOrigin&,
                                 CascadeResolver&);
 
   scoped_refptr<CSSVariableData> ResolveVariableData(CSSVariableData*,
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
index 613de5d..4eccc4d 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/core/css/css_initial_color_value.h"
 #include "third_party/blink/renderer/core/css/css_pending_substitution_value.h"
 #include "third_party/blink/renderer/core/css/css_primitive_value.h"
+#include "third_party/blink/renderer/core/css/css_revert_value.h"
 #include "third_party/blink/renderer/core/css/css_test_helpers.h"
 #include "third_party/blink/renderer/core/css/css_variable_reference_value.h"
 #include "third_party/blink/renderer/core/css/document_style_environment_variables.h"
@@ -135,6 +136,15 @@
     cascade_.LookupAndApply(property, resolver.InnerResolver());
   }
 
+  void AnalyzeIfNeeded() { cascade_.AnalyzeIfNeeded(); }
+
+  const CSSValue* Resolve(const CSSProperty& property,
+                          const CSSValue& value,
+                          CascadeOrigin& origin) {
+    TestCascadeResolver resolver;
+    return cascade_.Resolve(property, value, origin, resolver.InnerResolver());
+  }
+
   std::unique_ptr<CSSBitset> GetImportantSet() {
     return cascade_.GetImportantSet();
   }
@@ -179,7 +189,10 @@
     AddAnimations();
   }
 
-  void Reset() { cascade_.Reset(); }
+  void Reset() {
+    cascade_.Reset();
+    current_origin_ = CascadeOrigin::kUserAgent;
+  }
 
   bool NeedsMatchResultAnalyze() const {
     return cascade_.needs_match_result_analyze_;
@@ -881,6 +894,7 @@
   EXPECT_EQ("foo", cascade.ComputedValue("--a"));
   EXPECT_EQ("bar", cascade.ComputedValue("--b"));
 
+  cascade.Reset();
   cascade.Add("--a", "var(--b)");
   cascade.Add("--b", "var(--a)");
   cascade.Apply();
@@ -896,6 +910,7 @@
 
   EXPECT_EQ("foo", cascade.ComputedValue("--a"));
 
+  cascade.Reset();
   cascade.Add("--a", "var(--a)");
   cascade.Apply();
 
@@ -1251,6 +1266,7 @@
 
   String expected = cascade.ComputedValue("font-size");
 
+  cascade.Reset();
   cascade.Add("font-size", "var(--x)");
   cascade.Add("--x", "1rem");
   cascade.Apply();
@@ -1273,6 +1289,7 @@
   EXPECT_EQ("foo", cascade.ComputedValue("--x"));
   EXPECT_EQ("foo", cascade.ComputedValue("--y"));
 
+  cascade.Reset();
   cascade.Add("--x", "initial");
   cascade.Add("--y", "initial");
   cascade.Apply();
@@ -1295,6 +1312,7 @@
   cascade.Apply();
   EXPECT_EQ("bar", cascade.ComputedValue("--x"));
 
+  cascade.Reset();
   cascade.Add("--x", "inherit");
   cascade.Apply();
   EXPECT_EQ("foo", cascade.ComputedValue("--x"));
@@ -1313,6 +1331,7 @@
   cascade.Apply();
   EXPECT_EQ("bar", cascade.ComputedValue("--x"));
 
+  cascade.Reset();
   cascade.Add("--x", "unset");
   cascade.Apply();
   EXPECT_EQ("foo", cascade.ComputedValue("--x"));
@@ -1732,8 +1751,14 @@
 
   EXPECT_EQ("50px", cascade.ComputedValue("margin-left"));
 
+  cascade.Reset();
+  cascade.Add("--x:100px", CascadeOrigin::kUser);
+  cascade.Add("margin-left:var(--x)", CascadeOrigin::kUser);
+  cascade.Add("animation:test linear 1000s -500s");
   cascade.Add("--x:80px", CascadeOrigin::kAuthor);
   cascade.Apply();
+  cascade.CalculateAnimationUpdate();
+  cascade.Apply();
 
   EXPECT_EQ("40px", cascade.ComputedValue("margin-left"));
 }
@@ -1874,6 +1899,7 @@
   cascade.Apply();
   EXPECT_EQ("10px", cascade.ComputedValue("--x"));
 
+  cascade.Reset();
   cascade.Add("--x", "initial");
   cascade.Add("--y", "var(--x)");
   cascade.Apply();
@@ -1894,6 +1920,7 @@
   cascade.Apply();
   EXPECT_EQ("0px", cascade.ComputedValue("--x"));  // Note: inherit==false
 
+  cascade.Reset();
   cascade.Add("--x", "inherit");
   cascade.Add("--y", "var(--x)");
   cascade.Apply();
@@ -1920,6 +1947,7 @@
   EXPECT_EQ("2px", cascade.ComputedValue("--x"));
   EXPECT_EQ("2px", cascade.ComputedValue("--y"));
 
+  cascade.Reset();
   cascade.Add("--x", "unset");
   cascade.Add("--y", "unset");
   cascade.Add("--z", "var(--x) var(--y)");
@@ -1956,6 +1984,7 @@
   EXPECT_EQ("20s", cascade.ComputedValue("--x"));
   EXPECT_EQ("20s", cascade.ComputedValue("animation-duration"));
 
+  cascade.Reset();
   cascade.Add(AnimationTaintedSet("--y", "20s"));
   cascade.Add("animation-duration", "var(--y)");
   cascade.Apply();
@@ -2218,14 +2247,14 @@
   cascade.Add("animation-duration", "10s");
   cascade.Add("animation-timing-function", "linear");
   cascade.Add("animation-delay", "-5s");
-  cascade.Apply();
-
-  cascade.CalculateAnimationUpdate();
   cascade.Add("--from", "10px");
   cascade.Add("--to", "20px");
   cascade.Add("--y", "var(--x)");
   cascade.Apply();
 
+  cascade.CalculateAnimationUpdate();
+  cascade.Apply();
+
   EXPECT_EQ("15px", cascade.ComputedValue("--x"));
   EXPECT_EQ("15px", cascade.ComputedValue("--y"));
 }
@@ -2375,13 +2404,13 @@
   cascade.Add("animation-duration", "10s");
   cascade.Add("animation-timing-function", "linear");
   cascade.Add("animation-delay", "-5s");
+  cascade.Add("--x", "2em");
+  cascade.Add("width", "10em");
   cascade.Apply();
 
   cascade.CalculateAnimationUpdate();
-  cascade.Add("--x", "2em");
-  cascade.Add("width", "10em");
-
   cascade.Apply();
+
   EXPECT_EQ("30px", cascade.ComputedValue("--x"));
   EXPECT_EQ("150px", cascade.ComputedValue("width"));
 }
@@ -2402,13 +2431,13 @@
   cascade.Add("animation-duration", "10s");
   cascade.Add("animation-timing-function", "linear");
   cascade.Add("animation-delay", "-5s");
+  cascade.Add("--from", "10px");
+  cascade.Add("--to", "20px");
   cascade.Apply();
 
   cascade.CalculateAnimationUpdate();
-  cascade.Add("--from", "10px");
-  cascade.Add("--to", "20px");
-
   cascade.Apply();
+
   EXPECT_EQ("15px", cascade.ComputedValue("width"));
 }
 
@@ -2522,11 +2551,11 @@
   cascade.Add("animation-duration", "10s");
   cascade.Add("animation-timing-function", "linear");
   cascade.Add("animation-delay", "-5s");
+  cascade.Add("--from", "10px");
+  cascade.Add("--to", "20px");
   cascade.Apply();
 
   cascade.CalculateAnimationUpdate();
-  cascade.Add("--from", "10px");
-  cascade.Add("--to", "20px");
   cascade.Apply();
 
   EXPECT_EQ(CascadeOrigin::kAnimation, cascade.GetOrigin("margin-top"));
@@ -2929,6 +2958,8 @@
   cascade.Add("background-color", "green", Origin::kAuthor);
   cascade.Add("display", "inline", Origin::kAuthor);
   cascade.Apply();
+
+  cascade.Reset();
   cascade.Add("color", "green", Origin::kAuthor);
   cascade.Add("background-color", "red", Origin::kAuthor);
   cascade.Add("display", "block", Origin::kAuthor);
@@ -3093,6 +3124,7 @@
   cascade.Add("font-size:3px");
   cascade.Apply();
 
+  cascade.Reset();
   cascade.Add("display:inline");
   cascade.Add("color:red");
   cascade.Apply(CascadeFilter(CSSProperty::kInherited, true));
@@ -3108,6 +3140,7 @@
   cascade.Add("display:block");
   cascade.Apply();
 
+  cascade.Reset();
   cascade.Add("all:unset");
   cascade.Apply(CascadeFilter(CSSProperty::kInherited, true));
 
@@ -3522,4 +3555,52 @@
       cascade.State().Style()->InternalVisitedBackgroundColor().GetColor());
 }
 
+TEST_F(StyleCascadeTest, RevertOrigin) {
+  TestCascade cascade(GetDocument());
+
+  cascade.Add("width", "1px", CascadeOrigin::kUserAgent);
+  cascade.Add("height", "1px", CascadeOrigin::kUserAgent);
+  cascade.Add("display", "block", CascadeOrigin::kUserAgent);
+  cascade.Add("width", "2px", CascadeOrigin::kUser);
+  cascade.Add("height", "revert", CascadeOrigin::kUser);
+  cascade.Add("width", "revert", CascadeOrigin::kAuthor);
+  cascade.Add("height", "revert", CascadeOrigin::kAuthor);
+  cascade.Add("display", "revert", CascadeOrigin::kAuthor);
+  cascade.Add("margin-left", "revert", CascadeOrigin::kAuthor);
+
+  cascade.AnalyzeIfNeeded();
+
+  CSSValue* revert_value = cssvalue::CSSRevertValue::Create();
+
+  TestCascadeResolver resolver;
+
+  CascadeOrigin origin = CascadeOrigin::kAuthor;
+  const CSSValue* resolved_value =
+      cascade.Resolve(GetCSSPropertyWidth(), *revert_value, origin);
+  ASSERT_TRUE(resolved_value);
+  EXPECT_EQ(CascadeOrigin::kUser, origin);
+  EXPECT_EQ("2px", resolved_value->CssText());
+
+  origin = CascadeOrigin::kAuthor;
+  resolved_value =
+      cascade.Resolve(GetCSSPropertyHeight(), *revert_value, origin);
+  ASSERT_TRUE(resolved_value);
+  EXPECT_EQ(CascadeOrigin::kUserAgent, origin);
+  EXPECT_EQ("1px", resolved_value->CssText());
+
+  origin = CascadeOrigin::kAuthor;
+  resolved_value =
+      cascade.Resolve(GetCSSPropertyDisplay(), *revert_value, origin);
+  ASSERT_TRUE(resolved_value);
+  EXPECT_EQ(CascadeOrigin::kUserAgent, origin);
+  EXPECT_EQ("block", resolved_value->CssText());
+
+  origin = CascadeOrigin::kAuthor;
+  resolved_value =
+      cascade.Resolve(GetCSSPropertyMarginLeft(), *revert_value, origin);
+  ASSERT_TRUE(resolved_value);
+  EXPECT_EQ(CascadeOrigin::kNone, origin);
+  EXPECT_EQ("unset", resolved_value->CssText());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc
index 817d4e7..850d812 100644
--- a/third_party/blink/renderer/core/css/selector_checker.cc
+++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -194,6 +194,13 @@
   if (context.scope->GetTreeScope() == context.element->GetTreeScope())
     return true;
 
+  // The scope-contains-last-matched-element check is only relevant for
+  // ShadowDOM V0 features (::content, ::shadow, /deep/), and the selector
+  // parser does not allow mixing ShadowDOM V0 with nested complex
+  // selectors, hence we can skip the check inside a nested complex selector.
+  if (context.in_nested_complex_selector)
+    return true;
+
   // Because Blink treats a shadow host's TreeScope as a separate one from its
   // descendent shadow roots, if the last matched element is a shadow host, the
   // condition above isn't met, even though it should be.
@@ -1102,6 +1109,7 @@
     case CSSSelector::kPseudoAny: {
       SelectorCheckingContext sub_context(context);
       sub_context.is_sub_selector = true;
+      sub_context.in_nested_complex_selector = true;
       if (!selector.SelectorList())
         break;
       for (sub_context.selector = selector.SelectorList()->First();
diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h
index 31ab65f..4c1d2d9d4 100644
--- a/third_party/blink/renderer/core/css/selector_checker.h
+++ b/third_party/blink/renderer/core/css/selector_checker.h
@@ -126,6 +126,7 @@
     bool has_selection_pseudo = false;
     bool treat_shadow_host_as_normal_scope = false;
     bool is_from_vtt = false;
+    bool in_nested_complex_selector = false;
   };
 
   struct MatchResult {
diff --git a/third_party/blink/renderer/core/editing/BUILD.gn b/third_party/blink/renderer/core/editing/BUILD.gn
index 96ef6b6..dc7cf8c2f 100644
--- a/third_party/blink/renderer/core/editing/BUILD.gn
+++ b/third_party/blink/renderer/core/editing/BUILD.gn
@@ -5,6 +5,8 @@
 import("//third_party/blink/renderer/core/core.gni")
 
 blink_core_sources("editing") {
+  configs += [ "//build/config/compiler:noshadowing" ]
+
   sources = [
     "bidi_adjustment.cc",
     "bidi_adjustment.h",
diff --git a/third_party/blink/renderer/core/editing/commands/apply_style_command.cc b/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
index 782b2a58..6bf2e44 100644
--- a/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
@@ -1043,11 +1043,12 @@
     DCHECK(run_end);
     next = NodeTraversal::NextSkippingChildren(*run_end);
 
-    Node* past_end_node = NodeTraversal::NextSkippingChildren(*run_end);
-    if (!ShouldApplyInlineStyleToRun(style, run_start, past_end_node))
+    Node* past_run_end_node = NodeTraversal::NextSkippingChildren(*run_end);
+    if (!ShouldApplyInlineStyleToRun(style, run_start, past_run_end_node))
       continue;
 
-    runs.push_back(InlineRunToApplyStyle(run_start, run_end, past_end_node));
+    runs.push_back(
+        InlineRunToApplyStyle(run_start, run_end, past_run_end_node));
   }
 
   for (auto& run : runs) {
@@ -1500,13 +1501,13 @@
 
   Node* node = start.AnchorNode();
   while (node) {
-    Node* next = nullptr;
+    Node* next_to_process = nullptr;
     if (EditingIgnoresContent(*node)) {
       DCHECK(node == end.AnchorNode() || !node->contains(end.AnchorNode()))
           << node << " " << end;
-      next = NodeTraversal::NextSkippingChildren(*node);
+      next_to_process = NodeTraversal::NextSkippingChildren(*node);
     } else {
-      next = NodeTraversal::Next(*node);
+      next_to_process = NodeTraversal::Next(*node);
     }
     auto* elem = DynamicTo<HTMLElement>(node);
     if (elem && ElementFullySelected(*elem, start, end)) {
@@ -1555,7 +1556,7 @@
     }
     if (node == end.AnchorNode())
       break;
-    node = next;
+    node = next_to_process;
   }
 
   UpdateStartEnd(EphemeralRange(s, e));
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
index 7c266bc0..7daf0fa3 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
@@ -645,10 +645,10 @@
 
   if (start_node == downstream_end_.AnchorNode()) {
     if (downstream_end_.ComputeEditingOffset() - start_offset > 0) {
-      if (auto* text = DynamicTo<Text>(start_node)) {
+      if (auto* text_node_to_trim = DynamicTo<Text>(start_node)) {
         // in a text node that needs to be trimmed
         DeleteTextFromNode(
-            text, start_offset,
+            text_node_to_trim, start_offset,
             downstream_end_.ComputeOffsetInContainerNode() - start_offset);
       } else {
         RemoveChildrenInRange(start_node, start_offset,
@@ -736,10 +736,12 @@
         // The node itself is fully selected, not just its contents.  Delete it.
         RemoveNode(downstream_end_.AnchorNode(), editing_state);
       } else {
-        if (auto* text = DynamicTo<Text>(downstream_end_.AnchorNode())) {
+        if (auto* text_node_to_trim =
+                DynamicTo<Text>(downstream_end_.AnchorNode())) {
           // in a text node that needs to be trimmed
           if (downstream_end_.ComputeEditingOffset() > 0) {
-            DeleteTextFromNode(text, 0, downstream_end_.ComputeEditingOffset());
+            DeleteTextFromNode(text_node_to_trim, 0,
+                               downstream_end_.ComputeEditingOffset());
           }
           // Remove children of downstream_end_.AnchorNode() that come after
           // upstream_start_. Don't try to remove children if upstream_start_
diff --git a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
index 6ee6f91..2476f73 100644
--- a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
@@ -1754,7 +1754,8 @@
     bool collapse_white_space =
         !end_node->GetLayoutObject() ||
         end_node->GetLayoutObject()->Style()->CollapseWhiteSpace();
-    if (auto* end_text_node = DynamicTo<Text>(end_node)) {
+    end_text_node = DynamicTo<Text>(end_node);
+    if (end_text_node) {
       InsertTextIntoNode(end_text_node, end_offset,
                          collapse_white_space ? NonBreakingSpaceString() : " ");
       if (end_of_inserted_content_.ComputeContainerNode() == end_node)
diff --git a/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc b/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc
index a0b213e..d67d471 100644
--- a/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/simplify_markup_command.cc
@@ -88,10 +88,11 @@
         top_node_with_starting_style = current_node;
     }
     if (top_node_with_starting_style) {
-      for (Node& node : NodeTraversal::InclusiveAncestorsOf(*starting_node)) {
-        if (node == top_node_with_starting_style)
+      for (Node& ancestor_node :
+           NodeTraversal::InclusiveAncestorsOf(*starting_node)) {
+        if (ancestor_node == top_node_with_starting_style)
           break;
-        nodes_to_remove.push_back(static_cast<ContainerNode*>(&node));
+        nodes_to_remove.push_back(static_cast<ContainerNode*>(&ancestor_node));
       }
     }
   }
diff --git a/third_party/blink/renderer/core/editing/commands/smart_replace_icu.cc b/third_party/blink/renderer/core/editing/commands/smart_replace_icu.cc
index 5d836a94..0443ce6 100644
--- a/third_party/blink/renderer/core/editing/commands/smart_replace_icu.cc
+++ b/third_party/blink/renderer/core/editing/commands/smart_replace_icu.cc
@@ -94,7 +94,7 @@
       // Punctuation (kCFCharacterSetPunctuation)
       static const UChar* kPunctuationClass =
           reinterpret_cast<const UChar*>(u"[:P:]");
-      UErrorCode ec = U_ZERO_ERROR;
+      ec = U_ZERO_ERROR;
       USet* icu_punct = uset_openPattern(
           kPunctuationClass, LengthOfNullTerminatedString(kPunctuationClass),
           &ec);
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
index afc7b875..7a077d0 100644
--- a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
+++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
@@ -936,7 +936,7 @@
     // to the new position.
     EventQueueScope scope;
     if (HasComposition()) {
-      RevealSelectionScope reveal_selection_scope(GetFrame());
+      RevealSelectionScope inner_reveal_selection_scope(GetFrame());
       // Do not attempt to apply IME selection offsets if ReplaceComposition()
       // fails (we compute the new range assuming the replacement will succeed).
       if (!ReplaceComposition(g_empty_string))
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index 53c4c84..e567784 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -572,8 +572,8 @@
     if (!text_node)
       continue;
 
-    MarkerLists* const markers = markers_.at(text_node);
-    if (!markers)
+    MarkerLists* const marker_lists = markers_.at(text_node);
+    if (!marker_lists)
       continue;
 
     const unsigned start_range_offset = node == start_node ? start_offset : 0;
@@ -589,14 +589,14 @@
       continue;
 
     for (DocumentMarker::MarkerType type : types) {
-      const DocumentMarkerList* const list = ListForType(markers, type);
+      const DocumentMarkerList* const list = ListForType(marker_lists, type);
       if (!list)
         continue;
 
-      const DocumentMarkerVector& markers =
+      const DocumentMarkerVector& marker_vector =
           list->MarkersIntersectingRange(start_range_offset, end_range_offset);
 
-      for (DocumentMarker* marker : markers)
+      for (DocumentMarker* marker : marker_vector)
         node_marker_pairs.push_back(std::make_pair(&To<Text>(node), marker));
     }
   }
diff --git a/third_party/blink/renderer/core/editing/serializers/serialization.cc b/third_party/blink/renderer/core/editing/serializers/serialization.cc
index b263dd8..b82c831 100644
--- a/third_party/blink/renderer/core/editing/serializers/serialization.cc
+++ b/third_party/blink/renderer/core/editing/serializers/serialization.cc
@@ -700,10 +700,10 @@
     next_node = node->nextSibling();
     if (IsA<HTMLHtmlElement>(node) || IsA<HTMLHeadElement>(node) ||
         IsA<HTMLBodyElement>(node)) {
-      auto* element = To<HTMLElement>(node);
-      if (Node* first_child = element->firstChild())
+      auto* child_element = To<HTMLElement>(node);
+      if (Node* first_child = child_element->firstChild())
         next_node = first_child;
-      RemoveElementPreservingChildren(fragment, element);
+      RemoveElementPreservingChildren(fragment, child_element);
     }
   }
   return fragment;
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc
index 28c02c4..abb9aaf 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -235,7 +235,7 @@
 }
 
 void WebSettingsImpl::SetImageAnimationPolicy(
-    web_pref::ImageAnimationPolicy policy) {
+    mojom::blink::ImageAnimationPolicy policy) {
   settings_->SetImageAnimationPolicy(policy);
 }
 
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h
index 0e2626fd..e7f1017 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.h
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -101,7 +101,7 @@
   void SetHighlightAds(bool) override;
   void SetHyperlinkAuditingEnabled(bool) override;
   void SetIgnoreMainFrameOverflowHiddenQuirk(bool) override;
-  void SetImageAnimationPolicy(web_pref::ImageAnimationPolicy) override;
+  void SetImageAnimationPolicy(mojom::blink::ImageAnimationPolicy) override;
   void SetImagesEnabled(bool) override;
   void SetInlineTextBoxAccessibilityEnabled(bool) override;
   void SetJavaScriptCanAccessClipboard(bool) override;
diff --git a/third_party/blink/renderer/core/fetch/BUILD.gn b/third_party/blink/renderer/core/fetch/BUILD.gn
index bd02a17..0dcbaad 100644
--- a/third_party/blink/renderer/core/fetch/BUILD.gn
+++ b/third_party/blink/renderer/core/fetch/BUILD.gn
@@ -5,6 +5,8 @@
 import("//third_party/blink/renderer/core/core.gni")
 
 blink_core_sources("fetch") {
+  configs += [ "//build/config/compiler:noshadowing" ]
+
   sources = [
     "blob_bytes_consumer.cc",
     "blob_bytes_consumer.h",
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 b9d1fcb..2bcb7b3 100644
--- a/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
@@ -169,12 +169,12 @@
           NOTREACHED();
           return;
         case BytesConsumer::Result::kDone: {
-          DOMArrayBuffer* result = BuildArrayBuffer();
-          if (!result) {
+          DOMArrayBuffer* array_buffer = BuildArrayBuffer();
+          if (!array_buffer) {
             client_->DidFetchDataLoadFailed();
             return;
           }
-          client_->DidFetchDataLoadedArrayBuffer(result);
+          client_->DidFetchDataLoadedArrayBuffer(array_buffer);
           return;
         }
         case BytesConsumer::Result::kError:
diff --git a/third_party/blink/renderer/core/frame/settings.h b/third_party/blink/renderer/core/frame/settings.h
index 212f560..d06fc95 100644
--- a/third_party/blink/renderer/core/frame/settings.h
+++ b/third_party/blink/renderer/core/frame/settings.h
@@ -32,7 +32,6 @@
 
 #include "base/macros.h"
 #include "third_party/blink/public/common/css/navigation_controls.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
 #include "third_party/blink/public/common/web_preferences/viewport_style.h"
 #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5
index c31e607..0daba37 100644
--- a/third_party/blink/renderer/core/frame/settings.json5
+++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -501,8 +501,8 @@
     },
     {
       name: "imageAnimationPolicy",
-      initial: "web_pref::kImageAnimationPolicyAllowed",
-      type: "web_pref::ImageAnimationPolicy",
+      initial: "mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed",
+      type: "mojom::blink::ImageAnimationPolicy",
     },
 
     // Html preload scanning is a fast, early scan of HTML documents to find loadable
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css
index f0e5954..2ba00720 100644
--- a/third_party/blink/renderer/core/html/resources/html.css
+++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -396,7 +396,7 @@
 }
 
 button {
-    -webkit-appearance: button; /* AutoAppearanceFor() should match to this. */
+    appearance: auto;
 }
 
 /* Form controls don't go vertical. */
@@ -601,7 +601,7 @@
 
 input[type="button" i], input[type="submit" i], input[type="reset" i] {
     -internal-empty-line-height: fabricated;
-    -webkit-appearance: push-button; /* AutoAppearanceFor() should match to this. */
+    appearance: auto;
     -webkit-user-select: none;
     white-space: pre
 }
@@ -711,17 +711,17 @@
 }
 
 input[type="checkbox" i] {
-    -webkit-appearance: checkbox; /* AutoAppearanceFor() should match to this. */
+    appearance: auto;
     box-sizing: border-box;
 }
 
 input[type="radio" i] {
-    -webkit-appearance: radio; /* AutoAppearanceFor() should match to this. */
+    appearance: auto;
     box-sizing: border-box;
 }
 
 input[type="color" i] {
-    -webkit-appearance: square-button; /* AutoAppearanceFor() should match to this. */
+    appearance: auto;
     width: 44px;
     height: 23px;
     background-color: ButtonFace;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index c5e0693c..5408278 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -4016,7 +4016,7 @@
 }
 
 bool LayoutObject::GetImageAnimationPolicy(
-    web_pref::ImageAnimationPolicy& policy) {
+    mojom::blink::ImageAnimationPolicy& policy) {
   NOT_DESTROYED();
   if (!GetDocument().GetSettings())
     return false;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index b3af32ed..2093363 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2726,7 +2726,7 @@
   void ImageNotifyFinished(ImageResourceContent*) override;
   void NotifyImageFullyRemoved(ImageResourceContent*) override;
   bool WillRenderImage() final;
-  bool GetImageAnimationPolicy(web_pref::ImageAnimationPolicy&) final;
+  bool GetImageAnimationPolicy(mojom::blink::ImageAnimationPolicy&) final;
 
   void Remove() {
     NOT_DESTROYED();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc
index 8303eca..f3ea169 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc
@@ -26,17 +26,13 @@
 // vlr rtl => bottom left
 // vrl ltr => top right
 // vrl rtl => bottom right
-bool IsLeftDominant(const WritingMode container_writing_mode,
-                    const TextDirection container_direction) {
-  return (container_writing_mode != WritingMode::kVerticalRl) &&
-         !(container_writing_mode == WritingMode::kHorizontalTb &&
-           container_direction == TextDirection::kRtl);
+bool IsLeftDominant(const WritingDirectionMode writing_direction) {
+  return (writing_direction.GetWritingMode() != WritingMode::kVerticalRl) &&
+         !(writing_direction.IsHorizontal() && writing_direction.IsRtl());
 }
 
-bool IsTopDominant(const WritingMode container_writing_mode,
-                   const TextDirection container_direction) {
-  return (container_writing_mode == WritingMode::kHorizontalTb) ||
-         (container_direction != TextDirection::kRtl);
+bool IsTopDominant(const WritingDirectionMode writing_direction) {
+  return writing_direction.IsHorizontal() || writing_direction.IsLtr();
 }
 
 // A direction agnostic version of |NGLogicalStaticPosition::InlineEdge|, and
@@ -428,8 +424,7 @@
     const base::Optional<MinMaxSizes>& minmax_content_sizes,
     const base::Optional<MinMaxSizes>& minmax_intrinsic_sizes_for_ar,
     const base::Optional<LogicalSize>& replaced_size,
-    const WritingMode container_writing_mode,
-    const TextDirection container_direction,
+    const WritingDirectionMode container_writing_direction,
     NGLogicalOutOfFlowDimensions* dimensions) {
   DCHECK(dimensions);
 
@@ -475,15 +470,14 @@
     inline_size = minmax_content_sizes->min_size;
   }
 
+  const auto writing_direction = style.GetWritingDirection();
   bool is_start_dominant;
-  if (style.GetWritingMode() == WritingMode::kHorizontalTb) {
-    is_start_dominant =
-        IsLeftDominant(container_writing_mode, container_direction) ==
-        IsLeftDominant(style.GetWritingMode(), style.Direction());
+  if (writing_direction.IsHorizontal()) {
+    is_start_dominant = IsLeftDominant(container_writing_direction) ==
+                        IsLeftDominant(writing_direction);
   } else {
-    is_start_dominant =
-        IsTopDominant(container_writing_mode, container_direction) ==
-        IsTopDominant(style.GetWritingMode(), style.Direction());
+    is_start_dominant = IsTopDominant(container_writing_direction) ==
+                        IsTopDominant(writing_direction);
   }
 
   ComputeAbsoluteSize(
@@ -506,8 +500,7 @@
     const NGLogicalStaticPosition& static_position,
     const base::Optional<LayoutUnit>& child_block_size,
     const base::Optional<LogicalSize>& replaced_size,
-    const WritingMode container_writing_mode,
-    const TextDirection container_direction,
+    const WritingDirectionMode container_writing_direction,
     NGLogicalOutOfFlowDimensions* dimensions) {
   // After partial size has been computed, child block size is either unknown,
   // or fully computed, there is no minmax. To express this, a 'fixed' minmax
@@ -541,15 +534,14 @@
     block_size = replaced_size->block_size;
   }
 
+  const auto writing_direction = style.GetWritingDirection();
   bool is_start_dominant;
-  if (style.GetWritingMode() == WritingMode::kHorizontalTb) {
-    is_start_dominant =
-        IsTopDominant(container_writing_mode, container_direction) ==
-        IsTopDominant(style.GetWritingMode(), style.Direction());
+  if (writing_direction.IsHorizontal()) {
+    is_start_dominant = IsTopDominant(container_writing_direction) ==
+                        IsTopDominant(writing_direction);
   } else {
-    is_start_dominant =
-        IsLeftDominant(container_writing_mode, container_direction) ==
-        IsLeftDominant(style.GetWritingMode(), style.Direction());
+    is_start_dominant = IsLeftDominant(container_writing_direction) ==
+                        IsLeftDominant(writing_direction);
   }
 
   ComputeAbsoluteSize(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h
index 4bd7b44a..671ce328 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h
@@ -73,8 +73,7 @@
     const base::Optional<MinMaxSizes>& minmax_content_sizes,
     const base::Optional<MinMaxSizes>& minmax_intrinsic_sizes_for_ar,
     const base::Optional<LogicalSize>& replaced_size,
-    const WritingMode container_writing_mode,
-    const TextDirection container_direction,
+    const WritingDirectionMode container_writing_direction,
     NGLogicalOutOfFlowDimensions* dimensions);
 
 // Computes the rest of the absolute position which depends on child's
@@ -86,8 +85,7 @@
     const NGLogicalStaticPosition&,
     const base::Optional<LayoutUnit>& child_block_size,
     const base::Optional<LogicalSize>& replaced_size,
-    const WritingMode container_writing_mode,
-    const TextDirection container_direction,
+    const WritingDirectionMode container_writing_direction,
     NGLogicalOutOfFlowDimensions* dimensions);
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc
index 2a8ff06..2b015ae 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc
@@ -164,7 +164,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(min_max_60.min_size, dimensions.size.inline_size);
   EXPECT_EQ(LayoutUnit(0), dimensions.inset.inline_start);
 
@@ -175,7 +175,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position_inline_end,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(min_max_60.min_size, dimensions.size.inline_size);
   EXPECT_EQ(container_size_.inline_size, dimensions.inset.inline_end);
 
@@ -183,7 +183,7 @@
   ComputeOutOfFlowInlineDimensions(
       rtl_space_, *style_, rtl_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(min_max_60.min_size, dimensions.size.inline_size);
   EXPECT_EQ(container_size_.inline_size - min_max_60.min_size,
             dimensions.inset.inline_end);
@@ -195,7 +195,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   LayoutUnit margin_space = (container_size_.inline_size - left - right -
                              dimensions.size.inline_size) /
                             2;
@@ -207,10 +207,10 @@
                      WritingMode::kVerticalLr);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   estimated_inline.reset();
-  ComputeOutOfFlowBlockDimensions(vlr_space_, *style_, vlr_border_padding,
-                                  static_position, estimated_block,
-                                  base::nullopt, WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      vlr_space_, *style_, vlr_border_padding, static_position, estimated_block,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(left + margin_space, dimensions.inset.block_start);
   EXPECT_EQ(right + margin_space, dimensions.inset.block_end);
 
@@ -219,10 +219,10 @@
                      WritingMode::kVerticalRl);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   estimated_inline.reset();
-  ComputeOutOfFlowBlockDimensions(vrl_space_, *style_, vrl_border_padding,
-                                  static_position, estimated_block,
-                                  base::nullopt, WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      vrl_space_, *style_, vrl_border_padding, static_position, estimated_block,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(left + margin_space, dimensions.inset.block_end);
   EXPECT_EQ(right + margin_space, dimensions.inset.block_start);
 
@@ -232,7 +232,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(left, dimensions.inset.inline_start);
   EXPECT_EQ(-left, dimensions.inset.inline_end);
 
@@ -243,7 +243,7 @@
   ComputeOutOfFlowInlineDimensions(
       rtl_space_, *style_, rtl_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kRtl, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kRtl}, &dimensions);
   EXPECT_EQ(-right, dimensions.inset.inline_start);
   EXPECT_EQ(right, dimensions.inset.inline_end);
 
@@ -254,7 +254,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(min_max_60.min_size, dimensions.size.inline_size);
 
   // Rule 2 left and right are auto LTR.
@@ -264,7 +264,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(margin_left, dimensions.inset.inline_start);
   EXPECT_EQ(container_size_.inline_size - margin_left - width,
             dimensions.inset.inline_end);
@@ -276,7 +276,7 @@
   ComputeOutOfFlowInlineDimensions(
       rtl_space_, *style_, rtl_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(margin_left, dimensions.inset.inline_start);
   EXPECT_EQ(container_size_.inline_size - margin_left - width,
             dimensions.inset.inline_end);
@@ -288,7 +288,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(
       container_size_.inline_size - min_max_60.min_size - left - margin_left,
       dimensions.inset.inline_end);
@@ -301,7 +301,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(left + margin_left, dimensions.inset.inline_start);
 
   // Rule 4: left is auto, EBoxSizing::kContentBox
@@ -314,7 +314,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(left + margin_left, dimensions.inset.inline_start);
   style_->SetBoxSizing(EBoxSizing::kBorderBox);
 
@@ -325,7 +325,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(right + margin_right, dimensions.inset.inline_end);
 
   // Rule 6: width is auto.
@@ -335,7 +335,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(width, dimensions.size.inline_size);
 }
 
@@ -397,28 +397,28 @@
   SetVerticalStyle(NGAuto, NGAuto, NGAuto, NGAuto, NGAuto);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), true);
   auto_height = LayoutUnit(60);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(*auto_height, dimensions.size.block_size);
   EXPECT_EQ(LayoutUnit(0), dimensions.inset.block_start);
 
   // All auto, static position bottom
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position_block_end, auto_height,
-                                  base::nullopt, WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position_block_end,
+      auto_height, base::nullopt,
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(container_size_.block_size, dimensions.inset.block_end);
 
   // If top, bottom, and height are known, compute margins.
   SetVerticalStyle(top, NGAuto, height, NGAuto, bottom);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   auto_height.reset();
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   LayoutUnit margin_space =
       (container_size_.block_size - top - height - bottom) / 2;
   EXPECT_EQ(top + margin_space, dimensions.inset.block_start);
@@ -428,10 +428,10 @@
   SetVerticalStyle(top, NGAuto, height, NGAuto, bottom,
                    WritingMode::kVerticalLr);
   EXPECT_EQ(AbsoluteNeedsChildInlineSize(*style_), false);
-  ComputeOutOfFlowInlineDimensions(vlr_space_, *style_, vlr_border_padding,
-                                   static_position, min_max_60, base::nullopt,
-                                   base::nullopt, WritingMode::kHorizontalTb,
-                                   TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowInlineDimensions(
+      vlr_space_, *style_, vlr_border_padding, static_position, min_max_60,
+      base::nullopt, base::nullopt,
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(top + margin_space, dimensions.inset.inline_start);
   EXPECT_EQ(bottom + margin_space, dimensions.inset.inline_end);
 
@@ -439,10 +439,10 @@
   SetVerticalStyle(top, NGAuto, height, NGAuto, bottom,
                    WritingMode::kVerticalRl);
   EXPECT_EQ(AbsoluteNeedsChildInlineSize(*style_), false);
-  ComputeOutOfFlowInlineDimensions(vrl_space_, *style_, vrl_border_padding,
-                                   static_position, min_max_60, base::nullopt,
-                                   base::nullopt, WritingMode::kHorizontalTb,
-                                   TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowInlineDimensions(
+      vrl_space_, *style_, vrl_border_padding, static_position, min_max_60,
+      base::nullopt, base::nullopt,
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(top + margin_space, dimensions.inset.inline_start);
   EXPECT_EQ(bottom + margin_space, dimensions.inset.inline_end);
 
@@ -451,10 +451,10 @@
       (container_size_.block_size - top - LayoutUnit(300) - bottom) / 2;
   SetVerticalStyle(top, NGAuto, LayoutUnit(300), NGAuto, bottom);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(top + negative_margin_space, dimensions.inset.block_start);
   EXPECT_EQ(bottom + negative_margin_space, dimensions.inset.block_end);
 
@@ -462,20 +462,20 @@
   SetVerticalStyle(NGAuto, margin_top, NGAuto, margin_bottom, bottom);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), true);
   auto_height = LayoutUnit(60);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(*auto_height, dimensions.size.block_size);
 
   // Rule 2: top and bottom are unknown.
   SetVerticalStyle(NGAuto, margin_top, height, margin_bottom, NGAuto);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   auto_height.reset();
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(margin_top, dimensions.inset.block_start);
   EXPECT_EQ(container_size_.block_size - margin_top - height,
             dimensions.inset.block_end);
@@ -485,50 +485,50 @@
   SetVerticalStyle(top, margin_top, NGAuto, margin_bottom, NGAuto);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), true);
   auto_height = LayoutUnit(20);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(horizontal_border_padding, dimensions.size.block_size);
 
   // Rule 3: height and bottom are unknown.
   SetVerticalStyle(top, margin_top, NGAuto, margin_bottom, NGAuto);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), true);
   auto_height = LayoutUnit(70);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(*auto_height, dimensions.size.block_size);
 
   // Rule 4: top is unknown.
   SetVerticalStyle(NGAuto, margin_top, height, margin_bottom, bottom);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   auto_height.reset();
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(top + margin_top, dimensions.inset.block_start);
 
   // Rule 5: bottom is unknown.
   SetVerticalStyle(top, margin_top, height, margin_bottom, NGAuto);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   auto_height.reset();
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(bottom + margin_bottom, dimensions.inset.block_end);
 
   // Rule 6: height is unknown.
   SetVerticalStyle(top, margin_top, NGAuto, margin_bottom, bottom);
   EXPECT_EQ(AbsoluteNeedsChildBlockSize(*style_), false);
   auto_height.reset();
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(height, dimensions.size.block_size);
 }
 
@@ -550,7 +550,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, border_padding, static_position,
       MinMaxSizes{LayoutUnit(), LayoutUnit(1000)}, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(LayoutUnit(100), dimensions.size.inline_size);
   EXPECT_EQ(LayoutUnit(100), dimensions.inset.inline_start);
   EXPECT_EQ(LayoutUnit(), dimensions.inset.inline_end);
@@ -558,15 +558,15 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, border_padding, static_position,
       MinMaxSizes{LayoutUnit(), LayoutUnit(1000)}, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kRtl, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kRtl}, &dimensions);
   EXPECT_EQ(LayoutUnit(100), dimensions.size.inline_size);
   EXPECT_EQ(LayoutUnit(100), dimensions.inset.inline_start);
   EXPECT_EQ(LayoutUnit(), dimensions.inset.inline_end);
 
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, border_padding,
-                                  static_position, LayoutUnit(150),
-                                  base::nullopt, WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, border_padding, static_position, LayoutUnit(150),
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(LayoutUnit(150), dimensions.size.block_size);
   EXPECT_EQ(LayoutUnit(125), dimensions.inset.block_start);
   EXPECT_EQ(LayoutUnit(25), dimensions.inset.block_end);
@@ -598,7 +598,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(min, dimensions.size.inline_size);
 
   // width > max gets set to max.
@@ -606,7 +606,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(max, dimensions.size.inline_size);
 
   // Unspecified width becomes min_max, gets clamped to min.
@@ -614,7 +614,7 @@
   ComputeOutOfFlowInlineDimensions(
       ltr_space_, *style_, ltr_border_padding, static_position,
       estimated_inline, base::nullopt, base::nullopt,
-      WritingMode::kHorizontalTb, TextDirection::kLtr, &dimensions);
+      {WritingMode::kHorizontalTb, TextDirection::kLtr}, &dimensions);
   EXPECT_EQ(min, dimensions.size.inline_size);
 
   // HEIGHT TESTS
@@ -623,27 +623,27 @@
 
   // height < min gets set to min.
   SetVerticalStyle(NGAuto, NGAuto, LayoutUnit(5), NGAuto, NGAuto);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(min, dimensions.size.block_size);
 
   // height > max gets set to max.
   SetVerticalStyle(NGAuto, NGAuto, LayoutUnit(200), NGAuto, NGAuto);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(max, dimensions.size.block_size);
 
   // // Unspecified height becomes estimated, gets clamped to min.
   SetVerticalStyle(NGAuto, NGAuto, NGAuto, NGAuto, NGAuto);
   auto_height = LayoutUnit(20);
-  ComputeOutOfFlowBlockDimensions(ltr_space_, *style_, ltr_border_padding,
-                                  static_position, auto_height, base::nullopt,
-                                  WritingMode::kHorizontalTb,
-                                  TextDirection::kLtr, &dimensions);
+  ComputeOutOfFlowBlockDimensions(
+      ltr_space_, *style_, ltr_border_padding, static_position, auto_height,
+      base::nullopt, {WritingMode::kHorizontalTb, TextDirection::kLtr},
+      &dimensions);
   EXPECT_EQ(min, dimensions.size.block_size);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
index 42f5fa8..0d3944f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
@@ -390,7 +390,8 @@
   // after it has been computed.
   PhysicalOffset offset;
   TextDecorationInfo decoration_info(offset, offset, ink_overflow.Width(),
-                                     style.GetFontBaseline(), style, nullptr);
+                                     style.GetFontBaseline(), style,
+                                     base::nullopt, nullptr);
   NGTextDecorationOffset decoration_offset(decoration_info.Style(), style,
                                            nullptr);
   const Vector<AppliedTextDecoration>& decorations =
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index 6c884ab..b8915c3 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -775,8 +775,7 @@
       ComputeOutOfFlowBlockDimensions(
           candidate_constraint_space, candidate_style, border_padding,
           candidate_static_position, base::nullopt, base::nullopt,
-          default_writing_direction.GetWritingMode(),
-          container_writing_direction.Direction(), &node_dimensions);
+          container_writing_direction, &node_dimensions);
       has_computed_block_dimensions = true;
       input.percentage_resolution_block_size = node_dimensions.size.block_size;
     }
@@ -824,8 +823,7 @@
   ComputeOutOfFlowInlineDimensions(
       candidate_constraint_space, candidate_style, border_padding,
       candidate_static_position, min_max_sizes, minmax_intrinsic_sizes_for_ar,
-      replaced_size, default_writing_direction.GetWritingMode(),
-      container_writing_direction.Direction(), &node_dimensions);
+      replaced_size, container_writing_direction, &node_dimensions);
 
   // |should_be_considered_as_replaced| sets the inline-size.
   // It does not set the block-size. This is a compatibility quirk.
@@ -875,8 +873,7 @@
     ComputeOutOfFlowBlockDimensions(
         candidate_constraint_space, candidate_style, border_padding,
         candidate_static_position, block_estimate, replaced_size,
-        default_writing_direction.GetWritingMode(),
-        container_writing_direction.Direction(), &node_dimensions);
+        container_writing_direction, &node_dimensions);
     has_computed_block_dimensions = true;
   }
 
diff --git a/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc b/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc
index 0711324..a8d1844 100644
--- a/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc
+++ b/third_party/blink/renderer/core/loader/alternate_signed_exchange_resource_info.cc
@@ -33,7 +33,7 @@
 
 const char* ImageAcceptHeader() {
   static constexpr char kImageAcceptHeaderWithAvif[] =
-      "image/avif,image/webp,image/apng,image/*,*/*;q=0.8";
+      "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
   static constexpr size_t kOffset = sizeof("image/avif,") - 1;
 #if BUILDFLAG(ENABLE_AV1_DECODER)
   static const char* header = base::FeatureList::IsEnabled(features::kAVIF)
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index b287d06..dcb29dfd 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -941,7 +941,7 @@
 }
 
 bool ImageLoader::GetImageAnimationPolicy(
-    web_pref::ImageAnimationPolicy& policy) {
+    mojom::blink::ImageAnimationPolicy& policy) {
   if (!GetElement()->GetDocument().GetSettings())
     return false;
 
diff --git a/third_party/blink/renderer/core/loader/image_loader.h b/third_party/blink/renderer/core/loader/image_loader.h
index 4996a03..472b42f7 100644
--- a/third_party/blink/renderer/core/loader/image_loader.h
+++ b/third_party/blink/renderer/core/loader/image_loader.h
@@ -135,7 +135,7 @@
 
   bool HadError() const { return !failed_load_url_.IsEmpty(); }
 
-  bool GetImageAnimationPolicy(web_pref::ImageAnimationPolicy&) final;
+  bool GetImageAnimationPolicy(mojom::blink::ImageAnimationPolicy&) final;
 
   ScriptPromise Decode(ScriptState*, ExceptionState&);
 
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
index 33de45e..9f6432a 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -542,8 +542,8 @@
   if (!image_)
     return;
 
-  web_pref::ImageAnimationPolicy new_policy =
-      web_pref::kImageAnimationPolicyAllowed;
+  mojom::blink::ImageAnimationPolicy new_policy =
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
   {
     ProhibitAddRemoveObserverInScope prohibit_add_remove_observer_in_scope(
         this);
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_observer.h b/third_party/blink/renderer/core/loader/resource/image_resource_observer.h
index a5d24aa..6dbd7e6 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_observer.h
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_observer.h
@@ -23,7 +23,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_IMAGE_RESOURCE_OBSERVER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_IMAGE_RESOURCE_OBSERVER_H_
 
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/style/style_image.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_priority.h"
@@ -74,7 +74,7 @@
 
   // Called to get imageAnimation policy from settings. An implementation of
   // this method is not allowed to add or remove ImageResource observers.
-  virtual bool GetImageAnimationPolicy(web_pref::ImageAnimationPolicy&) {
+  virtual bool GetImageAnimationPolicy(mojom::blink::ImageAnimationPolicy&) {
     return false;
   }
 
diff --git a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
index 840c4ff..e8c342e 100644
--- a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
+++ b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
@@ -373,9 +373,15 @@
           EnclosingUnderlineObject(&inline_text_box_);
       const ComputedStyle* decorating_box_style =
           decorating_box ? decorating_box.Style() : nullptr;
+      base::Optional<AppliedTextDecoration> selection_text_decoration =
+          UNLIKELY(have_selection)
+              ? base::Optional<AppliedTextDecoration>(
+                    selection_style.selection_text_decoration)
+              : base::nullopt;
       decoration_info.emplace(box_origin, local_origin, width,
                               inline_text_box_.Root().BaselineType(),
-                              style_to_use, decorating_box_style);
+                              style_to_use, selection_text_decoration,
+                              decorating_box_style);
       TextDecorationOffset decoration_offset(decoration_info->Style(),
                                              &inline_text_box_, decorating_box);
       text_painter.PaintDecorationsExceptLineThrough(
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
index 280f8c7..899b1837 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
@@ -366,6 +366,8 @@
 
   const LayoutSelectionStatus& Status() const { return selection_status_; }
 
+  const TextPaintStyle& GetSelectionStyle() const { return selection_style_; }
+
   bool ShouldPaintSelectedTextOnly() const { return paint_selected_text_only_; }
 
   bool ShouldPaintSelectedTextSeparately() const {
@@ -667,9 +669,15 @@
         !text_item.IsEllipsis()) {
       PhysicalOffset local_origin = box_rect.offset;
       LayoutUnit width = box_rect.Width();
+      base::Optional<AppliedTextDecoration> selection_text_decoration =
+          UNLIKELY(selection)
+              ? base::Optional<AppliedTextDecoration>(
+                    selection->GetSelectionStyle().selection_text_decoration)
+              : base::nullopt;
 
       decoration_info.emplace(box_rect.offset, local_origin, width,
-                              style.GetFontBaseline(), style, nullptr);
+                              style.GetFontBaseline(), style,
+                              selection_text_decoration, nullptr);
       NGTextDecorationOffset decoration_offset(decoration_info->Style(),
                                                text_item.Style(), nullptr);
       text_painter.PaintDecorationsExceptLineThrough(
diff --git a/third_party/blink/renderer/core/paint/selection_painting_utils.cc b/third_party/blink/renderer/core/paint/selection_painting_utils.cc
index d4ed87b..81b491f 100644
--- a/third_party/blink/renderer/core/paint/selection_painting_utils.cc
+++ b/third_party/blink/renderer/core/paint/selection_painting_utils.cc
@@ -142,6 +142,35 @@
                    style.UsedColorScheme());
 }
 
+base::Optional<AppliedTextDecoration>
+SelectionPaintingUtils::SelectionTextDecoration(
+    const ComputedStyle& style,
+    const ComputedStyle& pseudo_style) {
+  const Vector<AppliedTextDecoration>& style_decorations =
+      style.AppliedTextDecorations();
+  const Vector<AppliedTextDecoration>& pseudo_style_decorations =
+      pseudo_style.AppliedTextDecorations();
+
+  if (style_decorations.IsEmpty())
+    return base::nullopt;
+
+  base::Optional<AppliedTextDecoration> selection_text_decoration =
+      base::nullopt;
+
+  if (style_decorations.back().Lines() ==
+      pseudo_style_decorations.back().Lines()) {
+    selection_text_decoration = pseudo_style_decorations.back();
+
+    if (style_decorations.size() == pseudo_style_decorations.size()) {
+      selection_text_decoration.value().SetColor(
+          pseudo_style.VisitedDependentColor(
+              GetCSSPropertyTextDecorationColor()));
+    }
+  }
+
+  return selection_text_decoration;
+}
+
 Color SelectionPaintingUtils::SelectionForegroundColor(
     const Document& document,
     const ComputedStyle& style,
@@ -190,6 +219,8 @@
       selection_style.stroke_width = pseudo_style->TextStrokeWidth();
       selection_style.shadow =
           uses_text_as_clip ? nullptr : pseudo_style->TextShadow();
+      selection_style.selection_text_decoration =
+          SelectionTextDecoration(style, *pseudo_style);
     }
 
     // Text shadows are disabled when printing. http://crbug.com/258321
diff --git a/third_party/blink/renderer/core/paint/selection_painting_utils.h b/third_party/blink/renderer/core/paint/selection_painting_utils.h
index f8953a4..19552181 100644
--- a/third_party/blink/renderer/core/paint/selection_painting_utils.h
+++ b/third_party/blink/renderer/core/paint/selection_painting_utils.h
@@ -8,6 +8,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/paint/paint_phase.h"
+#include "third_party/blink/renderer/core/style/applied_text_decoration.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
 namespace blink {
@@ -23,6 +24,9 @@
   STATIC_ONLY(SelectionPaintingUtils);
 
  public:
+  static base::Optional<AppliedTextDecoration> SelectionTextDecoration(
+      const ComputedStyle&,
+      const ComputedStyle&);
   static Color SelectionBackgroundColor(const Document&,
                                         const ComputedStyle&,
                                         Node*);
diff --git a/third_party/blink/renderer/core/paint/text_decoration_info.cc b/third_party/blink/renderer/core/paint/text_decoration_info.cc
index a826e439a..0e1ba78c 100644
--- a/third_party/blink/renderer/core/paint/text_decoration_info.cc
+++ b/third_party/blink/renderer/core/paint/text_decoration_info.cc
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #include "third_party/blink/renderer/core/paint/text_decoration_info.h"
-
+#include "third_party/blink/renderer/core/paint/text_paint_style.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/geometry/length_functions.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
@@ -159,8 +159,10 @@
     LayoutUnit width,
     FontBaseline baseline_type,
     const ComputedStyle& style,
+    const base::Optional<AppliedTextDecoration> selection_text_decoration,
     const ComputedStyle* decorating_box_style)
     : style_(style),
+      selection_text_decoration_(selection_text_decoration),
       baseline_type_(baseline_type),
       width_(width),
       font_data_(style_.GetFont().PrimaryFont()),
@@ -202,6 +204,14 @@
 }
 
 Color TextDecorationInfo::LineColor() const {
+  // Find the matched normal and selection |AppliedTextDecoration|
+  // and use the text-decoration-color from selection when it is.
+  if (selection_text_decoration_ &&
+      style_.AppliedTextDecorations()[decoration_index_].Lines() ==
+          selection_text_decoration_.value().Lines()) {
+    return selection_text_decoration_.value().GetColor();
+  }
+
   return style_.AppliedTextDecorations()[decoration_index_].GetColor();
 }
 
diff --git a/third_party/blink/renderer/core/paint/text_decoration_info.h b/third_party/blink/renderer/core/paint/text_decoration_info.h
index 2309e5a..31f0553 100644
--- a/third_party/blink/renderer/core/paint/text_decoration_info.h
+++ b/third_party/blink/renderer/core/paint/text_decoration_info.h
@@ -7,6 +7,7 @@
 
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/layout/geometry/physical_offset.h"
+#include "third_party/blink/renderer/core/paint/text_paint_style.h"
 #include "third_party/blink/renderer/core/style/applied_text_decoration.h"
 #include "third_party/blink/renderer/core/style/computed_style_constants.h"
 #include "third_party/blink/renderer/platform/fonts/font_baseline.h"
@@ -16,7 +17,6 @@
 #include "third_party/blink/renderer/platform/graphics/path.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
-
 namespace blink {
 
 class ComputedStyle;
@@ -34,12 +34,14 @@
 // https://www.w3.org/TR/css-text-decor-3/#painting-order
 class CORE_EXPORT TextDecorationInfo {
  public:
-  TextDecorationInfo(const PhysicalOffset& box_origin,
-                     PhysicalOffset local_origin,
-                     LayoutUnit width,
-                     FontBaseline baseline_type,
-                     const ComputedStyle& style,
-                     const ComputedStyle* decorating_box_style);
+  TextDecorationInfo(
+      const PhysicalOffset& box_origin,
+      PhysicalOffset local_origin,
+      LayoutUnit width,
+      FontBaseline baseline_type,
+      const ComputedStyle& style,
+      const base::Optional<AppliedTextDecoration> selection_text_decoration,
+      const ComputedStyle* decorating_box_style);
 
   // Set the decoration to use when painting and returning values.
   // Must be set before calling any other method, and can be called
@@ -104,6 +106,7 @@
   FloatRect BoundsForWavy(TextDecoration line) const;
 
   const ComputedStyle& style_;
+  const base::Optional<AppliedTextDecoration> selection_text_decoration_;
   const FontBaseline baseline_type_;
   const LayoutUnit width_;
   const SimpleFontData* font_data_;
diff --git a/third_party/blink/renderer/core/paint/text_paint_style.h b/third_party/blink/renderer/core/paint/text_paint_style.h
index 1732a41..515c9c3 100644
--- a/third_party/blink/renderer/core/paint/text_paint_style.h
+++ b/third_party/blink/renderer/core/paint/text_paint_style.h
@@ -7,6 +7,7 @@
 
 #include "third_party/blink/public/common/css/color_scheme.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/style/applied_text_decoration.h"
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
@@ -25,6 +26,7 @@
   float stroke_width;
   ColorScheme color_scheme;
   const ShadowList* shadow;
+  base::Optional<AppliedTextDecoration> selection_text_decoration;
 
   bool operator==(const TextPaintStyle& other) const {
     return current_color == other.current_color &&
@@ -32,7 +34,8 @@
            stroke_color == other.stroke_color &&
            emphasis_mark_color == other.emphasis_mark_color &&
            stroke_width == other.stroke_width &&
-           color_scheme == other.color_scheme && shadow == other.shadow;
+           color_scheme == other.color_scheme && shadow == other.shadow &&
+           selection_text_decoration == other.selection_text_decoration;
   }
   bool operator!=(const TextPaintStyle& other) const {
     return !(*this == other);
diff --git a/third_party/blink/renderer/core/style/style_fetched_image.cc b/third_party/blink/renderer/core/style/style_fetched_image.cc
index d19e89e..90f227b 100644
--- a/third_party/blink/renderer/core/style/style_fetched_image.cc
+++ b/third_party/blink/renderer/core/style/style_fetched_image.cc
@@ -188,7 +188,7 @@
 }
 
 bool StyleFetchedImage::GetImageAnimationPolicy(
-    web_pref::ImageAnimationPolicy& policy) {
+    mojom::blink::ImageAnimationPolicy& policy) {
   if (!document_ || !document_->GetSettings()) {
     return false;
   }
diff --git a/third_party/blink/renderer/core/style/style_fetched_image.h b/third_party/blink/renderer/core/style/style_fetched_image.h
index ba4af55..6559658 100644
--- a/third_party/blink/renderer/core/style/style_fetched_image.h
+++ b/third_party/blink/renderer/core/style/style_fetched_image.h
@@ -82,7 +82,7 @@
 
   // ImageResourceObserver overrides
   void ImageNotifyFinished(ImageResourceContent*) override;
-  bool GetImageAnimationPolicy(web_pref::ImageAnimationPolicy&) override;
+  bool GetImageAnimationPolicy(mojom::blink::ImageAnimationPolicy&) override;
 
   Member<ImageResourceContent> image_;
   Member<const Document> document_;
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
index 759e2af..369c64e 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
+++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
@@ -330,7 +330,8 @@
   // yield the same value.
   max_presentation_time_ = SMILTime::Latest() - SMILTime::Epsilon();
   presentation_time_ = ClampPresentationTime(new_presentation_time);
-  if (AnimationPolicy() != web_pref::kImageAnimationPolicyAnimateOnce)
+  if (AnimationPolicy() !=
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce)
     return;
   const SMILTime kAnimationPolicyOnceDuration = SMILTime::FromSecondsD(3);
   max_presentation_time_ =
@@ -410,15 +411,17 @@
   }
 }
 
-web_pref::ImageAnimationPolicy SMILTimeContainer::AnimationPolicy() const {
+mojom::blink::ImageAnimationPolicy SMILTimeContainer::AnimationPolicy() const {
   const Settings* settings = GetDocument().GetSettings();
-  return settings ? settings->GetImageAnimationPolicy()
-                  : web_pref::kImageAnimationPolicyAllowed;
+  return settings
+             ? settings->GetImageAnimationPolicy()
+             : mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
 }
 
 bool SMILTimeContainer::AnimationsDisabled() const {
-  return !GetDocument().IsActive() ||
-         AnimationPolicy() == web_pref::kImageAnimationPolicyNoAnimation;
+  return !GetDocument().IsActive() || AnimationPolicy() ==
+                                          mojom::blink::ImageAnimationPolicy::
+                                              kImageAnimationPolicyNoAnimation;
 }
 
 void SMILTimeContainer::UpdateDocumentOrderIndexes() {
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.h b/third_party/blink/renderer/core/svg/animation/smil_time_container.h
index 9ebbc1a..c69148a 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_time_container.h
+++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.h
@@ -27,7 +27,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_ANIMATION_SMIL_TIME_CONTAINER_H_
 
 #include "base/time/time.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/svg/animation/priority_queue.h"
 #include "third_party/blink/renderer/core/svg/animation/smil_time.h"
@@ -95,7 +95,7 @@
   void ScheduleAnimationFrame(base::TimeDelta delay_time);
   void CancelAnimationFrame();
   void WakeupTimerFired(TimerBase*);
-  web_pref::ImageAnimationPolicy AnimationPolicy() const;
+  mojom::blink::ImageAnimationPolicy AnimationPolicy() const;
   bool AnimationsDisabled() const;
   class TimingUpdate;
   void UpdateAnimationsAndScheduleFrameIfNeeded(TimingUpdate&);
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container_test.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container_test.cc
index a22a04a..80e4967 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_time_container_test.cc
+++ b/third_party/blink/renderer/core/svg/animation/smil_time_container_test.cc
@@ -138,7 +138,7 @@
  private:
   static void OverrideSettings(Settings& settings) {
     settings.SetImageAnimationPolicy(
-        web_pref::kImageAnimationPolicyAnimateOnce);
+        mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce);
   }
 
   base::TimeTicks current_time_;
diff --git a/third_party/blink/renderer/core/testing/internal_settings.cc b/third_party/blink/renderer/core/testing/internal_settings.cc
index bcc409db..22e4c90 100644
--- a/third_party/blink/renderer/core/testing/internal_settings.cc
+++ b/third_party/blink/renderer/core/testing/internal_settings.cc
@@ -488,13 +488,13 @@
   InternalSettingsGuardForSettings();
   if (EqualIgnoringASCIICase(policy, "allowed")) {
     GetSettings()->SetImageAnimationPolicy(
-        web_pref::kImageAnimationPolicyAllowed);
+        mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed);
   } else if (EqualIgnoringASCIICase(policy, "once")) {
     GetSettings()->SetImageAnimationPolicy(
-        web_pref::kImageAnimationPolicyAnimateOnce);
+        mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce);
   } else if (EqualIgnoringASCIICase(policy, "none")) {
     GetSettings()->SetImageAnimationPolicy(
-        web_pref::kImageAnimationPolicyNoAnimation);
+        mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation);
   } else {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kSyntaxError,
diff --git a/third_party/blink/renderer/core/testing/internal_settings.h b/third_party/blink/renderer/core/testing/internal_settings.h
index 014caab..f6725bff 100644
--- a/third_party/blink/renderer/core/testing/internal_settings.h
+++ b/third_party/blink/renderer/core/testing/internal_settings.h
@@ -27,7 +27,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_INTERNAL_SETTINGS_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_INTERNAL_SETTINGS_H_
 
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
 #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
 #include "third_party/blink/renderer/core/page/page.h"
@@ -67,7 +66,7 @@
     bool lang_attribute_aware_form_control_ui_enabled_;
     bool images_enabled_;
     String default_video_poster_url_;
-    web_pref::ImageAnimationPolicy original_image_animation_policy_;
+    mojom::blink::ImageAnimationPolicy original_image_animation_policy_;
     bool original_scroll_top_left_interop_enabled_;
   };
 
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.idl b/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.idl
index 28b9af7c..bc0e144 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.idl
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.idl
@@ -9,13 +9,13 @@
     RuntimeEnabled=WebBluetooth,
     SecureContext
 ] interface BluetoothCharacteristicProperties {
-    [HighEntropy=Direct, MeasureAs=BCPBroadcast] readonly attribute boolean broadcast;
-    [HighEntropy=Direct, MeasureAs=BCPRead] readonly attribute boolean read;
-    [HighEntropy=Direct, MeasureAs=BCPWriteWithoutResponse] readonly attribute boolean writeWithoutResponse;
-    [HighEntropy=Direct, MeasureAs=BCPWrite] readonly attribute boolean write;
-    [HighEntropy=Direct, MeasureAs=BCPNotify] readonly attribute boolean notify;
-    [HighEntropy=Direct, MeasureAs=BCPIndicate] readonly attribute boolean indicate;
-    [HighEntropy=Direct, MeasureAs=BCPAuthenticatedSignedWrites] readonly attribute boolean authenticatedSignedWrites;
-    [HighEntropy=Direct, MeasureAs=BCPReliableWrite] readonly attribute boolean reliableWrite;
-    [HighEntropy=Direct, MeasureAs=BCPWritableAuxiliaries] readonly attribute boolean writableAuxiliaries;
+    readonly attribute boolean broadcast;
+    readonly attribute boolean read;
+    readonly attribute boolean writeWithoutResponse;
+    readonly attribute boolean write;
+    readonly attribute boolean notify;
+    readonly attribute boolean indicate;
+    readonly attribute boolean authenticatedSignedWrites;
+    readonly attribute boolean reliableWrite;
+    readonly attribute boolean writableAuxiliaries;
 };
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
index 32e2fb69..700b3a7 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
@@ -31,15 +31,29 @@
   Vector<String> drop_elements = default_drop_elements_;
   if (config->hasDropElements()) {
     for (const String& s : config->dropElements()) {
-      if (!drop_elements.Contains(s.UpperASCII())) {
-        drop_elements.push_back(s.UpperASCII());
+      const String& upper_s = s.UpperASCII();
+      if (!drop_elements.Contains(upper_s)) {
+        drop_elements.push_back(upper_s);
       }
     }
   }
   config_->setDropElements(drop_elements);
 
-  // Format allowElements to uppercase.
+  // Format blockElements to uppercase.
+  Vector<String> block_elements = default_block_elements_;
+  if (config->hasBlockElements()) {
+    for (const String& s : config->blockElements()) {
+      const String& upper_s = s.UpperASCII();
+      if (!drop_elements.Contains(upper_s) &&
+          !block_elements.Contains(upper_s)) {
+        block_elements.push_back(upper_s);
+      }
+    }
+  }
+  config_->setBlockElements(block_elements);
+
   if (config->hasAllowElements()) {
+    // Format allowElements to uppercase.
     Vector<String> l;
     for (const String& s : config->allowElements()) {
       if (!config_->dropElements().Contains(s))
@@ -49,20 +63,21 @@
   }
 
   // Format dropAttributes to lowercase.
+  drop_attributes_ = default_drop_attributes_;
   if (config->hasDropAttributes()) {
-    drop_attributes_ = default_drop_attributes_;
     for (const String& s : config->dropAttributes()) {
       drop_attributes_.push_back(WTF::AtomicString(s.LowerASCII()));
     }
-  } else if (config->hasAllowAttributes()) {
+  }
+  if (config->hasAllowAttributes()) {
     Vector<String> l;
     for (const String& s : config->allowAttributes()) {
-      if (!default_drop_attributes_.Contains(s))
-        l.push_back(s.LowerASCII());
+      const String& lower_s = s.LowerASCII();
+      if (!default_drop_attributes_.Contains(lower_s) &&
+          !default_block_elements_.Contains(lower_s))
+        l.push_back(lower_s);
     }
     config_->setAllowAttributes(l);
-  } else {
-    drop_attributes_ = default_drop_attributes_;
   }
 }
 
@@ -106,8 +121,10 @@
       Node* tmp = node;
       node = NodeTraversal::NextSkippingChildren(*node, fragment);
       tmp->remove();
-    } else if (config_->hasAllowElements() &&
-               !config_->allowElements().Contains(node_name)) {
+    } else if ((config_->hasBlockElements() &&
+                config_->blockElements().Contains(node_name)) ||
+               (config_->hasAllowElements() &&
+                !config_->allowElements().Contains(node_name))) {
       // If the current element is blocked, append its children after current
       // node to parent node, remove current element and proceed to the next
       // node.
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
index 21dfb2e..cc91416 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
@@ -48,6 +48,7 @@
                                                  "SVG",       "TEMPLATE",
                                                  "THEAD",     "TITLE",
                                                  "VIDEO",     "XMP"};
+  const Vector<String> default_block_elements_ = {};
   const Vector<AtomicString> default_drop_attributes_ = {"onclick", "onsubmit"};
 };
 
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
index 884d783..715a7b9 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
@@ -6,6 +6,7 @@
 
 dictionary SanitizerConfig {
   sequence<DOMString> allowElements;
+  sequence<DOMString> blockElements;
   sequence<DOMString> dropElements;
   sequence<DOMString> allowAttributes;
   sequence<DOMString> dropAttributes;
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image.cc b/third_party/blink/renderer/platform/graphics/bitmap_image.cc
index 6e9b2c1..822dd97 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image.cc
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image.cc
@@ -52,14 +52,16 @@
 
 int GetRepetitionCountWithPolicyOverride(
     int actual_count,
-    web_pref::ImageAnimationPolicy policy) {
+    mojom::blink::ImageAnimationPolicy policy) {
   if (actual_count == kAnimationNone ||
-      policy == web_pref::kImageAnimationPolicyNoAnimation) {
+      policy == mojom::blink::ImageAnimationPolicy::
+                    kImageAnimationPolicyNoAnimation) {
     return kAnimationNone;
   }
 
   if (actual_count == kAnimationLoopOnce ||
-      policy == web_pref::kImageAnimationPolicyAnimateOnce) {
+      policy == mojom::blink::ImageAnimationPolicy::
+                    kImageAnimationPolicyAnimateOnce) {
     return kAnimationLoopOnce;
   }
 
@@ -68,7 +70,8 @@
 
 BitmapImage::BitmapImage(ImageObserver* observer, bool is_multipart)
     : Image(observer, is_multipart),
-      animation_policy_(web_pref::kImageAnimationPolicyAllowed),
+      animation_policy_(
+          mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed),
       all_data_received_(false),
       have_size_(false),
       size_available_(false),
@@ -435,7 +438,8 @@
   return decoder_ && decoder_->RepetitionCount() != kAnimationNone;
 }
 
-void BitmapImage::SetAnimationPolicy(web_pref::ImageAnimationPolicy policy) {
+void BitmapImage::SetAnimationPolicy(
+    mojom::blink::ImageAnimationPolicy policy) {
   if (animation_policy_ == policy)
     return;
 
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image.h b/third_party/blink/renderer/platform/graphics/bitmap_image.h
index 5b5600d..1558cef 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image.h
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image.h
@@ -31,7 +31,7 @@
 #include <memory>
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
 #include "third_party/blink/renderer/platform/geometry/int_size.h"
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/graphics/deferred_image_decoder.h"
@@ -80,8 +80,8 @@
   void ResetAnimation() override;
   bool MaybeAnimated() override;
 
-  void SetAnimationPolicy(web_pref::ImageAnimationPolicy) override;
-  web_pref::ImageAnimationPolicy AnimationPolicy() override {
+  void SetAnimationPolicy(mojom::blink::ImageAnimationPolicy) override;
+  mojom::blink::ImageAnimationPolicy AnimationPolicy() override {
     return animation_policy_;
   }
 
@@ -161,8 +161,9 @@
   // data is updated in DataChanged.
   PaintImage cached_frame_;
 
-  web_pref::ImageAnimationPolicy
-      animation_policy_;  // Whether or not we can play animation.
+  // Whether or not we can play animation.
+  mojom::blink::ImageAnimationPolicy animation_policy_ =
+      blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
 
   bool all_data_received_ : 1;  // Whether we've received all our data.
   mutable bool have_size_ : 1;  // Whether our |m_size| member variable has the
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc b/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc
index d7fa3b62..bfea932 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc
@@ -687,17 +687,20 @@
   // In all cases, the image shouldn't animate.
 
   // Only one loop allowed.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyAnimateOnce);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationNone);
 
   // No animation allowed.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyNoAnimation);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationNone);
 
   // Default policy.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyAllowed);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationNone);
 }
@@ -716,17 +719,20 @@
   // other cases, it remains loop once.
 
   // Only one loop allowed.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyAnimateOnce);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationLoopOnce);
 
   // No animation allowed.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyNoAnimation);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationNone);
 
   // Default policy.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyAllowed);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationLoopOnce);
 }
@@ -744,17 +750,20 @@
   // The repetition count is determined by the animation policy.
 
   // Only one loop allowed.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyAnimateOnce);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationLoopOnce);
 
   // No animation allowed.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyNoAnimation);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), kAnimationNone);
 
   // Default policy.
-  image_->SetAnimationPolicy(web_pref::kImageAnimationPolicyAllowed);
+  image_->SetAnimationPolicy(
+      mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed);
   image = image_->PaintImageForCurrentFrame();
   EXPECT_EQ(image.repetition_count(), repetition_count_);
 }
diff --git a/third_party/blink/renderer/platform/graphics/image.cc b/third_party/blink/renderer/platform/graphics/image.cc
index ee7d2dd..efb5c6d4 100644
--- a/third_party/blink/renderer/platform/graphics/image.cc
+++ b/third_party/blink/renderer/platform/graphics/image.cc
@@ -226,7 +226,7 @@
                         SkBlendMode composite_op,
                         const FloatRect& dest_rect,
                         const FloatSize& repeat_spacing,
-                        RespectImageOrientationEnum) {
+                        RespectImageOrientationEnum respect_orientation) {
   TRACE_EVENT0("skia", "Image::drawPattern");
 
   if (dest_rect.IsEmpty())
@@ -236,34 +236,48 @@
   if (!image)
     return;  // nothing to draw
 
-  // The subset_rect is in source image space, unscaled.
+  // The subset_rect is in source image space, unscaled, unoriented.
   IntRect subset_rect = EnclosingIntRect(float_src_rect);
   subset_rect.Intersect(IntRect(0, 0, image.width(), image.height()));
   if (subset_rect.IsEmpty())
     return;  // nothing to draw
 
+  // Apply image orientation, if necessary
+  FloatSize oriented_scale = scale_src_to_dest;
+  if (respect_orientation && !HasDefaultOrientation()) {
+    FloatSize original_image_size(SizeAsFloat(kDoNotRespectImageOrientation));
+    image = ResizeAndOrientImage(image, CurrentFrameOrientation());
+    subset_rect = RoundedIntRect(CorrectSrcRectForImageOrientation(
+        original_image_size, FloatRect(subset_rect)));
+    // Upstream, the scale_src_to_dest was computed to take an un-oriented size
+    // and make it oriented. For example, an image that is 100x50 un-oriented
+    // and 50x100 oriented will have a scale of (0.5,2). Undo this, because the
+    // scale has now been applied by orienting the image.
+    oriented_scale.Scale(
+        original_image_size.Width() / static_cast<float>(image.width()),
+        original_image_size.Height() / static_cast<float>(image.height()));
+  }
+
   SkMatrix local_matrix;
   // We also need to translate it such that the origin of the pattern is the
   // origin of the destination rect, which is what Blink expects. Skia uses
   // the coordinate system origin as the base for the pattern. If Blink wants
   // a shifted image, it will shift it from there using the localMatrix.
-  const float adjusted_x =
-      phase.X() + subset_rect.X() * scale_src_to_dest.Width();
+  const float adjusted_x = phase.X() + subset_rect.X() * oriented_scale.Width();
   const float adjusted_y =
-      phase.Y() + subset_rect.Y() * scale_src_to_dest.Height();
+      phase.Y() + subset_rect.Y() * oriented_scale.Height();
   local_matrix.setTranslate(SkFloatToScalar(adjusted_x),
                             SkFloatToScalar(adjusted_y));
 
   // Apply the scale to have the subset correctly fill the destination.
-  local_matrix.preScale(scale_src_to_dest.Width(), scale_src_to_dest.Height());
+  local_matrix.preScale(oriented_scale.Width(), oriented_scale.Height());
 
   // Fetch this now as subsetting may swap the image.
   auto image_id = image.stable_id();
 
   const FloatSize tile_size(
-      subset_rect.Width() * scale_src_to_dest.Width() + repeat_spacing.Width(),
-      subset_rect.Height() * scale_src_to_dest.Height() +
-          repeat_spacing.Height());
+      subset_rect.Width() * oriented_scale.Width() + repeat_spacing.Width(),
+      subset_rect.Height() * oriented_scale.Height() + repeat_spacing.Height());
   const auto tmx = ComputeTileMode(dest_rect.X(), dest_rect.MaxX(), adjusted_x,
                                    adjusted_x + tile_size.Width());
   const auto tmy = ComputeTileMode(dest_rect.Y(), dest_rect.MaxY(), adjusted_y,
@@ -273,8 +287,8 @@
       context.ComputeFilterQuality(this, dest_rect, FloatRect(subset_rect));
   sk_sp<PaintShader> tile_shader = CreatePatternShader(
       image, local_matrix, quality_to_use, context.ShouldAntialias(),
-      FloatSize(repeat_spacing.Width() / scale_src_to_dest.Width(),
-                repeat_spacing.Height() / scale_src_to_dest.Height()),
+      FloatSize(repeat_spacing.Width() / oriented_scale.Width(),
+                repeat_spacing.Height() / oriented_scale.Height()),
       tmx, tmy, subset_rect);
 
   PaintFlags flags = context.FillFlags();
diff --git a/third_party/blink/renderer/platform/graphics/image.h b/third_party/blink/renderer/platform/graphics/image.h
index 93402261..23c0c96 100644
--- a/third_party/blink/renderer/platform/graphics/image.h
+++ b/third_party/blink/renderer/platform/graphics/image.h
@@ -30,7 +30,7 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "third_party/blink/public/common/web_preferences/image_animation_policy.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
 #include "third_party/blink/renderer/platform/geometry/float_point.h"
 #include "third_party/blink/renderer/platform/geometry/float_size.h"
 #include "third_party/blink/renderer/platform/geometry/int_rect.h"
@@ -155,9 +155,9 @@
   virtual bool MaybeAnimated() { return false; }
 
   // Set animationPolicy
-  virtual void SetAnimationPolicy(web_pref::ImageAnimationPolicy) {}
-  virtual web_pref::ImageAnimationPolicy AnimationPolicy() {
-    return web_pref::kImageAnimationPolicyAllowed;
+  virtual void SetAnimationPolicy(mojom::blink::ImageAnimationPolicy) {}
+  virtual mojom::blink::ImageAnimationPolicy AnimationPolicy() {
+    return mojom::blink::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
   }
 
   // Advances an animated image. For BitmapImage (e.g., animated gifs) this
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
index b1050ec..e2208ee 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
@@ -41,7 +41,7 @@
 
 const char* ImageAcceptHeader() {
   static constexpr char kImageAcceptHeaderWithAvif[] =
-      "image/avif,image/webp,image/apng,image/*,*/*;q=0.8";
+      "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8";
   static constexpr size_t kOffset = sizeof("image/avif,") - 1;
 #if BUILDFLAG(ENABLE_AV1_DECODER)
   static const char* header = base::FeatureList::IsEnabled(features::kAVIF)
diff --git a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc
index 5e76fed..8fbc532 100644
--- a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc
+++ b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc
@@ -91,10 +91,13 @@
   if (text.Is8Bit()) {
     String text16_bit = text.ToString();
     text16_bit.Ensure16Bit();
-    hyphenator_->hyphenate(&result, text16_bit.Characters16(),
-                           text16_bit.length());
+    hyphenator_->hyphenate(
+        &result, reinterpret_cast<const uint16_t*>(text16_bit.Characters16()),
+        text16_bit.length());
   } else {
-    hyphenator_->hyphenate(&result, text.Characters16(), text.length());
+    hyphenator_->hyphenate(
+        &result, reinterpret_cast<const uint16_t*>(text.Characters16()),
+        text.length());
   }
   return result;
 }
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 91e088a2..3361c99 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -196,6 +196,8 @@
 
 crbug.com/845267 [ Mac ] http/tests/inspector-protocol/page/page-lifecycleEvents.js [ Failure Pass ]
 
+crbug.com/1137143 http/tests/inspector-protocol/runtime/remote-object-id-cross-process.js [ Pass Failure ]
+
 # Looks like a failure to get a paint on time. Test could be changed to use runAfterLayoutAndPaint
 # instead of a timeout, which may fix things.
 crbug.com/713049 images/color-profile-reflection.html [ Failure Pass ]
@@ -317,9 +319,6 @@
 
 crbug.com/1018273 [ Mac ] compositing/gestures/gesture-tapHighlight-2-iframe-scrolled-inner.html [ Failure ]
 
-# Fails due to lack of support for image orientation in tiling shaders.
-crbug.com/1066634 external/wpt/css/css-images/image-orientation/image-orientation-background-properties.html [ Failure ]
-
 # Requires support of the image-resolution CSS property
 crbug.com/1086473 external/wpt/css/css-images/image-resolution/* [ Skip ]
 
@@ -343,6 +342,7 @@
 crbug.com/997202 external/wpt/css/css-images/image-orientation/svg-image-orientation-none.html [ Failure ]
 crbug.com/997202 external/wpt/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html [ Failure ]
 crbug.com/997202 external/wpt/css/css-images/image-orientation/image-orientation-background-position.html [ Failure ]
+crbug.com/997202 external/wpt/css/css-images/image-orientation/image-orientation-background-properties.html [ Failure ]
 
 # Ref results are wrong on the background and list case, not sure on border result
 crbug.com/1076121 external/wpt/css/css-images/image-orientation/image-orientation-list-style-image.html [ Failure ]
@@ -1283,6 +1283,42 @@
 crbug.com/929098 external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-change-checkbox.html [ Failure ]
 crbug.com/929098 virtual/dark-color-scheme/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-change-checkbox.html [ Pass ]
 
+# color() function not implemented
+crbug.com/1068610 external/wpt/css/css-color/predefined-008.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-010.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-015.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-005.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-014.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-002.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-016.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-001.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-011.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-013.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-012.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-007.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-007.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-011.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-014.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-004.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-006.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-002.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-012.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-017.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-009.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-013.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-016.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-001.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-006.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-004.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-008.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-017.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-005.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-015.html [ Failure ]
+crbug.com/1068610 virtual/system-color-compute/external/wpt/css/css-color/predefined-003.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-009.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-010.html [ Failure ]
+crbug.com/1068610 external/wpt/css/css-color/predefined-003.html [ Failure ]
+
 # ====== Style team owned tests to here ======
 
 # ====== Form Controls Refresh (chrome://flags/#form-controls-refresh) failures from here ======
@@ -2401,7 +2437,6 @@
 crbug.com/1067277 external/wpt/css/css-content/element-replacement-on-replaced-element.tentative.html [ Failure ]
 crbug.com/1069300 external/wpt/css/css-pseudo/active-selection-063.html [ Failure ]
 crbug.com/1108711 external/wpt/css/css-pseudo/active-selection-057.html [ Failure ]
-crbug.com/1110393 external/wpt/css/css-pseudo/active-selection-021.html [ Failure ]
 crbug.com/1110399 external/wpt/css/css-pseudo/active-selection-031.html [ Failure ]
 crbug.com/1110401 external/wpt/css/css-pseudo/active-selection-045.html [ Failure ]
 crbug.com/1024156 external/wpt/css/css-pseudo/active-selection-027.html [ Failure ]
@@ -2571,40 +2606,6 @@
 crbug.com/626703 external/wpt/css/css-images/image-orientation/image-orientation-none-cross-origin-canvas.html [ Failure ]
 crbug.com/626703 external/wpt/infrastructure/testdriver/actions/iframe.html [ Timeout ]
 crbug.com/626703 external/wpt/infrastructure/testdriver/actions/crossOrigin.sub.html [ Timeout ]
-crbug.com/626703 external/wpt/css/css-color/predefined-008.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-010.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-015.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-005.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-014.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-002.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-016.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-011.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-013.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-012.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-007.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-007.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-011.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-014.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-004.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-006.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-002.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-012.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-017.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-009.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-013.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-016.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-006.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-004.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-008.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-017.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-005.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-015.html [ Failure ]
-crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-009.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-010.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-color/predefined-003.html [ Failure ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/html/semantics/embedded-content/media-elements/preserves-pitch.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-during-and-after-dispatch.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-backgrounds/border-image-slice-007.htm [ Failure ]
diff --git a/third_party/blink/web_tests/android/ChromiumWPTExpectations b/third_party/blink/web_tests/android/ChromiumWPTExpectations
index d6c70c0..e92b642 100644
--- a/third_party/blink/web_tests/android/ChromiumWPTExpectations
+++ b/third_party/blink/web_tests/android/ChromiumWPTExpectations
@@ -3031,12 +3031,12 @@
 crbug.com/1050754 external/wpt/mediacapture-fromelement/idlharness.window.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/ImageCapture-MediaTrackSupportedConstraints.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getSettings.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getSettings.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/getPhotoCapabilities.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/getPhotoSettings.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/setOptions-reject.html [ Failure ]
diff --git a/third_party/blink/web_tests/android/WeblayerWPTExpectations b/third_party/blink/web_tests/android/WeblayerWPTExpectations
index 6d83161..fa1034a 100644
--- a/third_party/blink/web_tests/android/WeblayerWPTExpectations
+++ b/third_party/blink/web_tests/android/WeblayerWPTExpectations
@@ -2934,12 +2934,12 @@
 crbug.com/1050754 external/wpt/mediacapture-fromelement/idlharness.window.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/ImageCapture-MediaTrackSupportedConstraints.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getSettings.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getSettings.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/getPhotoCapabilities.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/getPhotoSettings.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/setOptions-reject.html [ Failure ]
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations
index e902c23..d89229c2 100644
--- a/third_party/blink/web_tests/android/WebviewWPTExpectations
+++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -3142,12 +3142,12 @@
 crbug.com/1050754 external/wpt/mediacapture-fromelement/idlharness.window.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/ImageCapture-MediaTrackSupportedConstraints.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast.html [ Failure ]
-crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getSettings.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html [ Failure ]
+crbug.com/1050754 external/wpt/mediacapture-image/MediaStreamTrack-getSettings.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/getPhotoCapabilities.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/getPhotoSettings.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-image/setOptions-reject.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index d3ecfa1..21ae986 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -224708,7 +224708,7 @@
      "widgets": {
       "appearance": {
        "default-styles-expected.txt": [
-        "3617545f255149bcd355cb0a2c6030aea55c1906",
+        "f2b7d4027f11935dfffab45453b644a4e696c281",
         []
        ]
       },
@@ -231174,7 +231174,7 @@
     ]
    },
    "lint.ignore": [
-    "5bcb811df36051225f60efa903f7f1e4cd7eda29",
+    "fe2933bb8a31cb7d5a8c39eee06626f1c7b261ac",
     []
    ],
    "loading": {
@@ -232670,14 +232670,6 @@
      "1b4fef5e5a19ed3d7e61320bfa752a19da1f595a",
      []
     ],
-    "MediaStreamTrack-applyConstraints-fast-expected.txt": [
-     "d6120da5694b15623fc71b6ff203fbc063f6a089",
-     []
-    ],
-    "MediaStreamTrack-getConstraints-fast-expected.txt": [
-     "9b9d77c3b7b55e69e58d6d80f834cbccd6767d39",
-     []
-    ],
     "resources": {
      "imagecapture-helpers.js": [
       "8301b1c2b64ad5567d13b33be7a37d04ed89fdaf",
@@ -237118,7 +237110,7 @@
       []
      ],
      "mock-imagecapture.js": [
-      "ce2b968391343339a9958100f564fa73d5c01509",
+      "035b5241ae989161bfc604b5607a81734a9bdb8d",
       []
      ],
      "mock-screenenumeration.js": [
@@ -242344,19 +242336,19 @@
       []
      ],
      "cacert.key": [
-      "7b83e8f0e9ebe229c83335b3a2f0632540942ed2",
+      "3a3e487a83de0f5676e481e7240b68107b7ee34e",
       []
      ],
      "cacert.pem": [
-      "a8ce54be5579b743001fa0de3c163129965d356c",
+      "e9b5fda55c380cf8850f4b94524b62055c9ca360",
       []
      ],
      "web-platform.test.key": [
-      "c4f5dc3f2cfba081e4536708c4667e7595e09d74",
+      "957dfb234f8b90ebb40a1fb48d58623875f2e03d",
       []
      ],
      "web-platform.test.pem": [
-      "438f504b2b696757ea292e3c53ea0f0baa1fdd23",
+      "61d7e4d189266500efb379da960eafbb38aca530",
       []
      ]
     },
@@ -242777,7 +242769,7 @@
      []
     ],
     "requirements_mypy.txt": [
-     "fae3597764cc04e1c35772efb7cec648bc6111a3",
+     "65100d70376cf614b4396dd242181394453efa49",
      []
     ],
     "runner": {
@@ -248648,7 +248640,7 @@
         []
        ],
        "chrome_spki_certs.py": [
-        "289453bd080959445ea5a452362b05a7675735e4",
+        "c6e583581882dbabe817600b1f1047e48a0d1dcb",
         []
        ],
        "edge.py": [
@@ -372609,14 +372601,14 @@
      ]
     ],
     "MediaStreamTrack-applyConstraints-fast.html": [
-     "00c2f1274e8ff5bbed613337f6caed9cadc38439",
+     "5c5d3e119b77bd68cf90698bc89b943de92639d9",
      [
       null,
       {}
      ]
     ],
-    "MediaStreamTrack-applyConstraints-getSettings.html": [
-     "2ae3a87af2312a5c9045a378f5bf6d9113c21baa",
+    "MediaStreamTrack-applyConstraints-getSettings.https.html": [
+     "db0e1ea09f212591de6b8c5895c402e4ef355983",
      [
       null,
       {
@@ -372624,8 +372616,8 @@
       }
      ]
     ],
-    "MediaStreamTrack-applyConstraints-reject.html": [
-     "02ba251fc9f12265f58cd21b93875945700ed0c1",
+    "MediaStreamTrack-applyConstraints-reject.https.html": [
+     "395ef17ca8bb264191c1618669f9b6e4606cae26",
      [
       null,
       {
@@ -372633,8 +372625,8 @@
       }
      ]
     ],
-    "MediaStreamTrack-applyConstraints.html": [
-     "3c5c05aefa05d878b07f927eea600af75598d497",
+    "MediaStreamTrack-applyConstraints.https.html": [
+     "e5466ede04a31abf483bf08b62609bea7f032716",
      [
       null,
       {
@@ -372649,8 +372641,8 @@
       {}
      ]
     ],
-    "MediaStreamTrack-getCapabilities.html": [
-     "d0b7c2a3f204f3a108d7dc15696df2904373292c",
+    "MediaStreamTrack-getCapabilities.https.html": [
+     "8d22ad20949b4819b11c60e6ba86d01a91a5be67",
      [
       null,
       {
@@ -372658,11 +372650,13 @@
       }
      ]
     ],
-    "MediaStreamTrack-getConstraints-fast.html": [
-     "06a09feecdd5bc72ce4a1643b98170e482549a70",
+    "MediaStreamTrack-getConstraints.https.html": [
+     "18cb9dba9780089598fcea26c0947f48aadf31ba",
      [
       null,
-      {}
+      {
+       "testdriver": true
+      }
      ]
     ],
     "MediaStreamTrack-getSettings-fast.html": [
@@ -372672,8 +372666,8 @@
       {}
      ]
     ],
-    "MediaStreamTrack-getSettings.html": [
-     "747eff8937d923b25c72e2ecd3c18967905f71a1",
+    "MediaStreamTrack-getSettings.https.html": [
+     "907991d152240414528ce244f15cd0cd12b780f4",
      [
       null,
       {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-021.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-021.html
index 2061385d..bfa7eee 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-021.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-021.html
@@ -7,6 +7,7 @@
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
   <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling">
   <link rel="match" href="reference/active-selection-021-ref.html">
+  <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 
   <meta content="" name="flags">
 
@@ -14,7 +15,7 @@
   div
     {
       color: red;
-      font-size: 300%;
+      font: 25px/1 Ahem;
       text-decoration: underline overline line-through;
     }
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/active-selection-021-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/active-selection-021-ref.html
index 7790a3f..a5d0e4e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/active-selection-021-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/active-selection-021-ref.html
@@ -5,12 +5,13 @@
   <title>CSS Reftest Reference</title>
 
   <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+  <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 
   <style>
   div
     {
       color: green;
-      font-size: 300%;
+      font: 25px/1 Ahem;
       text-decoration: underline overline line-through;
     }
   </style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/interaction-with-nested-pseudo-class-ref.html b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/interaction-with-nested-pseudo-class-ref.html
new file mode 100644
index 0000000..e3b99d4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/interaction-with-nested-pseudo-class-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<button style="color:green">Should be green on focus</button>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/interaction-with-nested-pseudo-class.html b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/interaction-with-nested-pseudo-class.html
new file mode 100644
index 0000000..1061e4b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/interaction-with-nested-pseudo-class.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>CSS Shadow Parts - Nested Pseudo Classes</title>
+<link rel="help" href="https://drafts.csswg.org/css-shadow-parts" >
+<link rel="help" href="https://drafts.csswg.org/selectors/#matches">
+<link href="https://drafts.csswg.org/selectors/#matches" rel="help">
+<link rel="match" href="interaction-with-nested-pseudo-class-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<style>
+  :root { color: red; }
+  ::part(test):is(:focus) { color: green; }
+</style>
+<div id=host></div>
+<script>
+  const root = host.attachShadow({mode: 'closed'});
+  root.innerHTML = '<button part=test>Should be green on focus</button>';
+  const button = root.querySelector('button');
+  button.addEventListener('focus', takeScreenshot);
+  test_driver.bless('focus button', () => button.focus());
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-color-selection-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-color-selection-001-ref.html
new file mode 100644
index 0000000..d9811874e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-color-selection-001-ref.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>CSS Test: CSS3 text-decoration-color when |::selection| exists</title>
+        <style>
+            #transparent-fill {
+                -webkit-text-fill-color: transparent;
+                -webkit-text-stroke-width: 1px;
+                -webkit-text-stroke-color: black;
+            }
+
+            .underline {
+                text-decoration: underline;
+                color: brown;
+                text-decoration-color: pink;
+            }
+            .overline {
+                text-decoration: overline;
+                color: purple;
+                text-decoration-color: skyblue;
+            }
+            .line-through {
+                text-decoration: line-through;
+                color: orange;
+                text-decoration-color: magenta;
+            }
+
+            .line-through::selection {
+                overflow: auto;
+                text-decoration-color: inherit;
+            }
+
+            .empty-selection-underline {
+                text-decoration: underline;
+                color: red;
+                text-decoration-color: blue;
+            }
+
+            .margin-bottom {
+                margin-bottom: 20px;
+            }
+        </style>
+        <script>
+            function startTest() {
+                var targetRange = document.createRange();
+                /* We first create an empty range */
+                targetRange.selectNodeContents(document.getElementById("wrapper"));
+                /* Then we set the range boundaries to the children of div#wrapper */
+                window.getSelection().addRange(targetRange);
+                /* Finally, we now select such range of content */
+            }
+        </script>
+    </head>
+    <body onload="startTest();">
+        <h3>Each line of this test should match its text decoration color description:</h3>
+
+        <!-- Test with text-fill-color and text-stroke-color values set -->
+        <div class="underline margin-bottom" id="transparent-fill" >Transparent fill with black stroke text and pink underline</div>
+
+        <!-- Valid values for underline, overline and line-through text decoration lines when selected-->
+        <div class="underline margin-bottom">Brown text with pink underline</div>
+        <div class="overline margin-bottom">Purple text with skyblue overline</div>
+
+        <div id="wrapper">
+            <div class="line-through margin-bottom">Orange text with magenta line-through</div>
+
+            <!-- When there is a selection but no |::selection| style exists. It should preserve the
+                style as it is. -->
+            <div class="empty-selection-underline margin-bottom">Red text with blue underline</div>
+        </div>
+    </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-color-selection-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-color-selection-001.html
new file mode 100644
index 0000000..beababc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-color-selection-001.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>CSS Test: CSS3 text-decoration-color when |::selection| exists</title>
+        <link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-decoration-color-property">
+        <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling">
+        <link rel="match" href="reference/text-decoration-color-selection-001-ref.html">
+        <style>
+            #transparent-fill {
+                -webkit-text-fill-color: transparent;
+                -webkit-text-stroke-width: 1px;
+                -webkit-text-stroke-color: black;
+            }
+
+            .underline {
+                text-decoration: underline;
+                color: gray;
+                text-decoration-color: blue;
+            }
+            .overline {
+                text-decoration: overline;
+                color: green;
+                text-decoration-color: black;
+            }
+            .line-through {
+                text-decoration: line-through;
+                color: violet;
+                text-decoration-color: gold;
+            }
+            .underline::selection {
+                color: brown;
+                text-decoration-color: pink;
+            }
+            .overline::selection {
+                color: purple;
+                text-decoration-color: skyblue;
+            }
+            .line-through::selection {
+                color: orange;
+                text-decoration-color: magenta;
+            }
+
+            .empty-selection-underline {
+                text-decoration: underline;
+                color: red;
+                text-decoration-color: blue;
+            }
+
+            .margin-bottom {
+                margin-bottom: 20px;
+            }
+        </style>
+        <script>
+            function startTest() {
+                var targetRange = document.createRange();
+                /* We first create an empty range */
+                targetRange.selectNodeContents(document.getElementById("wrapper"));
+                /* Then we set the range boundaries to the children of div#wrapper */
+                window.getSelection().addRange(targetRange);
+                /* Finally, we now select such range of content */
+            }
+        </script>
+    </head>
+    <body onload="startTest();">
+        <h3>Each line of this test should match its text decoration color description:</h3>
+
+        <div id="wrapper">
+            <!-- Test with text-fill-color and text-stroke-color values set -->
+            <div class="underline margin-bottom" id="transparent-fill" >Transparent fill with black stroke text and pink underline</div>
+
+            <!-- Valid values for underline, overline and line-through text decoration lines when selected-->
+            <div class="underline margin-bottom">Brown text with pink underline</div>
+            <div class="overline margin-bottom">Purple text with skyblue overline</div>
+            <div class="line-through margin-bottom">Orange text with magenta line-through</div>
+
+            <!-- When there is a selection but no |::selection| style exists. It should preserve the
+                 style as it is. -->
+            <div class="empty-selection-underline margin-bottom">Red text with blue underline</div>
+        </div>
+    </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-color-selection-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-color-selection-002.html
new file mode 100644
index 0000000..1ee903c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-color-selection-002.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>CSS Test: CSS3 text-decoration-color when |::selection| exists</title>
+        <link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-decoration-color-property">
+        <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling">
+        <style>
+            .first-underline {
+                text-decoration: underline;
+                text-decoration-color: blue;
+            }
+            .second-underline {
+                text-decoration: underline;
+                text-decoration-color: gold;
+            }
+            .third-underline {
+                text-decoration: underline;
+                text-decoration-color: green;
+            }
+            .first-underline::selection {
+                text-decoration: underline;
+                text-decoration-color: pink;
+            }
+            .second-underline::selection {
+                text-decoration: underline;
+                text-decoration-color: violet;
+            }
+            .third-underline::selection {
+                text-decoration: underline;
+                text-decoration-color: skyblue;
+            }
+
+            .blue-underline {
+                text-decoration: underline;
+                text-decoration-color: blue;
+            }
+            .gold-overline {
+                text-decoration: overline;
+                text-decoration-color: gold;
+            }
+            .green-line-through {
+                text-decoration: line-through;
+                text-decoration-color: green;
+            }
+            .blue-underline::selection {
+                text-decoration: underline;
+                text-decoration-color: pink;
+            }
+            .gold-overline::selection {
+                text-decoration: overline;
+                text-decoration-color: violet;
+            }
+            .green-line-through::selection {
+                text-decoration: line-through;
+                text-decoration-color: skyblue;
+            }
+        </style>
+         <script>
+            function startTest() {
+                var targetRange = document.createRange();
+                /* We first create an empty range */
+                targetRange.selectNodeContents(document.getElementById("wrapper"));
+                /* Then we set the range boundaries to the children of div#wrapper */
+                window.getSelection().addRange(targetRange);
+                /* Finally, we now select such range of content */
+            }
+        </script>
+    </head>
+    <body onload="startTest();">
+        <div id="wrapper">
+            <h3>Each line of this test should match its text decoration color description:</h3>
+
+            <!-- Nested same text-decoration-line with different text-decoration-color.
+                 It should be affected by their parent |::selection| -->
+            <div>
+                <span class="first-underline">
+                    First pink underline
+                    <span class="second-underline">
+                        Second violet underline
+                        <span class="third-underline">Third skyblue underline</span>
+                    </span>
+                </span>
+            </div><br/>
+
+            <!-- Mix of underline, overline and line-through with different colors for each.
+                 It should be affected by their parent |::selection| -->
+            <div>
+                <span class="blue-underline">
+                    pink underline
+                    <span class="green-line-through">
+                        blue underline, skyblue line-through
+                        <span class="gold-overline">blue underline, green line-through, violet overline</span>
+                    </span>
+                </span>
+            </div><br/>
+
+            <!-- Test behavior on subscript and superscript text -->
+            <div>
+                <span class="green-line-through">
+                    <sub class="gold-overline">subscript text, violet overline, green line-through</sub>
+                    skyblue line-through
+                    <sup class="blue-underline">superscript text, pink underline, green line-through</sup>
+                </span>
+            </div><br/>
+        </div>
+    </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/default-styles-expected.txt b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/default-styles-expected.txt
index 3617545f..f2b7d40 100644
--- a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/default-styles-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/default-styles-expected.txt
@@ -14,17 +14,17 @@
 FAIL <input type="datetime-local"> assert_equals: -webkit-appearance expected "auto" but got "textfield"
 FAIL <input type="number"> assert_equals: -webkit-appearance expected "auto" but got "textfield"
 FAIL <input type="range"> assert_equals: -webkit-appearance expected "auto" but got "slider-horizontal"
-FAIL <input type="color"> assert_equals: -webkit-appearance expected "auto" but got "square-button"
-FAIL <input type="checkbox"> assert_equals: -webkit-appearance expected "auto" but got "checkbox"
-FAIL <input type="radio"> assert_equals: -webkit-appearance expected "auto" but got "radio"
-FAIL <input type="submit"> assert_equals: -webkit-appearance expected "auto" but got "push-button"
-FAIL <input type="reset"> assert_equals: -webkit-appearance expected "auto" but got "push-button"
-FAIL <input type="button"> assert_equals: -webkit-appearance expected "auto" but got "push-button"
+PASS <input type="color">
+PASS <input type="checkbox">
+PASS <input type="radio">
+PASS <input type="submit">
+PASS <input type="reset">
+PASS <input type="button">
 FAIL <input type="unknowntype"> assert_equals: -webkit-appearance expected "auto" but got "textfield"
 FAIL <select> assert_equals: -webkit-appearance expected "auto" but got "menulist"
 FAIL <select multiple=""> assert_equals: -webkit-appearance expected "auto" but got "listbox"
 FAIL <select size="2"> assert_equals: -webkit-appearance expected "auto" but got "listbox"
-FAIL <button> assert_equals: -webkit-appearance expected "auto" but got "button"
+PASS <button>
 FAIL <textarea> assert_equals: -webkit-appearance expected "auto" but got "textarea"
 PASS <meter>
 PASS <progress>
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore
index 5bcb811d..fe2933b 100644
--- a/third_party/blink/web_tests/external/wpt/lint.ignore
+++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -265,10 +265,10 @@
 GENERATE_TESTS: domparsing/createContextualFragment.html
 GENERATE_TESTS: domxpath/001.html
 GENERATE_TESTS: domxpath/002.html
-GENERATE_TESTS: mediacapture-image/MediaStreamTrack-applyConstraints-reject.html
-GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getCapabilities.html
-GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getConstraints-fast.html
-GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getSettings.html
+GENERATE_TESTS: mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html
+GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getCapabilities.https.html
+GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getConstraints.https.html
+GENERATE_TESTS: mediacapture-image/MediaStreamTrack-getSettings.https.html
 GENERATE_TESTS: mediacapture-image/setOptions-reject.html
 GENERATE_TESTS: html/semantics/scripting-1/the-template-element/template-element/template-as-a-descendant.html
 GENERATE_TESTS: html/syntax/parsing/Document.getElementsByTagName-foreign-01.html
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast-expected.txt b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast-expected.txt
deleted file mode 100644
index d6120da..0000000
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-PASS MediaStreamTrack.applyConstraints()
-PASS MediaStreamTrack.applyConstraints({advanced: []})
-PASS MediaStreamTrack.applyConstraints() with unsupported constraint
-FAIL MediaStreamTrack.applyConstraints() with non Image-Capture constraint promise_rejects_js: function "function OverconstrainedError() { [native code] }" is not an Error subtype
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html
index 00c2f12..5c5d3e1 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-fast.html
@@ -59,21 +59,4 @@
       videoTrack.applyConstraints({advanced : [ {torch : true} ]}));
 }, 'MediaStreamTrack.applyConstraints() with unsupported constraint');
 
-// This test verifies that applyConstraints() rejects the returned Promise if
-// passed mixed ImageCapture and non-ImageCapture constraints.
-// TODO(mcasas): remove entirely after https://crbug.com/338503.
-promise_test(function(t) {
-  var canvas = document.getElementById('canvas');
-  var context = canvas.getContext("2d");
-  context.fillStyle = "red";
-  context.fillRect(0, 0, 10, 10);
-
-  var stream = canvas.captureStream();
-  var videoTrack = stream.getVideoTracks()[0];
-
-  return promise_rejects_js(
-      t, OverconstrainedError,
-      videoTrack.applyConstraints({advanced : [ {width : 640, torch: true} ]}));
-}, 'MediaStreamTrack.applyConstraints() with non Image-Capture constraint');
-
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.https.html
similarity index 78%
rename from third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html
rename to third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.https.html
index 2ae3a87..db0e1ea 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.https.html
@@ -4,9 +4,6 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
 <script>
 
 // This test verifies that the |constraints| configured in the mock Mojo
@@ -16,11 +13,6 @@
   await test_driver.set_permission({name: 'camera', panTiltZoom: true},
         'granted', false);
 
-  let canvas = document.getElementById('canvas');
-  let context = canvas.getContext('2d');
-  context.fillStyle = 'red';
-  context.fillRect(0, 0, 10, 10);
-
   const constraints = { advanced : [{ whiteBalanceMode : 'single-shot',
                                       exposureMode     : 'manual',
                                       focusMode        : 'single-shot',
@@ -47,16 +39,9 @@
                                       torch                : true
                                     }]};
 
-  let stream = canvas.captureStream();
+  let stream = await navigator.mediaDevices.getUserMedia({video: true});
   let videoTrack = stream.getVideoTracks()[0];
 
-  // |videoTrack|'s capabilities gathering, just like the actual capture, is
-  // a process kicked off right after creation, we introduce a small delay
-  // to allow for those to be collected, since they are needed to understand
-  // which constraints are supported in applyConstraints().
-  // TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
-  await new Promise(resolve => step_timeout(resolve, 100));
-
   try {
     await videoTrack.applyConstraints(constraints);
   } catch (error) {
@@ -113,21 +98,9 @@
   await test_driver.set_permission({name: 'camera', panTiltZoom: true},
       'denied', false);
 
-  let canvas = document.getElementById('canvas');
-  let context = canvas.getContext('2d');
-  context.fillStyle = 'red';
-  context.fillRect(0, 0, 10, 10);
-
-  let stream = canvas.captureStream();
+  let stream = await navigator.mediaDevices.getUserMedia({video: true});
   let videoTrack = stream.getVideoTracks()[0];
 
-  // |videoTrack|'s capabilities gathering, just like the actual capture, is
-  // a process kicked off right after creation, we introduce a small delay
-  // to allow for those to be collected, since they are needed to understand
-  // which constraints are supported in applyConstraints().
-  // TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
-  await new Promise(resolve => step_timeout(resolve, 100));
-
   const constraints = [{ pan: 8 }, { tilt: 9 }];
   await Promise.all(constraints.map(async constraint =>
     promise_rejects_dom(
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html
similarity index 81%
rename from third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.html
rename to third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html
index 02ba251f..395ef17 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.html
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints-reject.https.html
@@ -4,16 +4,8 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
 <script>
 
-var canvas = document.getElementById('canvas');
-var context = canvas.getContext('2d');
-context.fillStyle = 'red';
-context.fillRect(0, 0, 10, 10);
-
 // This test verifies that MediaStreamTrack.applyConstraints() rejects if any
 // passed constraint is unsupported or outside its allowed range.
 var makePromiseTest = function(getConstraint) {
@@ -23,16 +15,9 @@
 
     imageCaptureTest.mockImageCapture().state().supportsTorch = false;
 
-    let stream = canvas.captureStream();
+    let stream = await navigator.mediaDevices.getUserMedia({video: true});
     let videoTrack = stream.getVideoTracks()[0];
 
-    // |videoTrack|'s capabilities gathering, just like the actual capture,
-    // is a process kicked off right after creation, we introduce a small
-    // delay to allow for those to be collected, since they are needed to
-    // understand which constraints are supported in applyConstraints().
-    // TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
-    await new Promise(resolve => step_timeout(resolve, 100));
-
     try {
       const constraints = {
         advanced : [ getConstraint(imageCaptureTest.mockImageCapture().state()) ]
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.https.html
similarity index 87%
rename from third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.html
rename to third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.https.html
index 3c5c05ae..e5466ed 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.html
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-applyConstraints.https.html
@@ -4,9 +4,6 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
 <script>
 
 const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];
@@ -18,11 +15,6 @@
   await test_driver.set_permission({name: 'camera', panTiltZoom: true},
         'granted', false);
 
-  let canvas = document.getElementById('canvas');
-  let context = canvas.getContext('2d');
-  context.fillStyle = 'red';
-  context.fillRect(0, 0, 10, 10);
-
   const constraints = { advanced : [{ whiteBalanceMode : 'single-shot',
                                       exposureMode     : 'manual',
                                       focusMode        : 'single-shot',
@@ -48,16 +40,9 @@
                                       torch                : true
                                     }]};
 
-    let stream = canvas.captureStream();
+    let stream = await navigator.mediaDevices.getUserMedia({video: true});
     let videoTrack = stream.getVideoTracks()[0];
 
-    // |videoTrack|'s capabilities gathering, just like the actual capture, is
-    // a process kicked off right after creation, we introduce a small delay
-    // to allow for those to be collected, since they are needed to understand
-    // which constraints are supported in applyConstraints().
-    // TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
-    await new Promise(resolve => step_timeout(resolve, 100));
-
     try {
       await videoTrack.applyConstraints(constraints);
     } catch (error) {
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.https.html
similarity index 91%
rename from third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.html
rename to third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.https.html
index d0b7c2a..8d22ad2 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.html
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getCapabilities.https.html
@@ -4,9 +4,6 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
 <script>
 
 const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];
@@ -21,28 +18,17 @@
     await test_driver.set_permission({name: 'camera', panTiltZoom: true},
         ptzPermission, false);
 
-    let canvas = document.getElementById('canvas');
-    let context = canvas.getContext('2d');
-    context.fillStyle = 'red';
-    context.fillRect(0, 0, 10, 10);
-
     let mockCapabilities = imageCaptureTest.mockImageCapture().state();
 
     // |stream| must be created _after_ |mock| is constructed to give the
     // latter time to override the bindings.
-    let stream = canvas.captureStream();
+    let stream = await navigator.mediaDevices.getUserMedia({video: true});
     assert_equals(stream.getAudioTracks().length, 0);
     assert_equals(stream.getVideoTracks().length, 1);
 
     let videoTrack = stream.getVideoTracks()[0];
     assert_equals(typeof videoTrack.getCapabilities, 'function');
 
-    // |videoTrack|'s capabilities gathering, just like the actual capture, is
-    // a process kicked off right after creation, we introduce a small delay
-    // to allow for those to be collected.
-    // TODO(mcasas): this shouldn't be needed, https://crbug.com/711524.
-    await new Promise(resolve => step_timeout(resolve, 100));
-
     let capabilities = videoTrack.getCapabilities();
     assert_equals(typeof capabilities, 'object');
 
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast-expected.txt b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast-expected.txt
deleted file mode 100644
index 9b9d77c..0000000
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast-expected.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-This is a testharness.js-based test.
-PASS MediaStreamTrack.getConstraints(), key: whiteBalanceMode
-FAIL MediaStreamTrack-getConstraints-fast assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: exposureMode
-FAIL MediaStreamTrack-getConstraints-fast 1 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: focusMode
-FAIL MediaStreamTrack-getConstraints-fast 2 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: exposureCompensation
-FAIL MediaStreamTrack-getConstraints-fast 3 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: exposureTime
-FAIL MediaStreamTrack-getConstraints-fast 4 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: colorTemperature
-FAIL MediaStreamTrack-getConstraints-fast 5 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: iso
-FAIL MediaStreamTrack-getConstraints-fast 6 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: brightness
-FAIL MediaStreamTrack-getConstraints-fast 7 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: contrast
-FAIL MediaStreamTrack-getConstraints-fast 8 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: saturation
-FAIL MediaStreamTrack-getConstraints-fast 9 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: sharpness
-FAIL MediaStreamTrack-getConstraints-fast 10 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: focusDistance
-FAIL MediaStreamTrack-getConstraints-fast 11 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: pan
-FAIL MediaStreamTrack-getConstraints-fast 12 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: tilt
-FAIL MediaStreamTrack-getConstraints-fast 13 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), key: zoom
-FAIL MediaStreamTrack-getConstraints-fast 14 assert_object_equals: constraints expected property "advanced" missing
-PASS MediaStreamTrack.getConstraints(), complete 
-FAIL MediaStreamTrack-getConstraints-fast 15 assert_object_equals: constraints expected property "advanced" missing
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast.html
deleted file mode 100644
index 06a09fe..0000000
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints-fast.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
-<script>
-
-const constraints = { whiteBalanceMode     : "manual",
-                      exposureMode         : "manual",
-                      focusMode            : "single-shot",
-
-                      exposureCompensation : 133.77,
-                      exposureTime         : 10000, // in nano-seconds.
-                      colorTemperature     : 6000,
-                      iso                  : 120.0,
-
-                      brightness           : 3,
-                      contrast             : 4,
-                      saturation           : 5,
-                      sharpness            : 6,
-                      focusDistance        : 7,
-
-                      pan                  : 8,
-                      tilt                 : 9,
-
-                      zoom                 : 3.141592
-                      // TODO: torch https://crbug.com/700607.
-                    };
-
-var canvas = document.getElementById('canvas');
-var context = canvas.getContext("2d");
-context.fillStyle = "red";
-context.fillRect(0, 0, 10, 10);
-
-// These tests verify that MediaStreamTrack.getConstraints() exists and that,
-// returns the constraints passed beforehand with applyConstraints.
-var makeAsyncTest = function(c) {
-  async_test(function(t) {
-    var stream = canvas.captureStream();
-    var videoTrack = stream.getVideoTracks()[0];
-
-    const constraintsIn = { advanced : [ c ]};
-
-    // Method applyConstraints() will fail since there is no Image Capture
-    // service in this Layout Test, but |constraintsIn| should be cached.
-    videoTrack.applyConstraints(constraintsIn)
-        .then(() => { /* ignore */ })
-        .catch((e) => { /* ignore */ })
-        .then(t.step_func(() => {
-          const constraintsOut = videoTrack.getConstraints();
-          assert_object_equals(constraintsOut, constraintsIn, "constraints");
-          // Clear constraints by sending an empty constraint set.
-          return videoTrack.applyConstraints({})
-        }))
-        .then(t.step_func(() => {
-          const constraintsOut = videoTrack.getConstraints();
-          assert_object_equals(constraintsOut, {}, "constraints");
-          t.done();
-        }));
-  });
-};
-
-// Send each line of |constraints| in turn and then the whole dictionary.
-for (key in constraints) {
-  var one_constraint = {};
-  one_constraint[key] = constraints[key];
-  generate_tests(
-      makeAsyncTest,
-      [[ 'MediaStreamTrack.getConstraints(), key: ' + key, one_constraint ]]);
-}
-
-generate_tests(makeAsyncTest, [[
-                 'MediaStreamTrack.getConstraints(), complete ', constraints
-               ]]);
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html
new file mode 100644
index 0000000..18cb9db
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
+<script>
+
+const constraints = { whiteBalanceMode     : "single-shot",
+                      exposureMode         : "manual",
+                      focusMode            : "single-shot",
+
+                      exposureCompensation : 133.77,
+                      exposureTime         : 10000, // in nano-seconds.
+                      colorTemperature     : 6000,
+                      iso                  : 120.0,
+
+                      brightness           : 3,
+                      contrast             : 4,
+                      saturation           : 5,
+                      sharpness            : 6,
+                      focusDistance        : 7,
+
+                      pan                  : 8,
+                      tilt                 : 9,
+                      zoom                 : 3.141592
+                      // TODO: torch https://crbug.com/700607.
+                    };
+
+// These tests verify that MediaStreamTrack.getConstraints() exists and that,
+// returns the constraints passed beforehand with applyConstraints.
+function makePromiseTest(constraint) {
+  image_capture_test(async function(t) {
+    await test_driver.set_permission({name: 'camera', panTiltZoom: true},
+        'granted', false);
+
+    let stream = await navigator.mediaDevices.getUserMedia({video: true});
+    let videoTrack = stream.getVideoTracks()[0];
+
+    let constraintsIn = {advanced : [ constraint ]};
+    await videoTrack.applyConstraints(constraintsIn);
+    assert_object_equals(videoTrack.getConstraints(), constraintsIn, "constraints");
+
+    // Clear constraints by sending an empty constraint set.
+    await videoTrack.applyConstraints({});
+    assert_object_equals(videoTrack.getConstraints(), {}, "constraints");
+  });
+};
+
+// Send each line of |constraints| in turn and then the whole dictionary.
+for (key in constraints) {
+  let one_constraint = {};
+  one_constraint[key] = constraints[key];
+  generate_tests(
+      makePromiseTest,
+      [[ 'MediaStreamTrack.getConstraints(), key: ' + key, one_constraint ]]);
+}
+
+generate_tests(makePromiseTest, [
+  ["MediaStreamTrack.getConstraints(), complete ", constraints],
+]);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getSettings.html b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getSettings.https.html
similarity index 92%
rename from third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getSettings.html
rename to third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getSettings.https.html
index 747eff89..907991d 100644
--- a/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getSettings.html
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-image/MediaStreamTrack-getSettings.https.html
@@ -4,9 +4,6 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
-<body>
-<canvas id='canvas' width=10 height=10/>
-</body>
 <script>
 
 const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];
@@ -22,16 +19,11 @@
     await test_driver.set_permission({name: 'camera', panTiltZoom: true},
         ptzPermission, false);
 
-    let canvas = document.getElementById('canvas');
-    let context = canvas.getContext('2d');
-    context.fillStyle = 'red';
-    context.fillRect(0, 0, 10, 10);
-
     let mockSettings = imageCaptureTest.mockImageCapture().state();
 
     // |stream| must be created _after_ |mock| is constructed to give the
     // latter time to override the bindings.
-    let stream = canvas.captureStream();
+    let stream = await navigator.mediaDevices.getUserMedia({video: true});
     let videoTrack = stream.getVideoTracks()[0];
 
     // |videoTrack|s settings retrieval, just like the actual capture, is a
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/mock-imagecapture.js b/third_party/blink/web_tests/external/wpt/resources/chromium/mock-imagecapture.js
index ce2b9683..035b524 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/mock-imagecapture.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/mock-imagecapture.js
@@ -133,6 +133,7 @@
           ],
         }
       };
+      this.panTiltZoomPermissionStatus_ = null;
       this.settings_ = null;
       this.bindingSet_ = new mojo.BindingSet(media.mojom.ImageCapture);
     }
@@ -142,11 +143,24 @@
       this.interceptor_.stop();
     }
 
-    getPhotoState(source_id) {
-      return Promise.resolve(this.state_);
+    async getPhotoState(source_id) {
+      const shouldKeepPanTiltZoom = await this.isPanTiltZoomPermissionGranted();
+      if (shouldKeepPanTiltZoom)
+        return Promise.resolve(this.state_);
+
+      const newState = {...this.state_};
+      newState.state.pan = {};
+      newState.state.tilt = {};
+      newState.state.zoom = {};
+      return Promise.resolve(newState);
     }
 
-    setOptions(source_id, settings) {
+    async setOptions(source_id, settings) {
+      const isAllowedToControlPanTiltZoom = await this.isPanTiltZoomPermissionGranted();
+      if (!isAllowedToControlPanTiltZoom &&
+          (settings.hasPan || settings.hasTilt || settings.hasZoom)) {
+        return Promise.resolve({ success: false });
+      }
       this.settings_ = settings;
       if (settings.hasIso)
         this.state_.state.iso.current = settings.iso;
@@ -219,6 +233,17 @@
       });
     }
 
+    async isPanTiltZoomPermissionGranted() {
+      if (this.panTiltZoomPermissionStatus_) {
+        return (this.panTiltZoomPermissionStatus_.state == "granted");
+      }
+      this.panTiltZoomPermissionStatus_ = await navigator.permissions.query({
+        name: "camera",
+        panTiltZoom: true
+      });
+      return (this.panTiltZoomPermissionStatus_.state == "granted");
+    }
+
     state() {
       return this.state_.state;
     }
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key
index 7b83e8f0..3a3e487 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key
@@ -1,30 +1,30 @@
 -----BEGIN ENCRYPTED PRIVATE KEY-----
-MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIkaenDsgd4ocCAggA
-MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECJAqFIqfz3yoBIIEyJzn9rsqRfFD
-I75CcWTCXZM+f0oTgtBAmx2ZUVn46M9hOq1DGZo1QNcIV53MP+m3QPTwo2AZRsx+
-Q0YobCtHqQRtl3WjLmpWZTA8W/f15A/+N0IQDZy+hxfrYgbhcgT9EhaRMs8NH5Iu
-GaMCmZDNm0RborKLdAtR3EtlFI3WZPejVv5r9HRl6TDHBjpfM+nB3Its11OfUoKO
-QZQyqiAzZpGmwkxPvPVDVk9kKwR6k5ypvANRNS73txQojfDUdLh/Zz2B136Qk8iZ
-f42gI/jbZQD81BT+9t+kfI5BDPYocsGQHSZ/l55NcBPnE3TtfPBWMXJ2T2IrA6LN
-x7C6J5GGwBZ2RYQnim/1tOc6lrx2iGRfBlJa360JfO7jNLyssnChLMeQ1t3KmEN8
-ALxV9jMqN1w58px4qzbj4wVGHIEKb5o1/VhymhwuXBBYY4ztKKv9EKOu+ZMJfPtu
-XILgXUuwnv1jetUXT+SbwVcGj4DoE+LSV7pB65jdmwQePH0icjkFmUXMVW/Pml/J
-KBPuM4Ju4Wxt1+mLXp9maKICK3jJ8Gok2gi5x4axEHx3l8JOAIl+qA5gJ1N24yPl
-1pkJcoEByU1pL32jtDMEn1Isf+pBl9vj5MdKs6EDh+ZrJhovc5puSDfENY1bv/Q6
-IqzLu45TQX6MTqkmGoE8wMJ9MP6otLYEY836+gk5F1cdf9Yw/FiIS3oha8mzj9F3
-BUKZj6ot5/q6Fcr9AQU94hwuJpl7iKAeR3DkDl26lVhbtxtZy0v18bXcqL+iFtMX
-vlc8jAX2Aj8W5OgiAFq069W63Q9pa8HmkAQBoi62yRivJlcXpEoE0hn7en/Hmje1
-58OoiSGHM7c+FyYqBzXJg7j+hU5gn2hKm+PQD+Vyic/TC9mOJozuuOSMd8F94/4q
-2FX9wAyCsyfq6JtJZVjcLu/Xu1h8LfFEyFGDehL6wj1/T3+lkFjc06QY+m7giWmn
-J7ksUZOvZcpV8Z2LGMPZf2h+oOgfQ2df2qKCGz/2e4w5cu3wlZqd3+CxJU9cephZ
-KJl8NRd3LI8SCbVGS21/tRRj65d3jbHgkbN15zbyinWeoggCpKbK/04Pue3aHs77
-NlmPVQyI6Pevl8eJM1YdXrbQCO0zXSg6FdUMm6ACknjRYXgD8rb8HLDj69M5mj5q
-sCayfF0dsh20758w6E6BCtNo1RQyrvIc54SFWBXFwuxfpJmGgbp1jxQSx4ixRZ7i
-zj3JHhlq8ldczaKqiRHhrr3utwVvH5+X9Yw8Bh9wzUrSOFu4TTMPfA7Dl+RjXxg2
-ymX81nv8uSnLc9cnHptug/pIpJh6xBLMcl0rmT7h3hH0u3ahrnu+oAp+M3zNHrsa
-kUxOYe8bn9X2fVqN5rKCQe8OEpczXgtjS5C2DErciIWJhqaUTg3lAfN9xuaz4/KC
-4APc+d7aVMef1tsd3T9JaTdh2KxjgOzE3Af/d+VwOxFMv71+hUXF5zgK/bkg6LPk
-VGiRcShSbM7VbcAaCBMqY/7gz1m134FglMWCVmv9GCDR4AdAlD9KlQ9q0cfGaNJS
-jj86YIu3Z4kzd4pPsjy4bX9k9OOPZ/eO6oSDB2+LqFGn0vHj/zAxfEcWJDm30KhN
-Nkbwd5VFFkXdiQmePxAiGA==
+MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIRu7scI+V5ZQCAggA
+MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECNDpjncoMek0BIIEyNdSEzeGgFTc
+2mdljspg2028EFpD6wAK7XbcoA8WHN81qkJA4a4XQQFgp4RID7DQc95ELs4awMLu
+SkY19F4VETrS0RvjPYIQkcOQMuPicVGrmH9cDptXv+IM24BuBXfj692B1ZNhE8Gd
+tHlRpSiSga7ja1635mJ4lcZsNJHiDVpEI/aIy+Xy/G5hHFcg+S22w797tuKxG2MZ
+PG9mnI1S/PF1KZbbJJZeZE2u60GxGQYiv3sOUOd4tNZqMLt2Nzo0JrjQJCwxFgFK
+7EzRrN41G2IuSuSMSrn9CEADbvB1hgDWEgc8tW4jE28d9NhoiI+Lwzq33WBN6tyG
+oJly36w8J0VNBqhqQSLzwAQ+ChT2/a59GJ4R5LvFCP2AxDGkag1iN5FdQ96aIoCA
+zAevHtDNmGvj44qpkAiRlACiFjYXK7vR9ZiB+CIhe0dxm9kYCce9S2Du3541a//P
+2YtfjScV3mma21e+xUMPzgNR+p8O9OY2DSMi3m56cXFfR5eoKAFvBUalOBjJu9Wp
+k9dpLZlbE8qBd8plEjnq3ie3+DSkWOaq8KI4OeBa0ZyE6kRnC+2qYQ2aafGq/y5d
+o8V/P9xpvZJfH/QsFpaQM9TP3biI8wdN1w+uU5ZX/g9zpgkVSBR4jVWbjmSdpcN8
+IdVNIohLZDtSSGDA+yzG+T/3tloS7uB3dIQgjqINcJqp3l6W8chbjZoe2WDAJH6u
+F+VthCo82dTgDpn+yPWsKNTyJc9B4bbCgHkZCjX0ENksJt22Oi9Bq2+uCU9RdKZ8
+KxL37OlqAwLvDg8XgV/ox3lzcMmSR/Y1xY5XdUS4crsXcSZMtakEHlYt9U2s8SsH
+WqdiUrdTC7YJHReJ/FhooEo9Tk4bfxJtSeOJMvzHkE14jRW/ovy1tYCpyJI7Q+Dy
+9z++hi/DuNusWoHjw3KLOtPST2o/YduBPGBK88sPEVUIZXdJ/JLe1CQGb+1IuKxw
+XADhNMIGW31i5uoaM7eVgRM5oZ6FUhK356vBgJVu39qStBuc8dq19lu0iOfgtVWY
+WEQd7PuwJnZrcpz6YiPHTrtCDApPT53RnuYJgPlDGkW/yUkjZk8Qzcg4yes4zZaT
+Zkts/BiGtQ4bgTkOZtwE8xCI+NZTnhWyIyMk+us2fSvJJGEsnBtJ8PO5XwoZvHxQ
+DMP4MoaZt1/TV5TXMYel/shvpCWIbKFVG9npk3bomC2ApUJbNlrvOKrxS5vaVd1i
+bZXigYZcynDYSsY4RI8jK3nSp2uR8C4YCaBU1ws0uj0ZAvY+SxuYSQTEs1eQd0ra
+QMOlhmUAydHkP+kT2zUTYa4uFn2F/KMhQ/r2nAtpgG/wT6gYeOz5bi8bGl6+dfvU
+9HT6JWFNOKaFVTVvlu32VGpe4nbUszVQlgXLu+1tHL4K0yRgLL6nGpLH31U4M9YV
+T+aJGjCBEsH56ipMMy0Ke/NfJyfwG+HEkg9EXK+re+1zsm4vWI5Aru4eApN3Im+N
+TnIE7y5OZCQEYgolZotzvPoXDAesofRpt2RoAMNIL/pRZZGKG+6bojq0AIrKi6rp
+6y2nF3NjSjGBM8K2FIsj2ORchbGzw3zu4QOBsMfLO32/SheMhaytqPVt3Pkss5xb
+ivBI1FNVMcGJYA9S+4ZF3Q==
 -----END ENCRYPTED PRIVATE KEY-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem
index a8ce54b..e9b5fda 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem
@@ -1,16 +1,16 @@
 -----BEGIN CERTIFICATE-----
-MIJAhzCCP2+gAwIBAgIDBsfzMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
-Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDA5MTIwMDI1MzBaFw0yMTA5MTIwMDI1MzBa
+MIJAhzCCP2+gAwIBAgIDDeufMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
+Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDEwMTIwMDMwNDdaFw0yMTEwMTIwMDMwNDda
 MB0xGzAZBgNVBAMMEndlYi1wbGF0Zm9ybS10ZXN0czCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAJ4nWe+DDK0SJZPqgT0i9Cfx7Wg4v1vN+q4yh/sPNmQ+
-wcNbSu7/UwzhBj4SsP/Wpu4DYpnsn19IW3sAsIpkeLvTNGJThV9uc63UHKuT12wx
-LrXAVQogX7Ieou/WRKUUW+S6AMEP9Daa92UA0WPjlplW+l4HgDNStbXJEFF5zCZC
-ZvVO7hI4CzZxbx/o0komKTEklKcSoigsSMs/n9DUWqd+rd6lVQRIqKbowPzs65C2
-6BxT6YqVwD4QxGnRCv+T4EFxfT2GOmn9e5I3O6oN9pgOinzo8QG9ae9izhFHOnaG
-+rgRWl430Djg9wQtv8BBSgxgT2swe6PYr9drE1w7Zi0CAwEAAaOCPc4wgj3KMAwG
-A1UdEwQFMAMBAf8wHQYDVR0OBBYEFBItKeGCg0NYb1P7c2KraTOzvBwVMEcGA1Ud
-IwRAMD6AFBItKeGCg0NYb1P7c2KraTOzvBwVoSGkHzAdMRswGQYDVQQDDBJ3ZWIt
-cGxhdGZvcm0tdGVzdHOCAwbH8zALBgNVHQ8EBAMCAgQwgh+bBgNVHR4Egh+SMIIf
+BQADggEPADCCAQoCggEBAOGkP/wDuZaB5F+dyDND3yegR0+uA/PsPzKcpALwjr6G
+AkEWSqOp1H5pLtV0L+VuFJM7k9OhihrX9gQF3NG2oViUo8FY0u90NQUOFOpKaiol
+pQEtC0nW7RJME9i6OqHp8oEVEUmTN3sgXnmLznO/EVpbjs7gEV8bdvIUeg224I9D
+Ly7QcF90GHWHjp9SI7EbODhbE7oB07l55/ddTsjCQE32KAdzLMLrowIvfMHtGIG7
+DKtEzM4muXaHJImDJdiXLdv64ZlbpwjwqhEzNBdfGhPnEqCqDK0/Gqn5VfS+UzcD
+/uQrMWsoL/oUrwTztk2uI+zcKYCXooKlEvzAQmNlXmcCAwEAAaOCPc4wgj3KMAwG
+A1UdEwQFMAMBAf8wHQYDVR0OBBYEFIFuwBVBQHcPDDoei++ltCM0KtQPMEcGA1Ud
+IwRAMD6AFIFuwBVBQHcPDDoei++ltCM0KtQPoSGkHzAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHOCAw3rnzALBgNVHQ8EBAMCAgQwgh+bBgNVHR4Egh+SMIIf
 jqCCH4owE4IRd2ViLXBsYXRmb3JtLnRlc3QwF4IVb3A4LndlYi1wbGF0Zm9ybS50
 ZXN0MBeCFW9wNy53ZWItcGxhdGZvcm0udGVzdDAXghVvcDkud2ViLXBsYXRmb3Jt
 LnRlc3QwF4IVb3A0LndlYi1wbGF0Zm9ybS50ZXN0MBeCFW5vdC13ZWItcGxhdGZv
@@ -337,11 +337,11 @@
 cnFodjI4YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3SCQXhuLS1uOGo2ZHM1M2x3d2ty
 cWh2MjhhLnhuLS1uOGo2ZHM1M2x3d2tycWh2MjhhLndlYi1wbGF0Zm9ybS50ZXN0
 gkV4bi0tbjhqNmRzNTNsd3drcnFodjI4YS54bi0tbjhqNmRzNTNsd3drcnFodjI4
-YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3QwDQYJKoZIhvcNAQELBQADggEBABJT/1Fz
-fcRod/d4XOiprc0e64D9Ohd91E6grSPdIt/xEt5NEUY+E2F4RSuEYcznruGmnYjG
-SqRaCk6GKRQRNopYH869EqvfvAuLwpL4ZhJZYlEkq2TVY9FHHyDIuSAZ0LbpNvcQ
-68W1hIs9jEJX/WGnaJtOFqrEBY5Ep22+Elm1I+mJmsEbyiKvyw9ovZGGG0HnHODs
-PwkQdfsNEgXnH2OcHZpDqt8xc9VWH2gNnJg2XfxfesUHcGhFY4joki+QiMdQRoHs
-gc8D0R7QauBhc4NLWwat8EIRjKavmZvr+6QN2kGM4w/LYdX/JW121JWP5PbdwS29
-aRxZsfc6+YK+O+k=
+YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3QwDQYJKoZIhvcNAQELBQADggEBABV0Fdd4
+mBYcpepIDsw0Rg9kVA1xrusuCBvJBmHEAiBT0BjPuPqKmVnSHeKKN9yPb+MoZpVV
+p9sYK1dsvg7k7Ps9n/kUR5DaYXFS0L6C13ai9b8KSXbfcIpORj7khtw3q2c7mXBT
+WJG773rl9d4JKgzUHxMxOssqWgFyVDI6iVIIKtwTcPgkwjIkzmSDXmzKG3U3y+G1
+uusX8OITz2YbmE/gPUNEwUUb8wG2YvSxlql5oTltAmO0B7OLKxTJ6xb80/3NWt14
+A1pe742p7fz2ECPBx/wHjvbFf2jkMgtRzWK1+A9aXAJnZnZhKBfW/MNP5J4AiRnY
+ssVE+rp8r8RdHXg=
 -----END CERTIFICATE-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key
index c4f5dc3f..957dfb2 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key
@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDuGifF9hdWxBC2
-YF7bXIO7xXEREIQw97SL8LEuc7gHfG+0PCya8YNsDssxVdf0xb9Z0XbP4ApKn+Vg
-6aTiTHFYXrQdlyU/o5sVbC3dDInFA3BKBhDOIltHAqIcq1HlFJrq+5wheh+Wv22F
-i2Ceix8cVImA6aJdWLVds/bSLQgLPR0Ez1EP2FHaXZCZvtgFXk2oym6oei1OopZB
-l/AF9sOybD/U2cao6xIX6EIkwgLXrC+Bh7lJLKvX6I8nGKUF3KFwO5RsU50j7d5S
-3U+38QsB8n46QNGgCMAWwe0GoVRnH3SVgR9zGVsS02NLUi3ciGzHnahjYP3Tj8wM
-AR5KH+UbAgMBAAECggEBAIPNKrMklKrNActS8W9QeQOaOgqOL/7DP8gvRoVGPVq3
-gUYuASsMAgnw7n2y3UZ7qH7ZuoE7rba9aEYLT+CNHDkkw2OV5WKi+BgVuBWi+Sh7
-zM7NKMRStGBMjtx74WuDynXFLhpB9faGpOPF0Ygxztjp2uvnaJ9vmYXzNvAFSWye
-KHfj72vFTvLsyrwhEMz0+t6pviiXTZdqTBkZbkbEUN73YQFEsiCNxzoL8SAn4klh
-wFPJdC2AWGXd+FQYUkiYeoocGN01cSlVPCJgv7hwjPCM8ZPXwZWhUxg2RgQHgn8q
-mbPzk8m3gCgrHh5pMmm/V0Zwm3Y4SAEqcmXn9zDtl2ECgYEA+Pw5vKogtT0OC2aK
-SH4MRq9BU+LoC4XkoFilxvZ4n54hEwovau2f4l+fOhL37kWkzgMPHp15tfw3dhb4
-9KUVI7Lu4eNqcjxa0FWnmLxaJMKVo4/fuD3283Fy3feT4p8m8gowUT4fT9PaAQY1
-qwO6W2Y8KyAzb1EMDnjc0KYu5QkCgYEA9M9v3B901kPyi3IYZe/NYM7aUgluWodF
-ge5+6oX7uRsjBeQZgRvXz+8/gswpYkh4anHwqm2uiyy6NrNIRqY5oYpjf1131e/7
-rgkzKNqlscflHdbIw9Gg1PnPKb6qt/nBJtUebE7zOmaRIJq6ItPwB/8jsCm7zWqa
-hbnohqbNBgMCgYEAxjt6dH03AVUU43rGSiUg/P33kyQq/1GgzxEFG72MF/k79/65
-9fYuv3rGOOR1RN1p8yN4XDWge4XNWlW77Huqsvt5OZtoWn83BnvLrcz4MCBEJy8b
-PYMIJJaEj7jXoyx3Q2ldQrGlGFdhUENzYy7apn5lFSjUCqKKaNNNa0mEOJECgYAU
-Y1o7iNsgJRSEDIJ/qtL95vxDrMll/LILOiOTwIjQR7RI/1AocnsstA4kBIDF0KdG
-piqW5v+MU7NGbvPr/lf6Xh4fM1eRl6TsP5PlKSB3h+BK9eJOfJzaX9ui7GAnZkNx
-ynn4JzMWgAhCIOCzmdb5s4PzXeZoGyK3VF5LKIUWpQKBgFem49WIPYZwuJKO+Gjt
-9CdlY5bUyb1z//lxpSxX99YWn4Azo5cNjKI5wo+k/0b7DT1grUqiviv50UxE7XoW
-+0DZvgDXvWrr/7c92ARazNGr/gTe2D7TWyIKhyQ9Zrv1dH1NIEjouvXzkLsfB0tY
-eiC3cV07lWvFpXUGIzkzIqpQ
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCru8v0H5Ka2NPG
+WVV5Y0h9ER/9ynCLLSmy/jHjcvYtwNpAfSgHum1CbWze9yE7bNaQ9FXbA33V3cnh
+0gzUyOK81yxcU5VkKpyNJcYFB/pjOMB66rS2QDR2PErJTduh1y3sX6JbK1aAQ8ac
+SnFXMz2L28swmXgmFYmCxWHB8xVsPR5xqIav5cnjQyVfi7BlcZCUajExvugkEtjt
+ckSZzBKmyLYWIjVcEIwUaapEyts1mEJL2qQHRoEHVskow12VuPOanIhpBcmrDIRl
+pnThZuHZO/aOeKWG9sKFVfCORAUru+3/udXRbBLQLmpBZiWO8F1EuLNqUhsWx/bF
+sn9630EPAgMBAAECggEAQad/NqpnYvmoJPl8Ovcg/GdyopUlZ5/xhDO4IOuPgDht
+eCAhEKtOIAoziB5UvyJB+ZLfy+ZO0leDWejy7NqMDIP6uqVdxLihtziMttmw+QP2
+WkempNJw/A7azJEOeZYJQYfiSxaLcGf440F2iU7WpcR2rvLNQ0oSk0Mgt4RWWVV4
+FU4A9cgJ4++KhAtlCyskDG+ZoFEj4O93WXqaO/oF8Y/+mjD7xoLwm5o8U1E00FZQ
+OQkJ26obLfOQRcbs3ZtLcqsbZl46DzmmG8Ddpdst2Y8hkeMPfI83i4xu2b5uj+wO
+SZqwcHo4oRGEQEUj4WGnN9ZjVa9AWcDNAY63/FvT0QKBgQDWOwfYzsdG3/R3TQ0X
+7Vq7tgYLDoWVFRs2O1vbE+/+f6zRyCo84IvKd4KFG/mlcZr6Odo6H2HSnQiRX4/w
+LGjG+prAql90IODZljgYXEKuQeseHz6hHAL/k9gKHSOSmGmw5MmOw4TUuII0+oc+
+5eArXjuu9SX2AC935ir3vYEQlwKBgQDNN5jxHORGdtJ92Yr/rkVUSRir5/7OhBjz
+s2K60/hSHbWfejmWgGpqEEp9qHBYuXGPuORWR/A37qp61w3Hi3/Wp7nJcjn7sUQK
+9phZ8BmmW2FIvC22J8ui33fjX/Vbbd4ihdBonf6G9fvpZ1kkU/n8co3dRdQkGNzI
+IQ6kJMVqSQKBgQC8hjw0jluNwn33EsZn/Qdw0xFkX4YsmONWiUwfcd8sPp0OC7En
+248JQLyKeQDrmBsDAzBJH97NIkYs8ETR3bLjEBxpWkUgA+L7eBerUF2Zzgajfml2
+DBmTYj6nP9dTJW81LVE2olbdf/WNu76TGmZ4o7ewEqoyXx1mzRWY6JqQxwKBgQDC
+0J/hbSML/asPi+BXnxHz1LyWHVQYqvChEU+NusLG+as8rSRUSq466CI/LhMRN2Km
+JMinW/2gq3Kt0NAk+bovheRqZ4TB+mN04Op6nuNKuP8etH3Uqey4PtqqQKNE24UA
+UvYpCqvhZU1zIwhN42azD/C6+ZpNdkjJuBAVJU8/+QKBgAgr39s68Zw8esPv3AmP
+7Qx+D9hleD07xm3iHD0EU/WK3IW2TqUN2VpL3lpkucH3M0v1dm49+T3NQw524NJK
+nfytgCa+RERmo8t/epJG6dWZgesUniiSvAckGriZjcsgOExYyHe7vu1dHOLeU2S/
+NDKR7frgEU7EiGtNQEa8ucLD
 -----END PRIVATE KEY-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem
index 438f504b..61d7e4d1 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem
@@ -1,43 +1,43 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 444404 (0x6c7f4)
+        Serial Number: 912288 (0xdeba0)
         Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=web-platform-tests
         Validity
-            Not Before: Sep 12 00:25:31 2020 GMT
-            Not After : Sep 12 00:25:31 2021 GMT
+            Not Before: Oct 12 00:30:47 2020 GMT
+            Not After : Oct 12 00:30:47 2021 GMT
         Subject: CN=web-platform.test
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 RSA Public-Key: (2048 bit)
                 Modulus:
-                    00:ee:1a:27:c5:f6:17:56:c4:10:b6:60:5e:db:5c:
-                    83:bb:c5:71:11:10:84:30:f7:b4:8b:f0:b1:2e:73:
-                    b8:07:7c:6f:b4:3c:2c:9a:f1:83:6c:0e:cb:31:55:
-                    d7:f4:c5:bf:59:d1:76:cf:e0:0a:4a:9f:e5:60:e9:
-                    a4:e2:4c:71:58:5e:b4:1d:97:25:3f:a3:9b:15:6c:
-                    2d:dd:0c:89:c5:03:70:4a:06:10:ce:22:5b:47:02:
-                    a2:1c:ab:51:e5:14:9a:ea:fb:9c:21:7a:1f:96:bf:
-                    6d:85:8b:60:9e:8b:1f:1c:54:89:80:e9:a2:5d:58:
-                    b5:5d:b3:f6:d2:2d:08:0b:3d:1d:04:cf:51:0f:d8:
-                    51:da:5d:90:99:be:d8:05:5e:4d:a8:ca:6e:a8:7a:
-                    2d:4e:a2:96:41:97:f0:05:f6:c3:b2:6c:3f:d4:d9:
-                    c6:a8:eb:12:17:e8:42:24:c2:02:d7:ac:2f:81:87:
-                    b9:49:2c:ab:d7:e8:8f:27:18:a5:05:dc:a1:70:3b:
-                    94:6c:53:9d:23:ed:de:52:dd:4f:b7:f1:0b:01:f2:
-                    7e:3a:40:d1:a0:08:c0:16:c1:ed:06:a1:54:67:1f:
-                    74:95:81:1f:73:19:5b:12:d3:63:4b:52:2d:dc:88:
-                    6c:c7:9d:a8:63:60:fd:d3:8f:cc:0c:01:1e:4a:1f:
-                    e5:1b
+                    00:ab:bb:cb:f4:1f:92:9a:d8:d3:c6:59:55:79:63:
+                    48:7d:11:1f:fd:ca:70:8b:2d:29:b2:fe:31:e3:72:
+                    f6:2d:c0:da:40:7d:28:07:ba:6d:42:6d:6c:de:f7:
+                    21:3b:6c:d6:90:f4:55:db:03:7d:d5:dd:c9:e1:d2:
+                    0c:d4:c8:e2:bc:d7:2c:5c:53:95:64:2a:9c:8d:25:
+                    c6:05:07:fa:63:38:c0:7a:ea:b4:b6:40:34:76:3c:
+                    4a:c9:4d:db:a1:d7:2d:ec:5f:a2:5b:2b:56:80:43:
+                    c6:9c:4a:71:57:33:3d:8b:db:cb:30:99:78:26:15:
+                    89:82:c5:61:c1:f3:15:6c:3d:1e:71:a8:86:af:e5:
+                    c9:e3:43:25:5f:8b:b0:65:71:90:94:6a:31:31:be:
+                    e8:24:12:d8:ed:72:44:99:cc:12:a6:c8:b6:16:22:
+                    35:5c:10:8c:14:69:aa:44:ca:db:35:98:42:4b:da:
+                    a4:07:46:81:07:56:c9:28:c3:5d:95:b8:f3:9a:9c:
+                    88:69:05:c9:ab:0c:84:65:a6:74:e1:66:e1:d9:3b:
+                    f6:8e:78:a5:86:f6:c2:85:55:f0:8e:44:05:2b:bb:
+                    ed:ff:b9:d5:d1:6c:12:d0:2e:6a:41:66:25:8e:f0:
+                    5d:44:b8:b3:6a:52:1b:16:c7:f6:c5:b2:7f:7a:df:
+                    41:0f
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: 
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                69:30:CF:1C:78:FD:0E:13:3A:FC:91:6A:B2:1D:18:B3:F8:4F:C8:09
+                8C:D4:48:01:1B:FF:9F:42:0D:81:D2:05:2D:47:CA:8E:F4:DB:18:07
             X509v3 Authority Key Identifier: 
-                keyid:12:2D:29:E1:82:83:43:58:6F:53:FB:73:62:AB:69:33:B3:BC:1C:15
+                keyid:81:6E:C0:15:41:40:77:0F:0C:3A:1E:8B:EF:A5:B4:23:34:2A:D4:0F
 
             X509v3 Key Usage: 
                 Digital Signature, Non Repudiation, Key Encipherment
@@ -46,33 +46,33 @@
             X509v3 Subject Alternative Name: 
                 DNS:web-platform.test, DNS:op8.web-platform.test, DNS:op7.web-platform.test, DNS:op9.web-platform.test, DNS:op4.web-platform.test, DNS:not-web-platform.test, DNS:op6.web-platform.test, DNS:op3.web-platform.test, DNS:op2.web-platform.test, DNS:op1.web-platform.test, DNS:www.web-platform.test, DNS:op5.web-platform.test, DNS:op88.web-platform.test, DNS:op98.web-platform.test, DNS:op85.web-platform.test, DNS:op89.web-platform.test, DNS:op66.web-platform.test, DNS:op72.web-platform.test, DNS:op24.web-platform.test, DNS:op41.web-platform.test, DNS:op79.web-platform.test, DNS:op91.web-platform.test, DNS:op59.web-platform.test, DNS:op39.web-platform.test, DNS:op60.web-platform.test, DNS:op58.web-platform.test, DNS:op28.web-platform.test, DNS:www1.web-platform.test, DNS:op14.web-platform.test, DNS:op69.web-platform.test, DNS:op40.web-platform.test, DNS:op74.web-platform.test, DNS:op31.web-platform.test, DNS:op18.web-platform.test, DNS:op73.web-platform.test, DNS:op77.web-platform.test, DNS:op12.web-platform.test, DNS:op54.web-platform.test, DNS:op63.web-platform.test, DNS:op71.web-platform.test, DNS:op95.web-platform.test, DNS:op16.web-platform.test, DNS:op36.web-platform.test, DNS:op27.web-platform.test, DNS:op29.web-platform.test, DNS:op94.web-platform.test, DNS:op44.web-platform.test, DNS:op33.web-platform.test, DNS:op84.web-platform.test, DNS:op32.web-platform.test, DNS:op61.web-platform.test, DNS:op70.web-platform.test, DNS:www2.web-platform.test, DNS:op43.web-platform.test, DNS:op78.web-platform.test, DNS:op26.web-platform.test, DNS:op76.web-platform.test, DNS:op52.web-platform.test, DNS:op99.web-platform.test, DNS:op86.web-platform.test, DNS:op46.web-platform.test, DNS:op17.web-platform.test, DNS:op90.web-platform.test, DNS:op93.web-platform.test, DNS:op10.web-platform.test, DNS:op55.web-platform.test, DNS:op47.web-platform.test, DNS:op51.web-platform.test, DNS:op45.web-platform.test, DNS:op80.web-platform.test, DNS:op68.web-platform.test, DNS:op49.web-platform.test, DNS:op57.web-platform.test, DNS:op35.web-platform.test, DNS:op67.web-platform.test, DNS:op92.web-platform.test, DNS:op15.web-platform.test, DNS:op13.web-platform.test, DNS:op75.web-platform.test, DNS:op64.web-platform.test, DNS:op97.web-platform.test, DNS:op37.web-platform.test, DNS:op56.web-platform.test, DNS:op62.web-platform.test, DNS:op82.web-platform.test, DNS:op25.web-platform.test, DNS:op11.web-platform.test, DNS:op50.web-platform.test, DNS:op38.web-platform.test, DNS:op83.web-platform.test, DNS:op81.web-platform.test, DNS:op20.web-platform.test, DNS:op21.web-platform.test, DNS:op23.web-platform.test, DNS:op42.web-platform.test, DNS:op22.web-platform.test, DNS:op65.web-platform.test, DNS:op96.web-platform.test, DNS:op87.web-platform.test, DNS:op19.web-platform.test, DNS:op53.web-platform.test, DNS:op30.web-platform.test, DNS:op48.web-platform.test, DNS:op34.web-platform.test, DNS:op6.not-web-platform.test, DNS:op3.not-web-platform.test, DNS:op2.not-web-platform.test, DNS:op5.not-web-platform.test, DNS:www.not-web-platform.test, DNS:www.www.web-platform.test, DNS:op7.not-web-platform.test, DNS:op4.not-web-platform.test, DNS:op8.not-web-platform.test, DNS:op9.not-web-platform.test, DNS:op1.not-web-platform.test, DNS:op36.not-web-platform.test, DNS:op53.not-web-platform.test, DNS:op50.not-web-platform.test, DNS:op24.not-web-platform.test, DNS:op31.not-web-platform.test, DNS:op95.not-web-platform.test, DNS:op83.not-web-platform.test, DNS:www2.not-web-platform.test, DNS:op73.not-web-platform.test, DNS:op19.not-web-platform.test, DNS:op21.not-web-platform.test, DNS:op81.not-web-platform.test, DNS:op70.not-web-platform.test, DNS:op78.not-web-platform.test, DNS:op40.not-web-platform.test, DNS:op25.not-web-platform.test, DNS:op65.not-web-platform.test, DNS:www.www2.web-platform.test, DNS:op80.not-web-platform.test, DNS:op52.not-web-platform.test, DNS:op68.not-web-platform.test, DNS:op45.not-web-platform.test, DNS:op71.not-web-platform.test, DNS:op72.not-web-platform.test, DNS:op90.not-web-platform.test, DNS:op89.not-web-platform.test, DNS:op49.not-web-platform.test, DNS:op77.not-web-platform.test, DNS:op79.not-web-platform.test, DNS:op82.not-web-platform.test, DNS:www.www1.web-platform.test, DNS:op12.not-web-platform.test, DNS:op39.not-web-platform.test, DNS:op44.not-web-platform.test, DNS:www1.not-web-platform.test, DNS:op58.not-web-platform.test, DNS:op14.not-web-platform.test, DNS:op30.not-web-platform.test, DNS:op62.not-web-platform.test, DNS:op61.not-web-platform.test, DNS:op92.not-web-platform.test, DNS:op29.not-web-platform.test, DNS:op98.not-web-platform.test, DNS:op64.not-web-platform.test, DNS:op26.not-web-platform.test, DNS:op22.not-web-platform.test, DNS:op94.not-web-platform.test, DNS:op38.not-web-platform.test, DNS:op33.not-web-platform.test, DNS:op23.not-web-platform.test, DNS:op57.not-web-platform.test, DNS:op54.not-web-platform.test, DNS:op85.not-web-platform.test, DNS:op46.not-web-platform.test, DNS:op97.not-web-platform.test, DNS:op32.not-web-platform.test, DNS:op60.not-web-platform.test, DNS:op96.not-web-platform.test, DNS:op51.not-web-platform.test, DNS:op41.not-web-platform.test, DNS:op35.not-web-platform.test, DNS:op99.not-web-platform.test, DNS:op42.not-web-platform.test, DNS:op67.not-web-platform.test, DNS:op37.not-web-platform.test, DNS:op48.not-web-platform.test, DNS:op55.not-web-platform.test, DNS:op56.not-web-platform.test, DNS:op84.not-web-platform.test, DNS:op34.not-web-platform.test, DNS:op69.not-web-platform.test, DNS:op11.not-web-platform.test, DNS:op93.not-web-platform.test, DNS:www1.www.web-platform.test, DNS:op86.not-web-platform.test, DNS:op13.not-web-platform.test, DNS:op20.not-web-platform.test, DNS:op76.not-web-platform.test, DNS:op27.not-web-platform.test, DNS:op17.not-web-platform.test, DNS:op75.not-web-platform.test, DNS:op15.not-web-platform.test, DNS:op47.not-web-platform.test, DNS:op18.not-web-platform.test, DNS:op63.not-web-platform.test, DNS:op28.not-web-platform.test, DNS:op43.not-web-platform.test, DNS:op66.not-web-platform.test, DNS:www2.www.web-platform.test, DNS:op91.not-web-platform.test, DNS:op74.not-web-platform.test, DNS:op59.not-web-platform.test, DNS:op88.not-web-platform.test, DNS:op87.not-web-platform.test, DNS:op10.not-web-platform.test, DNS:op16.not-web-platform.test, DNS:www1.www2.web-platform.test, DNS:www2.www2.web-platform.test, DNS:www2.www1.web-platform.test, DNS:www1.www1.web-platform.test, DNS:www.www.not-web-platform.test, DNS:xn--lve-6lad.web-platform.test, DNS:www1.www.not-web-platform.test, DNS:www.www2.not-web-platform.test, DNS:www2.www.not-web-platform.test, DNS:www.www1.not-web-platform.test, DNS:www2.www2.not-web-platform.test, DNS:www2.www1.not-web-platform.test, DNS:www1.www1.not-web-platform.test, DNS:www1.www2.not-web-platform.test, DNS:xn--lve-6lad.www.web-platform.test, DNS:xn--lve-6lad.not-web-platform.test, DNS:www.xn--lve-6lad.web-platform.test, DNS:www2.xn--lve-6lad.web-platform.test, DNS:xn--lve-6lad.www2.web-platform.test, DNS:xn--lve-6lad.www1.web-platform.test, DNS:www1.xn--lve-6lad.web-platform.test, DNS:xn--lve-6lad.www.not-web-platform.test, DNS:www.xn--lve-6lad.not-web-platform.test, DNS:xn--lve-6lad.www1.not-web-platform.test, DNS:www2.xn--lve-6lad.not-web-platform.test, DNS:www1.xn--lve-6lad.not-web-platform.test, DNS:xn--lve-6lad.www2.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.xn--lve-6lad.web-platform.test, DNS:www.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www.web-platform.test, DNS:www1.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www2.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www1.web-platform.test, DNS:www2.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.xn--lve-6lad.not-web-platform.test, DNS:www.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www2.not-web-platform.test, DNS:www1.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:www2.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www1.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--lve-6lad.web-platform.test, DNS:xn--lve-6lad.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--lve-6lad.not-web-platform.test, DNS:xn--lve-6lad.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test
     Signature Algorithm: sha256WithRSAEncryption
-         70:a3:c2:d4:02:32:83:2c:57:4e:cf:42:0e:d6:50:c1:40:2f:
-         75:84:54:26:ed:21:7b:5e:97:94:ed:ff:43:15:33:4c:fe:eb:
-         b8:d9:a2:ac:ca:ad:59:e7:52:cf:74:59:62:df:a6:01:e5:d5:
-         53:04:6c:97:87:7e:2c:da:44:dd:64:ec:cc:1a:ab:38:99:65:
-         e1:f6:94:59:b7:65:b3:a6:e5:21:7d:96:04:0e:87:d9:13:32:
-         27:50:11:7a:01:7d:6e:a9:42:b1:78:40:4f:0a:89:18:0b:8d:
-         7a:a2:73:39:88:8c:49:da:17:91:6b:c7:2f:ee:7e:79:4e:f5:
-         aa:97:1a:28:c6:5d:89:eb:5e:bc:68:ac:e9:dd:c8:6f:89:50:
-         34:c2:fe:69:70:7a:ce:6b:ef:09:fb:f6:9d:a1:d8:eb:2f:e6:
-         44:1d:1d:f6:e4:97:e4:0e:3e:a5:cc:8b:5b:5b:8c:7c:8c:57:
-         b9:d3:c4:a2:ac:98:c2:91:8b:b9:7f:5a:a6:fb:e4:fb:5b:0b:
-         11:c2:e2:4a:62:d0:98:d0:f9:77:c6:eb:72:b5:92:0d:e6:5d:
-         3c:20:f9:d6:0e:60:2c:45:0f:b9:67:e7:b7:05:9c:a1:a0:e0:
-         3b:40:52:56:fb:64:12:85:f7:56:9e:2d:8c:12:a0:c1:58:27:
-         56:0d:af:d8
+         79:cb:a1:17:14:f9:34:8b:f5:ef:cb:21:22:47:dc:b1:32:17:
+         0f:14:d3:d7:03:76:df:41:20:84:50:63:a2:7c:b7:31:fe:a0:
+         f2:c9:30:79:2c:30:6b:f7:eb:36:13:ac:27:5e:4a:06:49:6c:
+         c2:9c:f6:b0:56:a9:6e:25:e2:82:91:e9:ac:3b:2d:9f:cd:a4:
+         f9:c1:74:4c:15:b7:68:ef:01:6f:e0:f2:9b:be:0c:48:96:3f:
+         6e:42:71:e9:f7:d8:08:ba:3d:e6:ab:c0:cf:44:c0:a8:ca:62:
+         84:1c:c2:46:02:b0:77:98:15:ba:7d:60:b9:e5:e9:ff:d9:78:
+         62:cd:5b:0a:8e:25:fe:a3:25:10:83:4e:84:74:25:61:54:33:
+         45:d4:84:cb:76:91:bb:ab:41:d5:98:b1:44:91:4b:e2:d2:a5:
+         75:15:fb:5f:d7:73:6d:6d:c6:4b:97:74:3b:0b:f3:f1:fa:da:
+         19:6d:6b:27:7c:8d:f1:99:86:f1:11:b1:81:2f:a0:2c:fb:fe:
+         9d:67:d2:49:5d:f5:0d:db:03:26:fc:c1:4b:ab:dd:18:d5:7e:
+         7a:64:61:69:3b:90:4f:2d:ad:21:40:07:d1:5a:f0:30:6a:ed:
+         0c:84:58:a1:55:3c:00:e1:23:3e:60:cb:d4:57:1a:69:2d:2e:
+         56:3a:51:14
 -----BEGIN CERTIFICATE-----
-MIIgvDCCH6SgAwIBAgIDBsf0MA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
-Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDA5MTIwMDI1MzFaFw0yMTA5MTIwMDI1MzFa
+MIIgvDCCH6SgAwIBAgIDDeugMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
+Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDEwMTIwMDMwNDdaFw0yMTEwMTIwMDMwNDda
 MBwxGjAYBgNVBAMMEXdlYi1wbGF0Zm9ybS50ZXN0MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA7honxfYXVsQQtmBe21yDu8VxERCEMPe0i/CxLnO4B3xv
-tDwsmvGDbA7LMVXX9MW/WdF2z+AKSp/lYOmk4kxxWF60HZclP6ObFWwt3QyJxQNw
-SgYQziJbRwKiHKtR5RSa6vucIXoflr9thYtgnosfHFSJgOmiXVi1XbP20i0ICz0d
-BM9RD9hR2l2Qmb7YBV5NqMpuqHotTqKWQZfwBfbDsmw/1NnGqOsSF+hCJMIC16wv
-gYe5SSyr1+iPJxilBdyhcDuUbFOdI+3eUt1Pt/ELAfJ+OkDRoAjAFsHtBqFUZx90
-lYEfcxlbEtNjS1It3Ihsx52oY2D904/MDAEeSh/lGwIDAQABo4IeBDCCHgAwCQYD
-VR0TBAIwADAdBgNVHQ4EFgQUaTDPHHj9DhM6/JFqsh0Ys/hPyAkwHwYDVR0jBBgw
-FoAUEi0p4YKDQ1hvU/tzYqtpM7O8HBUwCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoG
+AAOCAQ8AMIIBCgKCAQEAq7vL9B+SmtjTxllVeWNIfREf/cpwiy0psv4x43L2LcDa
+QH0oB7ptQm1s3vchO2zWkPRV2wN91d3J4dIM1MjivNcsXFOVZCqcjSXGBQf6YzjA
+euq0tkA0djxKyU3bodct7F+iWytWgEPGnEpxVzM9i9vLMJl4JhWJgsVhwfMVbD0e
+caiGr+XJ40MlX4uwZXGQlGoxMb7oJBLY7XJEmcwSpsi2FiI1XBCMFGmqRMrbNZhC
+S9qkB0aBB1bJKMNdlbjzmpyIaQXJqwyEZaZ04Wbh2Tv2jnilhvbChVXwjkQFK7vt
+/7nV0WwS0C5qQWYljvBdRLizalIbFsf2xbJ/et9BDwIDAQABo4IeBDCCHgAwCQYD
+VR0TBAIwADAdBgNVHQ4EFgQUjNRIARv/n0INgdIFLUfKjvTbGAcwHwYDVR0jBBgw
+FoAUgW7AFUFAdw8MOh6L76W0IzQq1A8wCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoG
 CCsGAQUFBwMBMIIdjwYDVR0RBIIdhjCCHYKCEXdlYi1wbGF0Zm9ybS50ZXN0ghVv
 cDgud2ViLXBsYXRmb3JtLnRlc3SCFW9wNy53ZWItcGxhdGZvcm0udGVzdIIVb3A5
 LndlYi1wbGF0Zm9ybS50ZXN0ghVvcDQud2ViLXBsYXRmb3JtLnRlc3SCFW5vdC13
@@ -231,10 +231,10 @@
 c3SCQXhuLS1uOGo2ZHM1M2x3d2tycWh2MjhhLnhuLS1uOGo2ZHM1M2x3d2tycWh2
 MjhhLndlYi1wbGF0Zm9ybS50ZXN0gkV4bi0tbjhqNmRzNTNsd3drcnFodjI4YS54
 bi0tbjhqNmRzNTNsd3drcnFodjI4YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3QwDQYJ
-KoZIhvcNAQELBQADggEBAHCjwtQCMoMsV07PQg7WUMFAL3WEVCbtIXtel5Tt/0MV
-M0z+67jZoqzKrVnnUs90WWLfpgHl1VMEbJeHfizaRN1k7MwaqziZZeH2lFm3ZbOm
-5SF9lgQOh9kTMidQEXoBfW6pQrF4QE8KiRgLjXqiczmIjEnaF5Frxy/ufnlO9aqX
-GijGXYnrXrxorOndyG+JUDTC/mlwes5r7wn79p2h2Osv5kQdHfbkl+QOPqXMi1tb
-jHyMV7nTxKKsmMKRi7l/Wqb75PtbCxHC4kpi0JjQ+XfG63K1kg3mXTwg+dYOYCxF
-D7ln57cFnKGg4DtAUlb7ZBKF91aeLYwSoMFYJ1YNr9g=
+KoZIhvcNAQELBQADggEBAHnLoRcU+TSL9e/LISJH3LEyFw8U09cDdt9BIIRQY6J8
+tzH+oPLJMHksMGv36zYTrCdeSgZJbMKc9rBWqW4l4oKR6aw7LZ/NpPnBdEwVt2jv
+AW/g8pu+DEiWP25Ccen32Ai6PearwM9EwKjKYoQcwkYCsHeYFbp9YLnl6f/ZeGLN
+WwqOJf6jJRCDToR0JWFUM0XUhMt2kburQdWYsUSRS+LSpXUV+1/Xc21txkuXdDsL
+8/H62hltayd8jfGZhvERsYEvoCz7/p1n0kld9Q3bAyb8wUur3RjVfnpkYWk7kE8t
+rSFAB9Fa8DBq7QyEWKFVPADhIz5gy9RXGmktLlY6URQ=
 -----END CERTIFICATE-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt b/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
index fae35977..65100d7 100644
--- a/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
+++ b/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
@@ -1,3 +1,3 @@
-mypy==0.782
+mypy==0.790
 mypy-extensions==0.4.3
 typed-ast==1.4.1
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py
index 289453b..c6e5835 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py
@@ -2,7 +2,7 @@
 # DO NOT EDIT MANUALLY.
 
 # tools/certs/web-platform.test.pem
-WPT_FINGERPRINT = 'Jjw17d8tPl/0TWUbC9g897DgEswu02sENyt5VUgT0wI='
+WPT_FINGERPRINT = 'HaGjcmfWjcURDEnkUEWZ28YAkYo5tM12hxAMQ2Z3750='
 
 # signed-exchange/resources/127.0.0.1.sxg.pem
 SXG_WPT_FINGERPRINT = '0Rt4mT6SJXojEMHTnKnlJ/hBKMBcI4kteBlhR1eTTdk='
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/runtime/remote-object-id-cross-process-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/runtime/remote-object-id-cross-process-expected.txt
new file mode 100644
index 0000000..c71af90
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/runtime/remote-object-id-cross-process-expected.txt
@@ -0,0 +1,39 @@
+Tests that RemoteObjectId is unique across processes.
+Navigating twice to ensure fresh process
+Runtime.evaluate {
+    id : <number>
+    result : {
+        result : {
+            className : Object
+            description : Object
+            objectId : <string>
+            type : object
+        }
+    }
+    sessionId : <string>
+}
+Navigating cross-process
+Runtime.evaluate {
+    id : <number>
+    result : {
+        result : {
+            className : Object
+            description : Object
+            objectId : <string>
+            type : object
+        }
+    }
+    sessionId : <string>
+}
+Runtime.callFunctionOn {
+    id : <number>
+    result : {
+        result : {
+            description : 17
+            type : number
+            value : 17
+        }
+    }
+    sessionId : <string>
+}
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/runtime/remote-object-id-cross-process.js b/third_party/blink/web_tests/http/tests/inspector-protocol/runtime/remote-object-id-cross-process.js
new file mode 100644
index 0000000..dd99e34
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/runtime/remote-object-id-cross-process.js
@@ -0,0 +1,23 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startBlank(`Tests that RemoteObjectId is unique across processes.`);
+
+  testRunner.log('Navigating twice to ensure fresh process');
+  await page.navigate('http://127.0.0.1:8000/inspector-protocol/resources/empty.html');
+  await page.navigate('http://localhost:8000/inspector-protocol/resources/empty.html');
+  const evaluateResponse1 = await dp.Runtime.evaluate({ expression: '({ foo: 42 })' });
+  testRunner.log(evaluateResponse1, 'Runtime.evaluate ');
+
+  testRunner.log('Navigating cross-process');
+  await page.navigate('http://127.0.0.1:8000/inspector-protocol/resources/empty.html');
+  const evaluateResponse2 = await dp.Runtime.evaluate({ expression: '({ foo: 17 })' });
+  testRunner.log(evaluateResponse2, 'Runtime.evaluate ');
+
+  const callFunctionOnResponse = await dp.Runtime.callFunctionOn({
+      functionDeclaration: 'function() { return this.foo }',
+      objectId: evaluateResponse1.result.result.objectId,
+  });
+  // This should be an error, because the first process is long gone.
+  testRunner.log(callFunctionOnResponse, 'Runtime.callFunctionOn ');
+
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html
index f3c9fb3..524ded2 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html
@@ -44,6 +44,17 @@
     }, "SanitizerAPI config allowElements is not editable.");
 
     test(t => {
+      let options = {blockElements: ["div"]};
+
+      let s = new Sanitizer(options);
+      assert_true(s instanceof Sanitizer);
+      assert_equals(s.sanitizeToString("<div>balabala</div><test>test</test>"), "balabala<test>test</test>");
+
+      options.blockElements.push("test");
+      assert_equals(s.sanitizeToString("<div>balabala</div><test>test</test>"), "balabala<test>test</test>");
+    }, "SanitizerAPI config blockElements is not editable.");
+
+    test(t => {
       let options = {dropElements: ["div"]};
 
       let s = new Sanitizer(options);
@@ -76,7 +87,7 @@
       assert_equals(s.sanitizeToString("<button id='btn' style='color: black'>balabala</button>"), "<button style=\"color: black\">balabala</button>");
     }, "SanitizerAPI config dropAttributes is not editable.");
 
-    const config_names = ["dropElements", "allowElements", "dropAttributes", "allowAttributes"];
+    const config_names = ["dropElements", "blockElements", "allowElements", "dropAttributes", "allowAttributes"];
     config_names.forEach(cname => {
       let options = {};
       options[cname] = [];
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
index b7983077..9cde50a 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
@@ -22,6 +22,7 @@
 PASS SanitizerAPI with config: dropElements list ["I", "AM"]}, sanitize function for dropElements list ["I", "AM"]}
 PASS SanitizerAPI with config: dropElements list ["am", "p"]}, sanitize function for dropElements list ["am", "p"]}
 PASS SanitizerAPI with config: dropElements list with invalid values}, sanitize function for dropElements list with invalid values}
+PASS SanitizerAPI with config: blockElements list with invalid values}, sanitize function for blockElements list with invalid values}
 PASS SanitizerAPI with config: allowElements list ["p"]., sanitize function for allowElements list ["p"].
 PASS SanitizerAPI with config: allowElements list has no influence to dropElements., sanitize function for allowElements list has no influence to dropElements.
 PASS SanitizerAPI with config: dropAttributes list ["style"] with style attribute, sanitize function for dropAttributes list ["style"] with style attribute
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
index db93a3e2..d26287c 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
@@ -22,6 +22,7 @@
 PASS SanitizerAPI config: dropElements list ["I", "AM"]}, sanitizeToString function for dropElements list ["I", "AM"]}
 PASS SanitizerAPI config: dropElements list ["am", "p"]}, sanitizeToString function for dropElements list ["am", "p"]}
 PASS SanitizerAPI config: dropElements list with invalid values}, sanitizeToString function for dropElements list with invalid values}
+PASS SanitizerAPI config: blockElements list with invalid values}, sanitizeToString function for blockElements list with invalid values}
 PASS SanitizerAPI config: allowElements list ["p"]., sanitizeToString function for allowElements list ["p"].
 PASS SanitizerAPI config: allowElements list has no influence to dropElements., sanitizeToString function for allowElements list has no influence to dropElements.
 PASS SanitizerAPI config: dropAttributes list ["style"] with style attribute, sanitizeToString function for dropAttributes list ["style"] with style attribute
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js b/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js
index c8f4784..bea3bdf 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js
@@ -21,6 +21,7 @@
   {config_input: {dropElements: ["I", "AM"]}, value: "<div>balabala<am>test</am></div>", result: "<div>balabala</div>", message: "dropElements list [\"I\", \"AM\"]}"},
   {config_input: {dropElements: ["am", "p"]}, value: "<div>balabala<i>i</i><p>t</p><test>a</test></div>", result: "<div>balabala<i>i</i><test>a</test></div>", message: "dropElements list [\"am\", \"p\"]}"},
   {config_input: {dropElements: [123, [], "test", "i"]}, value: "<div>balabala<i>test</i></div><test>t</test>", result: "<div>balabala</div>", message: "dropElements list with invalid values}"},
+  {config_input: {blockElements: [123, [], "test", "i"]}, value: "<div>balabala<i>test</i></div><test>t</test>", result: "<div>balabalatest</div>t", message: "blockElements list with invalid values}"},
   {config_input: {allowElements: ["p"]}, value: "<div>test<div>p</div>tt<p>div</p></div>", result: "testptt<p>div</p>", message: "allowElements list [\"p\"]."},
   {config_input: {dropElements: ["div"], allowElements: ["div"]}, value: "<div>test</div><c>bla", result: "bla", message: "allowElements list has no influence to dropElements."},
   {config_input: {dropAttributes: ["style"]}, value: "<p style='color: black'>Click.</p>", result: "<p>Click.</p>", message: "dropAttributes list [\"style\"] with style attribute"},
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index bceec3b..3ea9049 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-10-2-64-g20186d1be
-Revision: 20186d1be6415d1bd7cb79ac56f1b806c26b677c
+Version: VER-2-10-3-1-g82d331556
+Revision: 82d331556ce73de07c16afd51a865ba1ff806a65
 CPEPrefix: cpe:/a:freetype:freetype:2.10.1
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/webrtc_overrides/BUILD.gn b/third_party/webrtc_overrides/BUILD.gn
index e215924..f62ec73 100644
--- a/third_party/webrtc_overrides/BUILD.gn
+++ b/third_party/webrtc_overrides/BUILD.gn
@@ -45,7 +45,6 @@
     "//third_party/webrtc/api/video:recordable_encoded_frame",
     "//third_party/webrtc/api/video:video_bitrate_allocation",
     "//third_party/webrtc/api/video:video_frame",
-    "//third_party/webrtc/api/video:video_frame_i420",
     "//third_party/webrtc/api/video:video_frame_metadata",
     "//third_party/webrtc/api/video:video_rtp_headers",
     "//third_party/webrtc/api/video_codecs:builtin_video_decoder_factory",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4ea129a3..5c989ec 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -22237,6 +22237,7 @@
   <int value="790" label="EduCoexistenceToSVersion"/>
   <int value="791" label="BrowsingDataLifetime"/>
   <int value="792" label="IntranetRedirectBehavior"/>
+  <int value="793" label="LacrosAllowed"/>
 </enum>
 
 <enum name="EnterprisePolicyDeviceIdValidity">
@@ -29618,15 +29619,15 @@
   <int value="3414" label="UnspecifiedTargetOriginPostMessage"/>
   <int value="3415" label="SchemelesslySameSitePostMessageSecureToInsecure"/>
   <int value="3416" label="SchemelesslySameSitePostMessageInsecureToSecure"/>
-  <int value="3417" label="BCPBroadcast"/>
-  <int value="3418" label="BCPRead"/>
-  <int value="3419" label="BCPWriteWithoutResponse"/>
-  <int value="3420" label="BCPWrite"/>
-  <int value="3421" label="BCPNotify"/>
-  <int value="3422" label="BCPIndicate"/>
-  <int value="3423" label="BCPAuthenticatedSignedWrites"/>
-  <int value="3424" label="BCPReliableWrite"/>
-  <int value="3425" label="BCPWritableAuxiliaries"/>
+  <int value="3417" label="OBSOLETE_BCPBroadcast"/>
+  <int value="3418" label="OBSOLETE_BCPRead"/>
+  <int value="3419" label="OBSOLETE_BCPWriteWithoutResponse"/>
+  <int value="3420" label="OBSOLETE_BCPWrite"/>
+  <int value="3421" label="OBSOLETE_BCPNotify"/>
+  <int value="3422" label="OBSOLETE_BCPIndicate"/>
+  <int value="3423" label="OBSOLETE_BCPAuthenticatedSignedWrites"/>
+  <int value="3424" label="OBSOLETE_BCPReliableWrite"/>
+  <int value="3425" label="OBSOLETE_BCPWritableAuxiliaries"/>
   <int value="3426" label="TextAlignSpecifiedToLegend"/>
   <int value="3427" label="V8Document_FragmentDirective_AttributeGetter"/>
   <int value="3428" label="V8StorageManager_GetDirectory_Method"/>
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_mn.xtb b/ui/accessibility/extensions/strings/accessibility_extensions_strings_mn.xtb
index 21ce4e0..00a3e2b 100644
--- a/ui/accessibility/extensions/strings/accessibility_extensions_strings_mn.xtb
+++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_mn.xtb
@@ -16,7 +16,7 @@
 <translation id="2394933097471027016">Одоо үүнийг оролдоод үзээрэй - Caret Browsing нь энэ хуудсан дээр үргэлж идэвхтэй байна!</translation>
 <translation id="2471847333270902538">Өнгөний схем <ph name="SITE" />:</translation>
 <translation id="2648340354586434750">Үгээр нь зөөхийн тулд &lt;span class='key'&gt;Option&lt;/span&gt; дээр дарна уу.</translation>
-<translation id="2795227192542594043">Энэ өргөтгөл нь  вэб хуудсан дотор хөдөлгөөнт курсорыг гаргаж өгөх бөгөөд  энэ нь танд гарнаас текстийг сонгох боломжийг олгох болно.</translation>
+<translation id="2795227192542594043">Энэ өргөтгөл нь  веб хуудсан дотор хөдөлгөөнт курсорыг гаргаж өгөх бөгөөд  энэ нь танд гарнаас текстийг сонгох боломжийг олгох болно.</translation>
 <translation id="2808027189040546825">Алхам 1: Хамгийн бүдэг өнгөтэй одтой эгнээнээс сонгоно уу:</translation>
 <translation id="2965611304828530558">&lt;p&gt; Таныг линк эсвэл удирдлага руу хүрэх үед үүнийг автоматаар төвлөрүүлнэ. Линк эсвэл товчлуур дарахын тулд Press &lt;span class='key'&gt;Enter&lt;/span&gt; дээр дарж орно уу.  &lt;/p&gt; &lt;p&gt;  Төвлөрүүлсэн удирдлага нь чиглүүлэгч сумуудыг өөртөө татах үед (текстийн хайрцаг эсвэл жагсаалтын хайрцагтай адил) Тесктээр хайлгагчийг үргэлжлүүлэхийн тулд баруун эсвэл зүүн чиглүүлэгч сум бүхий &lt;span class='key'&gt;Esc&lt;/span&gt; дээр дарна. &lt;/p&gt; &lt;p&gt; Эсвэл  төвлөрүүлэх боломжтой дараагийн удирдлага руу шилжинэ. &lt;/p&gt;</translation>
 <translation id="3252573918265662711">Тохиргоо хийх.</translation>
@@ -25,7 +25,7 @@
 <translation id="3622586652998721735">Анхдагч схемээр тохируулах</translation>
 <translation id="3812541808639806898">Зургийн холбогдох текстийг харагч</translation>
 <translation id="381767806621926835">"longdesc" эсвэл "aria-describedat" шинж бүхий аливаа өгөгдөл дээр хулганын баруун талд даран нэмэлт тайлбар авах.</translation>
-<translation id="4023902424053835668">Чиглүүлэгч сумуудыг ашиглан вэб хуудасны текстийг идвэхжүүл.</translation>
+<translation id="4023902424053835668">Чиглүүлэгч сумуудыг ашиглан веб хуудасны текстийг идвэхжүүл.</translation>
 <translation id="4388820049312272371">Гэрэл хурдан анивчдаг курсорын байрлалыг тодруулна уу.</translation>
 <translation id="4394049700291259645">Идэвхгүй болгох</translation>
 <translation id="4769065380738716500">Зургийг тусгай текстээр орлуулсан байна.</translation>
@@ -43,7 +43,7 @@
 <translation id="5594989420907487559">Хөдөлгөөнт зургийг зөвхөн нэг удаа ажиллуулах юмуу эсвэл хөдөлгөөнт зургийг тэр чигт нь идэвхгүй болгоно уу.</translation>
 <translation id="5631241868147802353">Анхдагч өнгөний схем:</translation>
 <translation id="5650358096585648000">Харах боломжтой хариу мэдээлэл</translation>
-<translation id="5710185147685935461">Вэб хуудаснуудыг уншихад хялбар болгохын тулд өнгөний схемийг өөрчлөх эсвэл хувиргана уу.</translation>
+<translation id="5710185147685935461">Веб хуудаснуудыг уншихад хялбар болгохын тулд өнгөний схемийг өөрчлөх эсвэл хувиргана уу.</translation>
 <translation id="5939518447894949180">Дахин сэргээх</translation>
 <translation id="595639123821853262">Хувиргасан хар цагаан өнгүүд</translation>
 <translation id="6017514345406065928">Ногоон</translation>
diff --git a/ui/base/webui/jstemplate_builder.cc b/ui/base/webui/jstemplate_builder.cc
index 50c5250..f18b3360 100644
--- a/ui/base/webui/jstemplate_builder.cc
+++ b/ui/base/webui/jstemplate_builder.cc
@@ -41,7 +41,7 @@
   // fetch and cache the pointer of the jstemplate resource source text.
   std::string load_time_data_src =
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
-          IDR_WEBUI_JS_LOAD_TIME_DATA);
+          IDR_WEBUI_JS_LOAD_TIME_DATA_JS);
 
   if (load_time_data_src.empty()) {
     NOTREACHED() << "Unable to get loadTimeData src";
@@ -58,7 +58,7 @@
   // fetch and cache the pointer of the jstemplate resource source text.
   std::string jstemplate_src =
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
-          IDR_WEBUI_JSTEMPLATE_JS);
+          IDR_WEBUI_JS_JSTEMPLATE_COMPILED_JS);
 
   if (jstemplate_src.empty()) {
     NOTREACHED() << "Unable to get jstemplate src";
diff --git a/ui/base/webui/web_ui_util.cc b/ui/base/webui/web_ui_util.cc
index 152d1b20..f3c192e 100644
--- a/ui/base/webui/web_ui_util.cc
+++ b/ui/base/webui/web_ui_util.cc
@@ -207,14 +207,14 @@
   const ui::ResourceBundle& resource_bundle =
       ui::ResourceBundle::GetSharedInstance();
   return GetWebUiCssTextDefaults(
-      resource_bundle.LoadDataResourceString(IDR_WEBUI_CSS_TEXT_DEFAULTS));
+      resource_bundle.LoadDataResourceString(IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS));
 }
 
 std::string GetWebUiCssTextDefaultsMd() {
   const ui::ResourceBundle& resource_bundle =
       ui::ResourceBundle::GetSharedInstance();
-  return GetWebUiCssTextDefaults(
-      resource_bundle.LoadDataResourceString(IDR_WEBUI_CSS_TEXT_DEFAULTS_MD));
+  return GetWebUiCssTextDefaults(resource_bundle.LoadDataResourceString(
+      IDR_WEBUI_CSS_TEXT_DEFAULTS_MD_CSS));
 }
 
 void AppendWebUiCssTextDefaults(std::string* html) {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
index 39ebb98a..443b62d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -61,6 +61,7 @@
 <translation id="1538729222189715449">Opening Linux files...</translation>
 <translation id="1547964879613821194">Canadian English</translation>
 <translation id="1556189134700913550">Apply to all</translation>
+<translation id="1561842594491319104">Chrome devices</translation>
 <translation id="1572585716423026576">Set as wallpaper</translation>
 <translation id="158809615184981282">Faroese keyboard</translation>
 <translation id="1589128298353575783"><ph name="NUMBER_OF_PB" /> PB</translation>
@@ -190,6 +191,7 @@
 <translation id="3064388234319122767">Transliteration (zdravo → здраво)</translation>
 <translation id="3067790092342515856">Windows files</translation>
 <translation id="3078461028045006476">Share with <ph name="EXTENSION_NAME" /></translation>
+<translation id="3083975830683400843">Chromebits</translation>
 <translation id="3116361045094675131">UK keyboard</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3144126448740580210">DONE</translation>
@@ -344,6 +346,7 @@
 <translation id="4804827417948292437">Avocado</translation>
 <translation id="4823651846660089135">Device is read-only</translation>
 <translation id="4839847978919684242"><ph name="SELCTED_FILES_COUNT" /> items selected</translation>
+<translation id="4843566743023903107">Chromebases</translation>
 <translation id="4849981557599196363">German (Belgium)</translation>
 <translation id="4850886885716139402">View</translation>
 <translation id="485316830061041779">German</translation>
@@ -473,6 +476,7 @@
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="5949281959820712067">Give Linux apps permission to modify files in your Google Drive. Changes will sync to your other devices.</translation>
 <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> items</translation>
+<translation id="5957366693331451795">Chromeboxes</translation>
 <translation id="5982621672636444458">Sort options</translation>
 <translation id="6005282720244019462">Latin American keyboard</translation>
 <translation id="6007237601604674381">Move failed. <ph name="ERROR_MESSAGE" /></translation>
@@ -632,6 +636,7 @@
     <ph name="MARKUP_4" />delete files from your Downloads folder<ph name="MARKUP_5" /></translation>
 <translation id="7794058097940213561">Format device</translation>
 <translation id="7799329977874311193">HTML document</translation>
+<translation id="7801354353640549019">Chromebooks</translation>
 <translation id="7805768142964895445">Status</translation>
 <translation id="7821462174190887129"><ph name="FILE_COUNT" /> found.
     <ph name="LINE_BREAK1" />
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
index 253a4d2..5cde97e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -458,7 +458,7 @@
 <translation id="5833610766403489739">Энэ файл нь хаа нэгтээ байна. Татацын байршлын тохиргоогоо шалгаад дахин оролдож үзнэ үү.</translation>
 <translation id="5838451609423551646">Сонголт хийх хэсгээс бүх оролтыг хассан.</translation>
 <translation id="5838825566232597749">Олон улсын US Workman гар</translation>
-<translation id="5850516540536751549">Энэ файлын төрлийг дэмждэггүй. Ийм төрөлтэй файлыг нээхийн тулд тохирохыг программыг <ph name="BEGIN_LINK" />Chrome Вэб Дэлгүүр<ph name="END_LINK" />-ээс олно уу.
+<translation id="5850516540536751549">Энэ файлын төрлийг дэмждэггүй. Ийм төрөлтэй файлыг нээхийн тулд тохирохыг программыг <ph name="BEGIN_LINK" />Chrome Веб Дэлгүүр<ph name="END_LINK" />-ээс олно уу.
      <ph name="BEGIN_LINK_HELP" />Дэлгэрэнгүй мэдээллийг эндээс<ph name="END_LINK_HELP" /></translation>
 <translation id="5851063901794976166">Энд харах зүйл алга..</translation>
 <translation id="5857774240076772505">Linux-д <ph name="FOLDER_NAME" /> фолдерт файл өөрчлөх аппын зөвшөөрлийг олгоно уу</translation>
@@ -747,7 +747,7 @@
 <translation id="9064939804718829769">Шилжүүлж байна...</translation>
 <translation id="9065203028668620118">Засварлах</translation>
 <translation id="9099674669267916096">Хуудасны тоо</translation>
-<translation id="9110990317705400362">Бид таны вэб хөтчийг илүү аюулгүй болгох аргыг үргэлж хайж байдаг. Өмнө нь ямар ч вэб сайт таны вэб хөтчид өргөтгөл нэмэхийг таниас хүсэж болдог байсан. Google Chrome-ийн сүүлийн үеийн хувилбаруудын тусламжтай та эдгээр өргөтгөлүүдийг Өргөтгөлийн хуудсанд нэмсэнээр суурьлуулж болох сонголтыг Chrome-д хийж болно. <ph name="BEGIN_LINK" />Дэлгэрэнгүй мэдээллийг<ph name="END_LINK" /></translation>
+<translation id="9110990317705400362">Бид таны веб хөтчийг илүү аюулгүй болгох аргыг үргэлж хайж байдаг. Өмнө нь ямар ч вебсайт таны веб хөтчид өргөтгөл нэмэхийг таниас хүсэж болдог байсан. Google Chrome-ийн сүүлийн үеийн хувилбаруудын тусламжтай та эдгээр өргөтгөлүүдийг Өргөтгөлийн хуудсанд нэмсэнээр суурьлуулж болох сонголтыг Chrome-д хийж болно. <ph name="BEGIN_LINK" />Дэлгэрэнгүй мэдээллийг<ph name="END_LINK" /></translation>
 <translation id="9111102763498581341">Нээх</translation>
 <translation id="912419004897138677">Кодлогч</translation>
 <translation id="9129931661813833980">Фолдерийг тогтоох</translation>
diff --git a/ui/strings/translations/ui_strings_mn.xtb b/ui/strings/translations/ui_strings_mn.xtb
index ae4fec5..fb1b44c 100644
--- a/ui/strings/translations/ui_strings_mn.xtb
+++ b/ui/strings/translations/ui_strings_mn.xtb
@@ -37,7 +37,7 @@
 <translation id="1842960171412779397">сонгох</translation>
 <translation id="1859234291848436338">Чиглэл бичих</translation>
 <translation id="1860796786778352021">Мэдэгдлийг хаах</translation>
-<translation id="186476001994626254">Вэбийн ухаалгаар буулгах контент</translation>
+<translation id="186476001994626254">Вебийн ухаалгаар буулгах контент</translation>
 <translation id="1871244248791675517">Ins</translation>
 <translation id="1884435127456172652"><ph name="NUMBER" /> %</translation>
 <translation id="1901303067676059328">Бүгдийг сонго &amp;</translation>
@@ -161,12 +161,12 @@
 <translation id="6040143037577758943">Хаах</translation>
 <translation id="6119846243427417423">идэвхжүүлэх</translation>
 <translation id="6129953537138746214">Space</translation>
-<translation id="6134259848159370930">Төхөөрөмж, апп, тохиргоо, вэбээс хайна уу.</translation>
+<translation id="6134259848159370930">Төхөөрөмж, апп, тохиргоо, вебээс хайна уу.</translation>
 <translation id="6135826906199951471">Устгах</translation>
 <translation id="6142413573757616983"><ph name="QUANTITY" /> B/s</translation>
 <translation id="6156262341071374681">Бүх аппыг харуулах</translation>
 <translation id="6165508094623778733">Нэмэлт мэдээлэл авах</translation>
-<translation id="6166852626429024716">Төхөөрөмж, апп, тохиргоо, вэбээс хайх...</translation>
+<translation id="6166852626429024716">Төхөөрөмж, апп, тохиргоо, вебээс хайх...</translation>
 <translation id="6264365405983206840">Бүгдийг сонгох</translation>
 <translation id="6351032674660237738">АППЫН ЗӨВЛӨМЖ</translation>
 <translation id="6364916375976753737">Зүүн тийш гүйлгэх</translation>
@@ -190,7 +190,7 @@
 <translation id="6845383723252244143">Folder сонгох</translation>
 <translation id="6845533974506654842">Дарах</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 цаг үлдсэн}other{# цаг үлдсэн}}</translation>
-<translation id="688711909580084195">Гарчиггүй вэб хуудас</translation>
+<translation id="688711909580084195">Гарчиггүй веб хуудас</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/с</translation>
 <translation id="6917971086528278418">{YEARS,plural, =1{1 жил үлдсэн}other{# жил үлдсэн}}</translation>
 <translation id="6945221475159498467">Сонгох</translation>
@@ -241,7 +241,7 @@
 <translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> Файл (. <ph name="SAVEAS_EXTENSION_NAME" /> )</translation>
 <translation id="8649597172973390955">Shelf-г тогтмол харуулна</translation>
 <translation id="8677655579646609597"><ph name="QUANTITY" /> КБ/с</translation>
-<translation id="8685326675965865247">Төхөөрөмж, апп, тохиргоо, вэбээ хайна уу. Аппуудын хооронд шилжихийн тулд сумтай товчлууруудыг ашиглана уу.</translation>
+<translation id="8685326675965865247">Төхөөрөмж, апп, тохиргоо, вебээ хайна уу. Аппуудын хооронд шилжихийн тулд сумтай товчлууруудыг ашиглана уу.</translation>
 <translation id="8725488761726303204">бусад +<ph name="NUMBER" /></translation>
 <translation id="8730621377337864115">хийсэн</translation>
 <translation id="8772073294905169192">{HOURS,plural, =1{1 цаг}other{# цаг}}</translation>
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc
index 7399ae7..043000f 100644
--- a/ui/views/bubble/bubble_frame_view.cc
+++ b/ui/views/bubble/bubble_frame_view.cc
@@ -132,6 +132,20 @@
 
 // static
 std::unique_ptr<Button> BubbleFrameView::CreateCloseButton(
+    Button::PressedCallback callback) {
+  auto close_button = CreateVectorImageButtonWithNativeTheme(
+      std::move(callback), vector_icons::kCloseRoundedIcon);
+  close_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_APP_CLOSE));
+  close_button->SizeToPreferredSize();
+  close_button->SetFocusForPlatform();
+
+  InstallCircleHighlightPathGenerator(close_button.get());
+
+  return close_button;
+}
+
+// static
+std::unique_ptr<Button> BubbleFrameView::CreateCloseButton(
     ButtonListener* listener) {
   auto close_button = CreateVectorImageButtonWithNativeTheme(
       listener, vector_icons::kCloseRoundedIcon);
@@ -146,6 +160,21 @@
 
 // static
 std::unique_ptr<Button> BubbleFrameView::CreateMinimizeButton(
+    Button::PressedCallback callback) {
+  auto minimize_button = CreateVectorImageButtonWithNativeTheme(
+      std::move(callback), kWindowControlMinimizeIcon);
+  minimize_button->SetTooltipText(
+      l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE));
+  minimize_button->SizeToPreferredSize();
+  minimize_button->SetFocusForPlatform();
+
+  InstallCircleHighlightPathGenerator(minimize_button.get());
+
+  return minimize_button;
+}
+
+// static
+std::unique_ptr<Button> BubbleFrameView::CreateMinimizeButton(
     ButtonListener* listener) {
   auto minimize_button = CreateVectorImageButtonWithNativeTheme(
       listener, kWindowControlMinimizeIcon);
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h
index 117f032..0b1463c 100644
--- a/ui/views/bubble/bubble_frame_view.h
+++ b/ui/views/bubble/bubble_frame_view.h
@@ -46,9 +46,13 @@
       const base::string16& title_text);
 
   // Creates a close button used in the corner of the dialog.
+  static std::unique_ptr<Button> CreateCloseButton(
+      Button::PressedCallback callback);
   static std::unique_ptr<Button> CreateCloseButton(ButtonListener* listener);
 
   // Creates a minimize button used in the corner of the dialog.
+  static std::unique_ptr<Button> CreateMinimizeButton(
+      Button::PressedCallback callback);
   static std::unique_ptr<Button> CreateMinimizeButton(ButtonListener* listener);
 
   // NonClientFrameView:
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index 6df4eec..38c4c39 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -1599,6 +1599,92 @@
   EXPECT_EQ(1, enter_view->count());  // Now we see the accelerator.
 }
 
+// Simulate 'a' and candidate selection keys. This should just insert "啊",
+// suppressing accelerators.
+TEST_F(BridgedNativeWidgetTest, TextInput_NoAcceleratorPinyinSelectWord) {
+  Textfield* textfield = InstallTextField("");
+  EXPECT_TRUE([ns_view_ textInputClient]);
+
+  EnterAcceleratorView* enter_view = new EnterAcceleratorView();
+  textfield->parent()->AddChildView(enter_view);
+
+  // Sequence of calls (and corresponding keyDown events) obtained via tracing
+  // with Pinyin IME and pressing 'a', Tab, PageDown, PageUp, Right, Down, Left,
+  // and finally Up on the keyboard.
+  // Note 0 is the actual keyCode for 'a', not a placeholder.
+  NSEvent* a_in_ime = UnicodeKeyDown(0, @"a");
+  InterpretKeyEventsCallback handle_a_in_ime = base::BindRepeating([](id view) {
+    // Pinyin does not change composition text while selecting candidate words.
+    [view setMarkedText:@"a"
+           selectedRange:NSMakeRange(1, 0)
+        replacementRange:NSMakeRange(NSNotFound, 0)];
+  });
+
+  InterpretKeyEventsCallback handle_tab_in_ime =
+      base::BindRepeating([](id view) {
+        [view setMarkedText:@"ā"
+               selectedRange:NSMakeRange(0, 1)
+            replacementRange:NSMakeRange(NSNotFound, 0)];
+      });
+
+  // Composition text will not change in candidate selection.
+  InterpretKeyEventsCallback handle_candidate_select_in_ime =
+      base::BindRepeating([](id view) {});
+
+  InterpretKeyEventsCallback handle_space_in_ime =
+      base::BindRepeating([](id view) {
+        // Space will confirm the composition.
+        [view insertText:@"啊" replacementRange:NSMakeRange(NSNotFound, 0)];
+      });
+
+  InterpretKeyEventsCallback handle_enter_in_ime =
+      base::BindRepeating([](id view) {
+        // Space after Space will generate -insertNewLine:.
+        [view doCommandBySelector:@selector(insertNewLine:)];
+      });
+
+  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->GetText());
+  EXPECT_EQ(0, enter_view->count());
+
+  object_setClass(ns_view_, [InterpretKeyEventMockedBridgedContentView class]);
+  g_fake_interpret_key_events = &handle_a_in_ime;
+  [ns_view_ keyDown:a_in_ime];
+  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->GetText());
+  EXPECT_EQ(0, enter_view->count());
+
+  g_fake_interpret_key_events = &handle_tab_in_ime;
+  [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
+  EXPECT_EQ(base::SysNSStringToUTF16(@"ā"), textfield->GetText());
+  EXPECT_EQ(0, enter_view->count());  // Not seen as an accelerator.
+
+  // Pinyin changes candidate word on this sequence of keys without changing the
+  // composition text. At the end of this sequence, the word "啊" should be
+  // selected.
+  const ui::KeyboardCode key_seqence[] = {ui::VKEY_NEXT,  ui::VKEY_PRIOR,
+                                          ui::VKEY_RIGHT, ui::VKEY_DOWN,
+                                          ui::VKEY_LEFT,  ui::VKEY_UP};
+
+  g_fake_interpret_key_events = &handle_candidate_select_in_ime;
+  for (auto key : key_seqence) {
+    [ns_view_ keyDown:VkeyKeyDown(key)];
+    EXPECT_EQ(base::SysNSStringToUTF16(@"ā"),
+              textfield->GetText());  // No change.
+    EXPECT_EQ(0, enter_view->count());
+  }
+
+  // Space to confirm composition
+  g_fake_interpret_key_events = &handle_space_in_ime;
+  [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_SPACE)];
+  EXPECT_EQ(base::SysNSStringToUTF16(@"啊"), textfield->GetText());
+  EXPECT_EQ(0, enter_view->count());
+
+  // The next Enter should be processed as accelerator.
+  g_fake_interpret_key_events = &handle_enter_in_ime;
+  [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
+  EXPECT_EQ(base::SysNSStringToUTF16(@"啊"), textfield->GetText());
+  EXPECT_EQ(1, enter_view->count());
+}
+
 // Simulate 'a', Enter in Hiragana. This should just insert "あ", suppressing
 // accelerators.
 TEST_F(BridgedNativeWidgetTest, TextInput_NoAcceleratorEnterComposition) {
diff --git a/ui/webui/resources/cr_elements_images.grdp b/ui/webui/resources/cr_elements_images.grdp
index f7c1c79..4e2836b 100644
--- a/ui/webui/resources/cr_elements_images.grdp
+++ b/ui/webui/resources/cr_elements_images.grdp
@@ -3,50 +3,50 @@
   <!-- TODO(dschuyler): Many of these may be included for the unit tests which
        don't appear to flatten the html. We may be able to avoid including
        these if the browser_tests would not try to load them. -->
-  <include name="IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G"
+  <include name="IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G_PNG"
            file="images/200-logo_googleg.png" type="BINDATA" compress="gzip" />
-  <include name="IDR_WEBUI_IMAGES_ARROW_DOWN"
+  <include name="IDR_WEBUI_IMAGES_ARROW_DOWN_SVG"
            file="images/arrow_down.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ARROW_RIGHT"
+  <include name="IDR_WEBUI_IMAGES_ARROW_RIGHT_SVG"
            file="images/arrow_right.svg" type="BINDATA" />
   <include name="IDR_WEBUI_IMAGES_BUSINESS" file="images/business.svg"
            type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_DARK_ARROW_DOWN"
+  <include name="IDR_WEBUI_IMAGES_DARK_ARROW_DOWN_SVG"
            file="images/dark/arrow_down.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH"
+  <include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH_SVG"
            file="images/dark/icon_search.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_ARROW_BACK"
+  <include name="IDR_WEBUI_IMAGES_ICON_ARROW_BACK_SVG"
            file="images/icon_arrow_back.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_ARROW_DROPDOWN"
+  <include name="IDR_WEBUI_IMAGES_ICON_ARROW_DROPDOWN_SVG"
            file="images/icon_arrow_dropdown.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_CANCEL"
+  <include name="IDR_WEBUI_IMAGES_ICON_CANCEL_SVG"
            file="images/icon_cancel.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_CLEAR"
+  <include name="IDR_WEBUI_IMAGES_ICON_CLEAR_SVG"
            file="images/icon_clear.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_DELETE_GRAY"
+  <include name="IDR_WEBUI_IMAGES_ICON_DELETE_GRAY_SVG"
            file="images/icon_delete_gray.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_LESS"
+  <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_LESS_SVG"
            file="images/icon_expand_less.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_MORE"
+  <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_MORE_SVG"
            file="images/icon_expand_more.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_EXTERNAL"
+  <include name="IDR_WEBUI_IMAGES_ICON_EXTERNAL_SVG"
            file="images/open_in_new.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_MORE_VERT"
+  <include name="IDR_WEBUI_IMAGES_ICON_MORE_VERT_SVG"
            file="images/icon_more_vert.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_PICTURE_DELETE"
+  <include name="IDR_WEBUI_IMAGES_ICON_PICTURE_DELETE_SVG"
            file="images/icon_picture_delete.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_REFRESH"
+  <include name="IDR_WEBUI_IMAGES_ICON_REFRESH_SVG"
            file="images/icon_refresh.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_SEARCH"
+  <include name="IDR_WEBUI_IMAGES_ICON_SEARCH_SVG"
            file="images/icon_search.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_SETTINGS"
+  <include name="IDR_WEBUI_IMAGES_ICON_SETTINGS_SVG"
            file="images/icon_settings.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY"
+  <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_SVG"
            file="images/icon_visibility.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF"
+  <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF_SVG"
            file="images/icon_visibility_off.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_ICON_COPY_CONTENT"
+  <include name="IDR_WEBUI_IMAGES_ICON_COPY_CONTENT_SVG"
            file="images/icon_copy_content.svg" type="BINDATA" />
-  <include name="IDR_WEBUI_IMAGES_OPEN_IN_NEW"
+  <include name="IDR_WEBUI_IMAGES_OPEN_IN_NEW_SVG"
            file="images/open_in_new.svg" type="BINDATA" />
 </grit-part>
diff --git a/ui/webui/resources/js/cr.m.js b/ui/webui/resources/js/cr.m.js
index 3e0a65f16..e3d9a3d 100644
--- a/ui/webui/resources/js/cr.m.js
+++ b/ui/webui/resources/js/cr.m.js
@@ -59,6 +59,23 @@
 }
 
 /**
+ * Fires a property change event on the target.
+ * @param {!EventTarget} target The target to dispatch the event on.
+ * @param {string} propertyName The name of the property that changed.
+ * @param {*} newValue The new value for the property.
+ * @param {*} oldValue The old value for the property.
+ */
+export function dispatchPropertyChange(
+    target, propertyName, newValue, oldValue) {
+  const e = new Event(propertyName + 'Change');
+  e.propertyName = propertyName;
+  e.newValue = newValue;
+  e.oldValue = oldValue;
+  target.dispatchEvent(e);
+}
+
+
+/**
  * The mapping used by the sendWithPromise mechanism to tie the Promise
  * returned to callers with the corresponding WebUI response. The mapping is
  * from ID to the PromiseResolver helper; the ID is generated by
diff --git a/ui/webui/resources/js/cr/BUILD.gn b/ui/webui/resources/js/cr/BUILD.gn
index d68bb45..66ce7ae6 100644
--- a/ui/webui/resources/js/cr/BUILD.gn
+++ b/ui/webui/resources/js/cr/BUILD.gn
@@ -14,7 +14,10 @@
 
 js_type_check("closure_compile_modules") {
   uses_js_modules = true
-  deps = [ ":event_target.m" ]
+  deps = [
+    ":event_target.m",
+    ":ui.m",
+  ]
 }
 
 js_library("event_target") {
@@ -30,7 +33,15 @@
   extra_deps = [ ":modulize" ]
 }
 
+js_library("ui.m") {
+  sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui.m.js" ]
+  extra_deps = [ ":modulize" ]
+}
+
 js_modulizer("modulize") {
-  input_files = [ "event_target.js" ]
+  input_files = [
+    "event_target.js",
+    "ui.js",
+  ]
   deps = [ "ui:modulize" ]
 }
diff --git a/ui/webui/resources/js/cr/ui.js b/ui/webui/resources/js/cr/ui.js
index a054874a..aefe25c 100644
--- a/ui/webui/resources/js/cr/ui.js
+++ b/ui/webui/resources/js/cr/ui.js
@@ -12,7 +12,7 @@
    *     needs to have a {@code decorate} function.
    * @closurePrimitive {asserts.matchesReturn}
    */
-  function decorate(source, constr) {
+  /* #export */ function decorate(source, constr) {
     let elements;
     if (typeof source === 'string') {
       elements = document.querySelectorAll(source);
@@ -63,7 +63,7 @@
    *     an optional property bag. The function also has a static
    *     {@code decorate} method added to it.
    */
-  function define(tagNameOrFunction) {
+  /* #export */ function define(tagNameOrFunction) {
     let createFunction, tagName;
     if (typeof tagNameOrFunction === 'function') {
       createFunction = tagNameOrFunction;
@@ -96,7 +96,9 @@
      */
     f.decorate = function(el) {
       el.__proto__ = f.prototype;
-      el.decorate();
+      if (el.decorate) {
+        el.decorate();
+      }
     };
 
     return f;
@@ -112,7 +114,7 @@
    * @param {number} min The minimum width.
    * @param {number=} opt_scale Optional scale factor to apply to the width.
    */
-  function limitInputWidth(el, parentEl, min, opt_scale) {
+  /* #export */ function limitInputWidth(el, parentEl, min, opt_scale) {
     // Needs a size larger than borders
     el.style.width = '10px';
     const doc = el.ownerDocument;
@@ -167,7 +169,7 @@
    * @param {number} pixels The number of pixels.
    * @return {string} e.g. '16px'.
    */
-  function toCssPx(pixels) {
+  /* #export */ function toCssPx(pixels) {
     if (!window.isFinite(pixels)) {
       console.error('Pixel value is not a number: ' + pixels);
     }
@@ -180,7 +182,7 @@
    * the doubleclick time interval.
    * @param {MouseEvent} e Initial click event.
    */
-  function swallowDoubleClick(e) {
+  /* #export */ function swallowDoubleClick(e) {
     const doc = e.target.ownerDocument;
     let counter = Math.min(1, e.detail);
     function swallow(e) {
@@ -207,6 +209,7 @@
     }, 0);
   }
 
+  // #cr_define_end
   return {
     decorate: decorate,
     define: define,
diff --git a/ui/webui/resources/js/cr/ui/BUILD.gn b/ui/webui/resources/js/cr/ui/BUILD.gn
index 0b066e08..d8039c4b 100644
--- a/ui/webui/resources/js/cr/ui/BUILD.gn
+++ b/ui/webui/resources/js/cr/ui/BUILD.gn
@@ -248,6 +248,8 @@
 
 js_modulizer("modulize") {
   input_files = [
+    "array_data_model.js",
+    "dialogs.js",
     "drag_wrapper.js",
     "focus_grid.js",
     "focus_outline_manager.js",
@@ -255,15 +257,30 @@
     "focus_row_behavior.js",
     "focus_without_ink.js",
     "keyboard_shortcut_list.js",
+    "list_selection_controller.js",
+    "list_selection_model.js",
+    "list_single_selection_model.js",
+    "position_util.js",
+    "splitter.js",
     "store.js",
     "store_client.js",
   ]
   namespace_rewrites = [
+    "cr.dispatchPropertyChange|dispatchPropertyChange",
+    "cr.EventTarget|EventTarget",
+    "cr.ui.dialogs.BaseDialog|BaseDialog",
+    "cr.ui.dialogs.AlertDialog|AlertDialog",
+    "cr.ui.dialogs.ConfirmDialog|ConfirmDialog",
+    "cr.ui.dialogs.PromptDialog|PromptDialog",
     "cr.ui.Action|Action",
+    "cr.ui.AnchorType|AnchorType",
+    "cr.ui.ArrayDataModel|ArrayDataModel",
+    "cr.ui.define|crUiDefine",
     "cr.ui.DeferredAction|DeferredAction",
     "cr.ui.DragWrapperDelegate|DragWrapperDelegate",
     "cr.ui.FocusRowDelegate|FocusRowDelegate",
     "cr.ui.FocusRow|FocusRow",
+    "cr.ui.ListSelectionModel|ListSelectionModel",
     "cr.ui.StoreObserver|StoreObserver",
     "cr.ui.VirtualFocusRow|VirtualFocusRow",
   ]
@@ -272,6 +289,8 @@
 js_type_check("ui_resources_modules") {
   is_polymer3 = true
   deps = [
+    ":array_data_model.m",
+    ":dialogs.m",
     ":drag_wrapper.m",
     ":focus_grid.m",
     ":focus_outline_manager.m",
@@ -279,11 +298,32 @@
     ":focus_row_behavior.m",
     ":focus_without_ink.m",
     ":keyboard_shortcut_list.m",
+    ":list_selection_controller.m",
+    ":list_selection_model.m",
+    ":list_single_selection_model.m",
+    ":position_util.m",
+    ":splitter.m",
     ":store.m",
     ":store_client.m",
   ]
 }
 
+js_library("array_data_model.m") {
+  sources =
+      [ "$root_gen_dir/ui/webui/resources/js/cr/ui/array_data_model.m.js" ]
+  deps = [
+    "..:event_target.m",
+    "../..:assert.m",
+  ]
+
+  extra_deps = [ ":modulize" ]
+}
+
+js_library("dialogs.m") {
+  sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/dialogs.m.js" ]
+  extra_deps = [ ":modulize" ]
+}
+
 js_library("drag_wrapper.m") {
   sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/drag_wrapper.m.js" ]
   extra_deps = [ ":modulize" ]
@@ -343,6 +383,50 @@
   extra_deps = [ ":modulize" ]
 }
 
+js_library("list_selection_controller.m") {
+  sources = [
+    "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_controller.m.js",
+  ]
+  deps = [
+    ":list_selection_model.m",
+    "../..:cr.m",
+  ]
+  extra_deps = [ ":modulize" ]
+}
+
+js_library("list_selection_model.m") {
+  sources =
+      [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_model.m.js" ]
+  deps = [
+    "..:event_target.m",
+    "../..:cr.m",
+  ]
+  extra_deps = [ ":modulize" ]
+}
+
+js_library("list_single_selection_model.m") {
+  sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_single_selection_model.m.js" ]
+  deps = [
+    "..:event_target.m",
+    "../..:cr.m",
+  ]
+  extra_deps = [ ":modulize" ]
+}
+
+js_library("position_util.m") {
+  sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/position_util.m.js" ]
+  extra_deps = [ ":modulize" ]
+}
+
+js_library("splitter.m") {
+  sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/splitter.m.js" ]
+  deps = [
+    "..:ui.m",
+    "../..:cr.m",
+  ]
+  extra_deps = [ ":modulize" ]
+}
+
 js_library("store.m") {
   sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/store.m.js" ]
   extra_deps = [ ":modulize" ]
diff --git a/ui/webui/resources/js/cr/ui/array_data_model.js b/ui/webui/resources/js/cr/ui/array_data_model.js
index cc35657..9974ce47 100644
--- a/ui/webui/resources/js/cr/ui/array_data_model.js
+++ b/ui/webui/resources/js/cr/ui/array_data_model.js
@@ -13,13 +13,15 @@
 // with a copyright comment anyway.
 
 // <include src="../../assert.js">
+// #import {assert} from '../../assert.m.js';
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
 
 cr.define('cr.ui', function() {
   /**
    * A data model that wraps a simple array and supports sorting by storing
    * initial indexes of elements for each position in sorted array.
    */
-  class ArrayDataModel extends cr.EventTarget {
+  /* #export */ class ArrayDataModel extends cr.EventTarget {
     /**
      * @param {!Array} array The underlying array.
      */
@@ -457,5 +459,6 @@
     }
   }
 
+  // #cr_define_end
   return {ArrayDataModel: ArrayDataModel};
 });
diff --git a/ui/webui/resources/js/cr/ui/dialogs.js b/ui/webui/resources/js/cr/ui/dialogs.js
index 055f606..6c17b44 100644
--- a/ui/webui/resources/js/cr/ui/dialogs.js
+++ b/ui/webui/resources/js/cr/ui/dialogs.js
@@ -6,7 +6,7 @@
   /**
    * @constructor
    */
-  function BaseDialog(parentNode) {
+  /* #export */ function BaseDialog(parentNode) {
     this.parentNode_ = parentNode;
     this.document_ = parentNode.ownerDocument;
 
@@ -329,7 +329,7 @@
    * @constructor
    * @extends {cr.ui.dialogs.BaseDialog}
    */
-  function AlertDialog(parentNode) {
+  /* #export */ function AlertDialog(parentNode) {
     BaseDialog.call(this, parentNode);
     this.cancelButton.style.display = 'none';
   }
@@ -351,7 +351,7 @@
    * @constructor
    * @extends {cr.ui.dialogs.BaseDialog}
    */
-  function ConfirmDialog(parentNode) {
+  /* #export */ function ConfirmDialog(parentNode) {
     BaseDialog.call(this, parentNode);
   }
 
@@ -363,7 +363,7 @@
    * @constructor
    * @extends {cr.ui.dialogs.BaseDialog}
    */
-  function PromptDialog(parentNode) {
+  /* #export */ function PromptDialog(parentNode) {
     BaseDialog.call(this, parentNode);
     this.input_ = this.document_.createElement('input');
     this.input_.setAttribute('type', 'text');
@@ -416,6 +416,7 @@
     }
   };
 
+  // #cr_define_end
   return {
     BaseDialog: BaseDialog,
     AlertDialog: AlertDialog,
diff --git a/ui/webui/resources/js/cr/ui/list_selection_controller.js b/ui/webui/resources/js/cr/ui/list_selection_controller.js
index 0a18b1d..0692f91 100644
--- a/ui/webui/resources/js/cr/ui/list_selection_controller.js
+++ b/ui/webui/resources/js/cr/ui/list_selection_controller.js
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// #import {isMac, isChromeOS} from '../../cr.m.js';
+// #import {ListSelectionModel} from './list_selection_model.m.js';
+
 cr.define('cr.ui', function() {
   /**
    * Creates a selection controller that is to be used with lists. This is
@@ -15,7 +18,7 @@
    *
    * @constructor
    */
-  function ListSelectionController(selectionModel) {
+  /* #export */ function ListSelectionController(selectionModel) {
     this.selectionModel_ = selectionModel;
   }
 
@@ -304,5 +307,6 @@
     }
   };
 
+  // #cr_define_end
   return {ListSelectionController: ListSelectionController};
 });
diff --git a/ui/webui/resources/js/cr/ui/list_selection_model.js b/ui/webui/resources/js/cr/ui/list_selection_model.js
index 28ddbdb0..bd49f601 100644
--- a/ui/webui/resources/js/cr/ui/list_selection_model.js
+++ b/ui/webui/resources/js/cr/ui/list_selection_model.js
@@ -2,12 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
+// #import {isMac, isChromeOS, dispatchPropertyChange} from '../../cr.m.js';
+
 cr.define('cr.ui', function() {
   /**
    * Creates a new selection model that is to be used with lists.
    *
    */
-  class ListSelectionModel extends cr.EventTarget {
+  /* #export */ class ListSelectionModel extends cr.EventTarget {
     /**
      * @param {number=} opt_length The number items in the selection.
      */
@@ -393,5 +396,6 @@
     }
   }
 
+  // #cr_define_end
   return {ListSelectionModel: ListSelectionModel};
 });
diff --git a/ui/webui/resources/js/cr/ui/list_single_selection_model.js b/ui/webui/resources/js/cr/ui/list_single_selection_model.js
index da96825..2839167 100644
--- a/ui/webui/resources/js/cr/ui/list_single_selection_model.js
+++ b/ui/webui/resources/js/cr/ui/list_single_selection_model.js
@@ -2,12 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
+// #import {isMac, isChromeOS, dispatchPropertyChange} from '../../cr.m.js';
+
 cr.define('cr.ui', function() {
   /**
    * Creates a new selection model that is to be used with lists. This only
    * allows a single index to be selected.
    */
-  class ListSingleSelectionModel extends cr.EventTarget {
+  /* #export */ class ListSingleSelectionModel extends cr.EventTarget {
     /**
      * @param {number=} opt_length The number items in the selection.
      */
@@ -256,5 +259,6 @@
     }
   }
 
+  // #cr_define_end
   return {ListSingleSelectionModel: ListSingleSelectionModel};
 });
diff --git a/ui/webui/resources/js/cr/ui/position_util.js b/ui/webui/resources/js/cr/ui/position_util.js
index b9ab4ee..40b59f7 100644
--- a/ui/webui/resources/js/cr/ui/position_util.js
+++ b/ui/webui/resources/js/cr/ui/position_util.js
@@ -18,7 +18,7 @@
    * Enum for defining how to anchor a popup to an anchor element.
    * @enum {number}
    */
-  const AnchorType = {
+  /* #export */ const AnchorType = {
     /**
      * The popup's right edge is aligned with the left edge of the anchor.
      * The popup's top edge is aligned with the top edge of the anchor.
@@ -215,7 +215,7 @@
    * @param {boolean=} opt_invertLeftRight Whether to invert the right/left
    *     alignment.
    */
-  function positionPopupAroundElement(
+  /* #export */ function positionPopupAroundElement(
       anchorElement, popupElement, type, opt_invertLeftRight) {
     const anchorRect = anchorElement.getBoundingClientRect();
     positionPopupAroundRect(
@@ -229,7 +229,8 @@
    * @param {!HTMLElement} popupElement The popup element we are positioning.
    * @param {cr.ui.AnchorType=} opt_anchorType The type of anchoring we want.
    */
-  function positionPopupAtPoint(x, y, popupElement, opt_anchorType) {
+  /* #export */ function positionPopupAtPoint(
+      x, y, popupElement, opt_anchorType) {
     const rect = {left: x, top: y, width: 0, height: 0, right: x, bottom: y};
 
     const anchorType = opt_anchorType || AnchorType.BELOW;
@@ -237,6 +238,7 @@
   }
 
   // Export
+  // #cr_define_end
   return {
     AnchorType: AnchorType,
     positionPopupAroundElement: positionPopupAroundElement,
diff --git a/ui/webui/resources/js/cr/ui/splitter.js b/ui/webui/resources/js/cr/ui/splitter.js
index ef4b55b..0c214cf 100644
--- a/ui/webui/resources/js/cr/ui/splitter.js
+++ b/ui/webui/resources/js/cr/ui/splitter.js
@@ -18,6 +18,9 @@
  *
  */
 
+// #import {define as crUiDefine} from '../ui.m.js';
+// #import {dispatchSimpleEvent} from '../../cr.m.js';
+
 cr.define('cr.ui', function() {
   // TODO(arv): Currently this only supports horizontal layout.
   // TODO(arv): This ignores min-width and max-width of the elements to the
@@ -58,7 +61,7 @@
    * @constructor
    * @extends {HTMLDivElement}
    */
-  const Splitter = cr.ui.define('div');
+  /* #export */ const Splitter = cr.ui.define('div');
 
   Splitter.prototype = {
     __proto__: HTMLDivElement.prototype,
@@ -274,5 +277,6 @@
     },
   };
 
+  // #cr_define_end
   return {Splitter: Splitter};
 });
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index cc15b3e7..2bf6927 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -14,9 +14,9 @@
   <release seq="1">
     <includes>
       <if expr="chromeos">
-        <include name="IDR_WEBUI_I18N_TEMPLATE_PROCESS_JS" file="js/i18n_template_process.js" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_I18N_TEMPLATE_PROCESS_JS" file="js/i18n_template_process.js" type="BINDATA" />
       </if>
-      <include name="IDR_WEBUI_JSTEMPLATE_JS" file="js/jstemplate_compiled.js"
+      <include name="IDR_WEBUI_JS_JSTEMPLATE_COMPILED_JS" file="js/jstemplate_compiled.js"
                flattenhtml="true" type="BINDATA"/>
       <!-- Roboto Font. Roboto-Regular and Roboto-Light is already available on
            Android, and Roboto-Medium is not used on Android. All 6 weights of
@@ -29,58 +29,85 @@
 
       <!-- Component apps common image resources - 1x -->
       <!-- Misc buttons -->
-      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_CLOSE"
+      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_CLOSE_PNG"
                file="images/apps/topbar_button_close.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MAXIMIZE"
+      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MAXIMIZE_PNG"
                file="images/apps/topbar_button_maximize.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MINIMIZE"
+      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MINIMIZE_PNG"
                file="images/apps/topbar_button_minimize.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE"
+      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PNG"
                file="images/apps/button_butter_bar_close.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_HOVER"
+      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_HOVER_PNG"
                file="images/apps/button_butter_bar_close_hover.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PRESSED"
+      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PRESSED_PNG"
                file="images/apps/button_butter_bar_close_pressed.png" type="BINDATA" />
 
       <!-- Component apps common image resources - 2x -->
       <!-- Misc buttons -->
-      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_CLOSE"
+      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_CLOSE_PNG"
                file="images/2x/apps/topbar_button_close.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MAXIMIZE"
+      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MAXIMIZE_PNG"
                file="images/2x/apps/topbar_button_maximize.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MINIMIZE"
+      <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MINIMIZE_PNG"
                file="images/2x/apps/topbar_button_minimize.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_2X"
+      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_2X_PNG"
                file="images/2x/apps/button_butter_bar_close.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_HOVER_2X"
+      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_HOVER_2X_PNG"
                file="images/2x/apps/button_butter_bar_close_hover.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PRESSED_2X"
+      <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PRESSED_2X_PNG"
                file="images/2x/apps/button_butter_bar_close_pressed.png" type="BINDATA" />
 
       <!-- Non-apps images -->
-      <include name="IDR_WEBUI_IMAGES_ADD"
+      <include name="IDR_WEBUI_IMAGES_ADD_SVG"
                file="images/add.svg" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_CHECK"
+      <include name="IDR_WEBUI_IMAGES_CHECK_PNG"
                file="images/check.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_CHECKBOX_BLACK"
+      <include name="IDR_WEBUI_IMAGES_CHECKBOX_BLACK_PNG"
                file="images/checkbox_black.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_CHECKBOX_WHITE"
+      <include name="IDR_WEBUI_IMAGES_CHECKBOX_WHITE_PNG"
                file="images/checkbox_white.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_DISABLED_SELECT"
+      <include name="IDR_WEBUI_IMAGES_DISABLED_SELECT_PNG"
                file="images/disabled_select.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_ERROR"
+      <include name="IDR_WEBUI_IMAGES_ERROR_SVG"
                file="images/error.svg" type="BINDATA" />
       <!-- Similar to IDR_WEBUI_IMAGES_ERROR except that it is white-filled instead of transparent-filled. Useful for badging images where the background may be red. -->
-      <include name="IDR_WEBUI_IMAGES_ERROR_BADGE"
+      <include name="IDR_WEBUI_IMAGES_ERROR_BADGE_SVG"
                file="images/error_badge.svg" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_GOOGLE_LOGO"
+      <include name="IDR_WEBUI_IMAGES_GOOGLE_LOGO_SVG"
                file="images/google_logo.svg" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_SELECT"
+      <include name="IDR_WEBUI_IMAGES_SELECT_PNG"
                file="images/select.png" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_THROBBER_MEDIUM"
+      <include name="IDR_WEBUI_IMAGES_THROBBER_MEDIUM_SVG"
                file="images/throbber_medium.svg" type="BINDATA" />
-      <include name="IDR_WEBUI_IMAGES_THROBBER_SMALL"
+      <include name="IDR_WEBUI_IMAGES_THROBBER_SMALL_SVG"
                file="images/throbber_small.svg" type="BINDATA" />
+      <!-- Web UI JS module resources (used only in ChromeOS). -->
+      <if expr="chromeos">
+        <include name="IDR_WEBUI_JS_CR_UI_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_ARRAY_DATA_MODEL_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/array_data_model.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_DIALOGS_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/dialogs.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_CONTROLLER_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/list_selection_controller.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_MODEL_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/list_selection_model.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_LIST_SINGLE_SELECTION_MODEL_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/list_single_selection_model.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_POSITION_UTIL_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/position_util.m.js"
+                 use_base_dir="false" type="BINDATA" />
+        <include name="IDR_WEBUI_JS_CR_UI_SPLITTER_M_JS"
+                 file="${root_gen_dir}/ui/webui/resources/js/cr/ui/splitter.m.js"
+                 use_base_dir="false" type="BINDATA" />
+      </if>
       <!-- Web UI shared JS module resources. -->
       <include name="IDR_WEBUI_JS_ASSERT_M_JS"
                file="${root_gen_dir}/ui/webui/resources/js/assert.m.js"
@@ -148,65 +175,65 @@
       </if>
     </includes>
     <structures>
-      <structure name="IDR_WEBUI_CSS_ACTION_LINK"
+      <structure name="IDR_WEBUI_CSS_ACTION_LINK_CSS"
                  file="css/action_link.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_APPS_COMMON"
+      <structure name="IDR_WEBUI_CSS_APPS_COMMON_CSS"
                  file="css/apps/common.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_APPS_TOPBUTTON_BAR"
+      <structure name="IDR_WEBUI_CSS_APPS_TOPBUTTON_BAR_CSS"
                  file="css/apps/topbutton_bar.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_BUBBLE"
+      <structure name="IDR_WEBUI_CSS_BUBBLE_CSS"
                  file="css/bubble.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_BUBBLE_BUTTON"
+      <structure name="IDR_WEBUI_CSS_BUBBLE_BUTTON_CSS"
                  file="css/bubble_button.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_BUTTER_BAR"
+      <structure name="IDR_WEBUI_CSS_BUTTER_BAR_CSS"
                  file="css/butter_bar.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_CHROME"
+      <structure name="IDR_WEBUI_CSS_CHROME_SHARED_CSS"
                  file="css/chrome_shared.css" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_CONTROLLED_INDICATOR"
+      <structure name="IDR_WEBUI_CSS_CONTROLLED_INDICATOR_CSS"
                  file="css/controlled_indicator.css" type="chrome_html" flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_DIALOGS"
+      <structure name="IDR_WEBUI_CSS_DIALOGS_CSS"
                  file="css/dialogs.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_I18N_PROCESS"
+      <structure name="IDR_WEBUI_CSS_I18N_PROCESS_CSS"
                  file="css/i18n_process.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_LIST"
+      <structure name="IDR_WEBUI_CSS_LIST_CSS"
                  file="css/list.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_MENU"
+      <structure name="IDR_WEBUI_CSS_MENU_CSS"
                  file="css/menu.css" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_MENU_BUTTON"
+      <structure name="IDR_WEBUI_CSS_MENU_BUTTON_CSS"
                  file="css/menu_button.css" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_TEXT_DEFAULTS"
+      <structure name="IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS"
                  file="css/text_defaults.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_TEXT_DEFAULTS_MD"
+      <structure name="IDR_WEBUI_CSS_TEXT_DEFAULTS_MD_CSS"
                  file="css/text_defaults_md.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_OVERLAY"
+      <structure name="IDR_WEBUI_CSS_OVERLAY_CSS"
                  file="css/overlay.css" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_ROBOTO" preprocess="true"
+      <structure name="IDR_WEBUI_CSS_ROBOTO_CSS" preprocess="true"
                  file="css/roboto.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_SPINNER"
+      <structure name="IDR_WEBUI_CSS_SPINNER_CSS"
                  file="css/spinner.css" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_TABLE"
+      <structure name="IDR_WEBUI_CSS_TABLE_CSS"
                  file="css/table.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_TABS"
+      <structure name="IDR_WEBUI_CSS_TABS_CSS"
                  file="css/tabs.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_THROBBER"
+      <structure name="IDR_WEBUI_CSS_THROBBER_CSS"
                  file="css/throbber.css" type="chrome_html" />
-      <structure name="IDR_WEBUI_CSS_TREE"
+      <structure name="IDR_WEBUI_CSS_TREE_CSS"
                  file="css/tree.css" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_CSS_WIDGETS"
+      <structure name="IDR_WEBUI_CSS_WIDGETS_CSS"
                  file="css/widgets.css" type="chrome_html"
                  flattenhtml="true" />
 
-      <structure name="IDR_WEBUI_HTML_ACTION_LINK"
+      <structure name="IDR_WEBUI_HTML_ACTION_LINK_HTML"
                  file="html/action_link.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_ASSERT"
+      <structure name="IDR_WEBUI_HTML_ASSERT_HTML"
                  file="html/assert.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_PROMISE_RESOLVER"
+      <structure name="IDR_WEBUI_HTML_PROMISE_RESOLVER_HTML"
                  file="html/promise_resolver.html" type="chrome_html" />
 
       <if expr="chromeos">
@@ -216,183 +243,183 @@
                    use_base_dir="false" />
       </if>
 
-      <structure name="IDR_WEBUI_HTML_CR"
+      <structure name="IDR_WEBUI_HTML_CR_HTML"
                  file="html/cr.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_EVENT_TARGET"
+      <structure name="IDR_WEBUI_HTML_CR_EVENT_TARGET_HTML"
                  file="html/cr/event_target.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI"
+      <structure name="IDR_WEBUI_HTML_CR_UI_HTML"
                  file="html/cr/ui.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_ARRAY_DATA_MODEL"
+      <structure name="IDR_WEBUI_HTML_CR_UI_ARRAY_DATA_MODEL_HTML"
                  file="html/cr/ui/array_data_model.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_COMMAND"
+      <structure name="IDR_WEBUI_HTML_CR_UI_COMMAND_HTML"
                  file="html/cr/ui/command.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_CONTEXT_MENU_HANDLER"
+      <structure name="IDR_WEBUI_HTML_CR_UI_CONTEXT_MENU_HANDLER_HTML"
                  file="html/cr/ui/context_menu_handler.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_DRAG_WRAPPER"
+      <structure name="IDR_WEBUI_HTML_CR_UI_DRAG_WRAPPER_HTML"
                  file="html/cr/ui/drag_wrapper.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_GRID"
+      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_GRID_HTML"
                  file="html/cr/ui/focus_grid.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_MANAGER"
+      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_MANAGER_HTML"
                  file="html/cr/ui/focus_manager.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_OUTLINE_MANAGER"
+      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_OUTLINE_MANAGER_HTML"
                  file="html/cr/ui/focus_outline_manager.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_ROW"
+      <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_ROW_HTML"
                  file="html/cr/ui/focus_row.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_KEYBOARD_SHORTCUT_LIST"
+      <structure name="IDR_WEBUI_HTML_CR_UI_KEYBOARD_SHORTCUT_LIST_HTML"
                  file="html/cr/ui/keyboard_shortcut_list.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_LIST"
+      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_HTML"
                  file="html/cr/ui/list.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_ITEM"
+      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_ITEM_HTML"
                  file="html/cr/ui/list_item.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_CONTROLLER"
+      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_CONTROLLER_HTML"
                  file="html/cr/ui/list_selection_controller.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_MODEL"
+      <structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_MODEL_HTML"
                  file="html/cr/ui/list_selection_model.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_MENU"
+      <structure name="IDR_WEBUI_HTML_CR_UI_MENU_HTML"
                  file="html/cr/ui/menu.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_MENU_BUTTON"
+      <structure name="IDR_WEBUI_HTML_CR_UI_MENU_BUTTON_HTML"
                  file="html/cr/ui/menu_button.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_MENU_ITEM"
+      <structure name="IDR_WEBUI_HTML_CR_UI_MENU_ITEM_HTML"
                  file="html/cr/ui/menu_item.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_OVERLAY"
+      <structure name="IDR_WEBUI_HTML_CR_UI_OVERLAY_HTML"
                  file="html/cr/ui/overlay.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_POSITION_UTIL"
+      <structure name="IDR_WEBUI_HTML_CR_UI_POSITION_UTIL_HTML"
                  file="html/cr/ui/position_util.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_SPLITTER"
+      <structure name="IDR_WEBUI_HTML_CR_UI_SPLITTER_HTML"
                  file="html/cr/ui/splitter.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_STORE"
+      <structure name="IDR_WEBUI_HTML_CR_UI_STORE_HTML"
                  file="html/cr/ui/store.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_CR_UI_STORE_CLIENT"
+      <structure name="IDR_WEBUI_HTML_CR_UI_STORE_CLIENT_HTML"
                  file="html/cr/ui/store_client.html"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_EVENT_TRACKER"
+      <structure name="IDR_WEBUI_HTML_EVENT_TRACKER_HTML"
                  file="html/event_tracker.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_ICON"
+      <structure name="IDR_WEBUI_HTML_ICON_HTML"
                  file="html/icon.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_LOAD_TIME_DATA"
+      <structure name="IDR_WEBUI_HTML_LOAD_TIME_DATA_HTML"
                  file="html/load_time_data.html" type="chrome_html" />
       <structure name="IDR_WEBUI_HTML_PARSE_HTML_SUBSET"
                  file="html/parse_html_subset.html" type="chrome_html" />
-      <structure name="IDR_WEBUI_HTML_TEST_LOADER"
+      <structure name="IDR_WEBUI_HTML_TEST_LOADER_HTML"
                  file="html/test_loader.html" type="chrome_html"/>
-      <structure name="IDR_WEBUI_HTML_UTIL"
+      <structure name="IDR_WEBUI_HTML_UTIL_HTML"
                  file="html/util.html" type="chrome_html" />
 
-      <structure name="IDR_WEBUI_JS_ACTION_LINK"
+      <structure name="IDR_WEBUI_JS_ACTION_LINK_JS"
                  file="js/action_link.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_ASSERT"
+      <structure name="IDR_WEBUI_JS_ASSERT_JS"
                  file="js/assert.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_PROMISE_RESOLVER"
+      <structure name="IDR_WEBUI_JS_PROMISE_RESOLVER_JS"
                  file="js/promise_resolver.js" type="chrome_html" />
 
-      <structure name="IDR_WEBUI_JS_CR"
+      <structure name="IDR_WEBUI_JS_CR_JS"
                  file="js/cr.js" type="chrome_html"
                  preprocess="true" />
       <structure name="IDR_WEBUI_JS_CR_M_JS"
                  file="js/cr.m.js" type="chrome_html"
                  preprocess="true" />
-      <structure name="IDR_WEBUI_JS_CR_EVENT_TARGET"
+      <structure name="IDR_WEBUI_JS_CR_EVENT_TARGET_JS"
                  file="js/cr/event_target.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI"
+      <structure name="IDR_WEBUI_JS_CR_UI_JS"
                  file="js/cr/ui.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_ARRAY_DATA_MODEL"
+      <structure name="IDR_WEBUI_JS_CR_UI_ARRAY_DATA_MODEL_JS"
                  file="js/cr/ui/array_data_model.js"
                  type="chrome_html" flattenhtml="true" />
-      <structure name="IDR_WEBUI_JS_CR_UI_BUBBLE"
+      <structure name="IDR_WEBUI_JS_CR_UI_BUBBLE_JS"
                  file="js/cr/ui/bubble.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_BUBBLE_BUTTON"
+      <structure name="IDR_WEBUI_JS_CR_UI_BUBBLE_BUTTON_JS"
                  file="js/cr/ui/bubble_button.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_CARD_SLIDER"
+      <structure name="IDR_WEBUI_JS_CR_UI_CARD_SLIDER_JS"
                  file="js/cr/ui/card_slider.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_COMMAND"
+      <structure name="IDR_WEBUI_JS_CR_UI_COMMAND_JS"
                  file="js/cr/ui/command.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_CONTEXT_MENU_HANDLER"
+      <structure name="IDR_WEBUI_JS_CR_UI_CONTEXT_MENU_HANDLER_JS"
                  file="js/cr/ui/context_menu_handler.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_CONTROLLED_INDICATOR"
+      <structure name="IDR_WEBUI_JS_CR_UI_CONTROLLED_INDICATOR_JS"
                  file="js/cr/ui/controlled_indicator.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_DIALOGS"
+      <structure name="IDR_WEBUI_JS_CR_UI_DIALOGS_JS"
                  file="js/cr/ui/dialogs.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_DRAG_WRAPPER"
+      <structure name="IDR_WEBUI_JS_CR_UI_DRAG_WRAPPER_JS"
                  file="js/cr/ui/drag_wrapper.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_GRID"
+      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_GRID_JS"
                  file="js/cr/ui/focus_grid.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_MANAGER"
+      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_MANAGER_JS"
                  file="js/cr/ui/focus_manager.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER"
+      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER_JS"
                  file="js/cr/ui/focus_outline_manager.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW"
+      <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW_JS"
                  file="js/cr/ui/focus_row.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_KEYBOARD_SHORTCUT_LIST"
+      <structure name="IDR_WEBUI_JS_CR_UI_KEYBOARD_SHORTCUT_LIST_JS"
                  file="js/cr/ui/keyboard_shortcut_list.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_LIST"
+      <structure name="IDR_WEBUI_JS_CR_UI_LIST_JS"
                  file="js/cr/ui/list.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_LIST_ITEM"
+      <structure name="IDR_WEBUI_JS_CR_UI_LIST_ITEM_JS"
                  file="js/cr/ui/list_item.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_CONTROLLER"
+      <structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_CONTROLLER_JS"
                  file="js/cr/ui/list_selection_controller.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_MODEL"
+      <structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_MODEL_JS"
                  file="js/cr/ui/list_selection_model.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_LIST_SINGLE_SELECTION_MODEL"
+      <structure name="IDR_WEBUI_JS_CR_UI_LIST_SINGLE_SELECTION_MODEL_JS"
                  file="js/cr/ui/list_single_selection_model.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_MENU"
+      <structure name="IDR_WEBUI_JS_CR_UI_MENU_JS"
                  file="js/cr/ui/menu.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_MENU_BUTTON"
+      <structure name="IDR_WEBUI_JS_CR_UI_MENU_BUTTON_JS"
                  file="js/cr/ui/menu_button.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_MENU_ITEM"
+      <structure name="IDR_WEBUI_JS_CR_UI_MENU_ITEM_JS"
                  file="js/cr/ui/menu_item.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_OVERLAY"
+      <structure name="IDR_WEBUI_JS_CR_UI_OVERLAY_JS"
                  file="js/cr/ui/overlay.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_POSITION_UTIL"
+      <structure name="IDR_WEBUI_JS_CR_UI_POSITION_UTIL_JS"
                  file="js/cr/ui/position_util.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_SPLITTER"
+      <structure name="IDR_WEBUI_JS_CR_UI_SPLITTER_JS"
                  file="js/cr/ui/splitter.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_STORE"
+      <structure name="IDR_WEBUI_JS_CR_UI_STORE_JS"
                  file="js/cr/ui/store.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_STORE_CLENT"
+      <structure name="IDR_WEBUI_JS_CR_UI_STORE_CLENT_JS"
                  file="js/cr/ui/store_client.js"
                  type="chrome_html" />
       <if expr="chromeos">
-        <structure name="IDR_WEBUI_JS_CR_UI_GRID"
+        <structure name="IDR_WEBUI_JS_CR_UI_GRID_JS"
                    file="js/cr/ui/grid.js" type="chrome_html" />
       </if>
-      <structure name="IDR_WEBUI_JS_CR_UI_TABS"
+      <structure name="IDR_WEBUI_JS_CR_UI_TABS_JS"
                  file="js/cr/ui/tabs.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_TREE"
+      <structure name="IDR_WEBUI_JS_CR_UI_TREE_JS"
                  file="js/cr/ui/tree.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_CR_UI_TOUCH_HANDLER"
+      <structure name="IDR_WEBUI_JS_CR_UI_TOUCH_HANDLER_JS"
                  file="js/cr/ui/touch_handler.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_EVENT_TRACKER"
+      <structure name="IDR_WEBUI_JS_EVENT_TRACKER_JS"
                  file="js/event_tracker.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_ICON"
+      <structure name="IDR_WEBUI_JS_ICON_JS"
                  file="js/icon.js" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_JS_I18N_TEMPLATE_NO_PROCESS"
+      <structure name="IDR_WEBUI_JS_I18N_TEMPLATE_NO_PROCESS_JS"
                  file="js/i18n_template_no_process.js"
                  type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_LOAD_TIME_DATA"
+      <structure name="IDR_WEBUI_JS_LOAD_TIME_DATA_JS"
                  file="js/load_time_data.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_PARSE_HTML_SUBSET"
+      <structure name="IDR_WEBUI_JS_PARSE_HTML_SUBSET_JS"
                  file="js/parse_html_subset.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_TEST_LOADER"
+      <structure name="IDR_WEBUI_JS_TEST_LOADER_JS"
                  file="js/test_loader.js" type="chrome_html"/>
-      <structure name="IDR_WEBUI_JS_UTIL"
+      <structure name="IDR_WEBUI_JS_UTIL_JS"
                  file="js/util.js" type="chrome_html"
                  flattenhtml="true" />
-      <structure name="IDR_WEBUI_JS_WEBUI_RESOURCE_TEST"
+      <structure name="IDR_WEBUI_JS_WEBUI_RESOURCE_TEST_JS"
                  file="js/webui_resource_test.js" type="chrome_html" />
 
       <if expr="is_ios">
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BundleLanguageTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BundleLanguageTest.java
index f3b1d49..0a25b31 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BundleLanguageTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/BundleLanguageTest.java
@@ -29,7 +29,8 @@
 /** Tests that translations work correctly for Java strings inside bundles. */
 @RunWith(WebLayerJUnit4ClassRunner.class)
 public class BundleLanguageTest {
-    private static final String WEBLAYER_SPECIFIC_STRING = "string/geolocation_permission_title";
+    private static final String WEBLAYER_SPECIFIC_STRING =
+            "string/infobar_missing_location_permission_text";
     private static final String SHARED_STRING = "string/color_picker_dialog_title";
 
     @Rule