diff --git a/BUILD.gn b/BUILD.gn
index 9a9ef733..ad0028b 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -196,6 +196,11 @@
     deps += [ "//weblayer/shell:weblayer_shell" ]
   }
 
+  # TODO: enable this on Android.
+  if (is_win || (is_linux && !is_chromeos)) {
+    deps += [ "//weblayer/test:weblayer_browsertests" ]
+  }
+
   if (!is_ios && !is_android) {
     deps += [
       "//components/cronet:cronet_tests",
diff --git a/DEPS b/DEPS
index 849c868b..f9c8d4b 100644
--- a/DEPS
+++ b/DEPS
@@ -162,7 +162,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '0033008d95ac6deb3cc43203fda5313b30ae1cf1',
+  'skia_revision': '37cb2b2a47f0ec36186eef2d60a2445f7dd633ef',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -174,7 +174,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': '65a5036eb0419047789d5ee66c02577ef251e07b',
+  'angle_revision': 'a7003d5fc30680e2bd3dbe3a9393d74d89a48c17',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -182,7 +182,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': 'c6642beb8c78df9a7a85c2c431cde184a7e76ee5',
+  'pdfium_revision': '9d3a62e826277fa3e4864c8d4c7d49af2a0f3726',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -853,7 +853,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '7fd753567d3cac55292131dcf0c3094f0532dcda',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'a467e264db50039c5bdf1b16099168c0e0d315e1',
       'condition': 'checkout_linux',
   },
 
@@ -1487,7 +1487,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@95dfac5bc3249a5a17961b41c3082cb30b9f469b',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@dca254aeeec6bcdc38fb79ae62e178ef3f26661d',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 8c17807..9ff2a42b 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -90,6 +90,7 @@
 #include "content/public/common/web_preferences.h"
 #include "media/mojo/buildflags.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/android/network_library.h"
 #include "net/http/http_util.h"
@@ -215,7 +216,7 @@
 
 // A dummy binder for mojo interface autofill::mojom::PasswordManagerDriver.
 void DummyBindPasswordManagerDriver(
-    autofill::mojom::PasswordManagerDriverRequest request,
+    mojo::PendingReceiver<autofill::mojom::PasswordManagerDriver> receiver,
     content::RenderFrameHost* render_frame_host) {}
 
 void PassMojoCookieManagerToAwCookieManager(
@@ -694,7 +695,7 @@
                                      render_frame_host);
 }
 
-bool AwContentBrowserClient::BindAssociatedInterfaceRequestFromFrame(
+bool AwContentBrowserClient::BindAssociatedReceiverFromFrame(
     content::RenderFrameHost* render_frame_host,
     const std::string& interface_name,
     mojo::ScopedInterfaceEndpointHandle* handle) {
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h
index 32acca9..5ff324c 100644
--- a/android_webview/browser/aw_content_browser_client.h
+++ b/android_webview/browser/aw_content_browser_client.h
@@ -139,7 +139,7 @@
       content::RenderFrameHost* render_frame_host,
       const std::string& interface_name,
       mojo::ScopedMessagePipeHandle interface_pipe) override;
-  bool BindAssociatedInterfaceRequestFromFrame(
+  bool BindAssociatedReceiverFromFrame(
       content::RenderFrameHost* render_frame_host,
       const std::string& interface_name,
       mojo::ScopedInterfaceEndpointHandle* handle) override;
diff --git a/ash/components/strings/ash_components_strings_fil.xtb b/ash/components/strings/ash_components_strings_fil.xtb
index e21ed90..f272b3f1 100644
--- a/ash/components/strings/ash_components_strings_fil.xtb
+++ b/ash/components/strings/ash_components_strings_fil.xtb
@@ -23,6 +23,7 @@
 <translation id="169515659049020177">Shift</translation>
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Idagdag ang www. at .com sa iyong input sa address bar, pagkatapos ay buksan ang page</translation>
+<translation id="1872219238824176091">Alisin ang kasalukuyang desk</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, pagkatapos ay <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> o <ph name="LEFT" /></translation>
 <translation id="1996162290124031907">Pumunta sa susunod na tab</translation>
 <translation id="2010818616644390445">Pumunta sa huling tab sa window</translation>
@@ -42,6 +43,7 @@
 <translation id="2441202986792279177">Magpalipat-lipat nang mabilis sa mga window</translation>
 <translation id="2454251766545114447">Ipakita ang Pag-zoom out</translation>
 <translation id="2478303094958140141">I-on o i-off ang ChromeVox (pasalitang feedback)</translation>
+<translation id="2488661730534396940">I-activate ang desk sa kaliwa</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2530339807289914946">Mag-scroll pababa sa web page</translation>
 <translation id="2574014812750545982">I-reset ang antas ng pag-zoom sa page</translation>
@@ -49,6 +51,7 @@
 <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, pagkatapos ay <ph name="TAB" /> o <ph name="RIGHT" /></translation>
 <translation id="2750942583782703988">I-reload ang iyong kasalukuyang page</translation>
 <translation id="2764005613199379871">Nagfo-focus sa search address bar</translation>
+<translation id="2774822903829597107">Gumawa ng bagong desk</translation>
 <translation id="2789868185375229787">Mag-zoom out sa page</translation>
 <translation id="2804480015716812239">Pindutin ang <ph name="ALT" /> at mag-click ng link</translation>
 <translation id="2830827904629746450">Mag-dock ng window sa kanan</translation>
@@ -100,6 +103,7 @@
 <translation id="4642092649622328492">Kumuha ng screenshot ng bahagi ng screen</translation>
 <translation id="4698850295812410683">Ipakita ang mga tool ng stylus</translation>
 <translation id="4801989101741319327">Lumipat sa dulo ng kasunod na salita</translation>
+<translation id="4866066940972151697">I-activate ang desk sa kanan</translation>
 <translation id="4916163929714267752">Buksan ang link sa isang bagong window</translation>
 <translation id="5030659775136592441">Ipakita ang manager ng bookmark</translation>
 <translation id="5034421018520995080">Pumunta sa pinakataas ng page</translation>
diff --git a/ash/components/strings/ash_components_strings_hi.xtb b/ash/components/strings/ash_components_strings_hi.xtb
index b44f5567..d8a1f110 100644
--- a/ash/components/strings/ash_components_strings_hi.xtb
+++ b/ash/components/strings/ash_components_strings_hi.xtb
@@ -23,6 +23,7 @@
 <translation id="169515659049020177">Shift</translation>
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">पता बार में अपने इनपुट में www. और .com जोड़ें, फिर पेज खोलें</translation>
+<translation id="1872219238824176091">मौजूदा डेस्क को हटाएं</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, फिर <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> या <ph name="LEFT" /></translation>
 <translation id="1996162290124031907">अगले टैब पर जाएं</translation>
 <translation id="2010818616644390445">विंडो में आखिरी टैब पर जाएंं</translation>
@@ -42,6 +43,7 @@
 <translation id="2441202986792279177">अलग-अलग विंडो के बीच तेज़ी से स्विच करें</translation>
 <translation id="2454251766545114447">'ज़ूम घटाएं' दिखाएं</translation>
 <translation id="2478303094958140141">ChromeVox (कंप्यूटर का बोलकर दिया गया जवाब) चालू या बंद करें</translation>
+<translation id="2488661730534396940">बाईं ओर मौजूद डेस्क को चालू करें</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2530339807289914946">वेबपेज में नीचे स्क्रोल करें</translation>
 <translation id="2574014812750545982">पेज पर ज़ूम लेवल को रीसेट करें</translation>
@@ -49,6 +51,7 @@
 <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, फिर <ph name="TAB" /> या <ph name="RIGHT" /></translation>
 <translation id="2750942583782703988">अपना मौजूदा पेज फिर से लोड करें</translation>
 <translation id="2764005613199379871">खोज पता बार में फ़ोकस रखें</translation>
+<translation id="2774822903829597107">एक नया डेस्क बनाएं</translation>
 <translation id="2789868185375229787">पेज पर ज़ूम घटाएं</translation>
 <translation id="2804480015716812239"><ph name="ALT" /> दबाएं और किसी लिंक पर क्लिक करें</translation>
 <translation id="2830827904629746450">विंडो दाईं ओर डॉक करें</translation>
@@ -100,6 +103,7 @@
 <translation id="4642092649622328492">आंशिक स्क्रीनशॉट लें</translation>
 <translation id="4698850295812410683">स्टाइलस टूल दिखाएं</translation>
 <translation id="4801989101741319327">अगले शब्द के आखिर में ले जाएं</translation>
+<translation id="4866066940972151697">दाईं ओर मौजूद डेस्क को चालू करें</translation>
 <translation id="4916163929714267752">लिंक को नई विंडो में खोलें</translation>
 <translation id="5030659775136592441">बुकमार्क मैनेजर दिखाएं</translation>
 <translation id="5034421018520995080">पेज के सबसे ऊपर जाएं</translation>
diff --git a/ash/components/strings/ash_components_strings_ko.xtb b/ash/components/strings/ash_components_strings_ko.xtb
index ed11d4e..8d3d47f 100644
--- a/ash/components/strings/ash_components_strings_ko.xtb
+++ b/ash/components/strings/ash_components_strings_ko.xtb
@@ -23,6 +23,7 @@
 <translation id="169515659049020177">Shift</translation>
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">검색주소창에 입력한 주소에 www. 및 .com을 추가한 후 페이지 열기</translation>
+<translation id="1872219238824176091">현재 데스크 삭제</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />을 누르고 <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> 또는 <ph name="LEFT" /></translation>
 <translation id="1996162290124031907">다음 탭으로 이동</translation>
 <translation id="2010818616644390445">창의 마지막 탭으로 이동</translation>
@@ -42,6 +43,7 @@
 <translation id="2441202986792279177">창 간에 빠르게 전환</translation>
 <translation id="2454251766545114447">축소 표시</translation>
 <translation id="2478303094958140141">ChromeVox(음성 피드백) 사용 또는 사용 중지</translation>
+<translation id="2488661730534396940">왼쪽 데스크 활성화</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2530339807289914946">웹페이지를 아래로 스크롤</translation>
 <translation id="2574014812750545982">페이지 확대/축소 레벨 재설정</translation>
@@ -49,6 +51,7 @@
 <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />을 누르고 <ph name="TAB" /> 또는 <ph name="RIGHT" /></translation>
 <translation id="2750942583782703988">현재 페이지를 새로고침</translation>
 <translation id="2764005613199379871">검색주소창에 포커스를 둡니다.</translation>
+<translation id="2774822903829597107">새 데스크 생성</translation>
 <translation id="2789868185375229787">페이지를 축소</translation>
 <translation id="2804480015716812239"><ph name="ALT" />를 누른 상태에서 링크를 클릭</translation>
 <translation id="2830827904629746450">오른쪽에 창 고정</translation>
@@ -100,6 +103,7 @@
 <translation id="4642092649622328492">부분 스크린샷 찍기</translation>
 <translation id="4698850295812410683">스타일러스 도구 표시</translation>
 <translation id="4801989101741319327">다음 단어의 끝으로 이동</translation>
+<translation id="4866066940972151697">오른쪽 데스크 활성화</translation>
 <translation id="4916163929714267752">새 창에서 링크 열기</translation>
 <translation id="5030659775136592441">북마크 관리자 표시</translation>
 <translation id="5034421018520995080">페이지 맨 위로 이동</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 8e30875..9b3b25480 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -88,6 +88,7 @@
 <translation id="2127372758936585790">Low-power charger</translation>
 <translation id="2135456203358955318">Naka-dock na magnifier</translation>
 <translation id="2144487987174258011">I-restart upang i-update ang Adobe Flash Player</translation>
+<translation id="2148902151539191989">BUMALIK</translation>
 <translation id="2208323208084708176">Unified desktop mode</translation>
 <translation id="2220572644011485463">PIN o password</translation>
 <translation id="225680501294068881">Nag-i-scan para sa mga device...</translation>
@@ -262,6 +263,7 @@
 <translation id="4778095205580009397">Hindi available ang Google Assistant sa demo session.</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">I-disconnect</translation>
+<translation id="4814539958450445987">Screen sa Pag-log In</translation>
 <translation id="4831034276697007977">Sigurado ka bang gusto mong i-off ang mga awtomatikong pag-click?</translation>
 <translation id="4849058404725798627">I-highlight ang bagay sa pamamagitan ng pag-focus ng keyboard</translation>
 <translation id="485592688953820832">Walang pagkilos (i-pause)</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index c61c849..226d48c 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -88,6 +88,7 @@
 <translation id="2127372758936585790">कम-शक्ति वाला चार्जर</translation>
 <translation id="2135456203358955318">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा</translation>
 <translation id="2144487987174258011">Adobe Flash Player को अपडेट करने के लिए रीस्टार्ट करें</translation>
+<translation id="2148902151539191989">वापस जाएं</translation>
 <translation id="2208323208084708176">संयुक्त डेस्कटॉप मोड</translation>
 <translation id="2220572644011485463">पिन या पासवर्ड</translation>
 <translation id="225680501294068881">डिवाइस स्कैन किए जा रहे हैं...</translation>
@@ -263,6 +264,7 @@
 <translation id="4778095205580009397">डेमो सत्र में Google Assistant मौजूद नहीं है.</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">डिसकनेक्ट करें</translation>
+<translation id="4814539958450445987">लॉगिन स्क्रीन</translation>
 <translation id="4831034276697007977">क्या आप वाकई अपने आप क्लिक करने की सुविधा बंद करना चाहते हैं?</translation>
 <translation id="4849058404725798627">कीबोर्ड फ़ोकस वाला ऑब्जेक्ट हाइलाइट करें</translation>
 <translation id="485592688953820832">कोई कार्रवाई नहीं (रोकें)</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 74e7eb45..ac86622 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -245,7 +245,7 @@
 <translation id="4477350412780666475">次の曲</translation>
 <translation id="4479639480957787382">イーサネット</translation>
 <translation id="4481530544597605423">ペア設定されていないデバイス</translation>
-<translation id="4505050298327493054">有効なデスクです。</translation>
+<translation id="4505050298327493054">使用中のウィンドウです。</translation>
 <translation id="4513946894732546136">フィードバック</translation>
 <translation id="4527045527269911712">Bluetooth デバイス「<ph name="DEVICE_NAME" />」がペア設定の権限をリクエストしています。</translation>
 <translation id="453661520163887813">あと <ph name="TIME" /> で充電完了</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 5bbc39f1..bb4a1db 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -88,6 +88,7 @@
 <translation id="2127372758936585790">저출력 충전기</translation>
 <translation id="2135456203358955318">고정 돋보기</translation>
 <translation id="2144487987174258011">Adobe Flash Player를 업데이트하려면 다시 시작하세요.</translation>
+<translation id="2148902151539191989">뒤로</translation>
 <translation id="2208323208084708176">통합 바탕화면 모드</translation>
 <translation id="2220572644011485463">PIN 또는 비밀번호</translation>
 <translation id="225680501294068881">기기 검색 중...</translation>
@@ -262,6 +263,7 @@
 <translation id="4778095205580009397">데모 세션에서는 Google 어시스턴트를 사용할 수 없습니다.</translation>
 <translation id="479989351350248267">검색</translation>
 <translation id="4804818685124855865">연결 해제</translation>
+<translation id="4814539958450445987">로그인 화면</translation>
 <translation id="4831034276697007977">자동 클릭을 사용 중지하시겠습니까?</translation>
 <translation id="4849058404725798627">키보드 포커스로 개체 강조표시</translation>
 <translation id="485592688953820832">작업 없음(일시중지)</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index e5242d7f..e3d14425 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
 <translation id="1012876632442809908">USB-C डिव्‍हाइस (पुढील बाजूचे पोर्ट)</translation>
-<translation id="1013923882670373915">"<ph name="DEVICE_NAME" />" ब्लूटूथ डिव्हाइस पेअरिंगसाठी परवानगी घेऊ इच्छिते. कृपया त्या डिव्हाइसवर हा पिन एंटर करा: <ph name="PINCODE" /></translation>
+<translation id="1013923882670373915">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते. कृपया त्या डिव्हाइसवर हा पिन प्रविष्ट करा: <ph name="PINCODE" /></translation>
 <translation id="1032891413405719768">स्टायलस बॅटरी कमी आहे</translation>
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> जोडले</translation>
 <translation id="1056775291175587022">कोणतीही नेटवर्क नाहीत</translation>
@@ -107,7 +107,7 @@
 <translation id="2412593942846481727">अपडेट उपलब्ध आहे</translation>
 <translation id="2413728805700750528"><ph name="DISPLAY_NAME" /> हे <ph name="DOMAIN" /> द्वारे व्यवस्थापित केलेले एक सेशन आहे</translation>
 <translation id="2427507373259914951">लेफ्ट क्लिक करा</translation>
-<translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" ब्लूटूथ डिव्हाइस पेअरिंगसाठी परवानगी घेऊ इच्छिते. स्वीकार करण्यापूर्वी, कृपया त्या डिव्हाइसवर ही पासकी दाखवली असल्याची पुष्टी करा: <ph name="PASSKEY" /></translation>
+<translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते. स्वीकार करण्यापूर्वी, कृपया त्या डिव्हाइसवर ही पासकी दर्शवली असल्याची पुष्टी करा: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">सूचना</translation>
 <translation id="2484513351006226581">कीबोर्डचा लेआउट स्विच करण्यासाठी <ph name="KEYBOARD_SHORTCUT" /> दाबा.</translation>
 <translation id="2501920221385095727">स्टिकी की</translation>
@@ -223,6 +223,7 @@
 <translation id="4181841719683918333">भाषा</translation>
 <translation id="4195877955194704651">आपोआप क्लिक बटण</translation>
 <translation id="4217571870635786043">डिक्टेशन</translation>
+<translation id="421885205185866088"><ph name="USER_EMAIL_ADDRESS" /> साठीचा स्‍मार्ट कार्ड पिन</translation>
 <translation id="4239069858505860023">GPRS</translation>
 <translation id="4261870227682513959">सूचना सेटिंग्ज दाखवा. सूचना बंद आहेत</translation>
 <translation id="4269883910223712419">या डिव्हाइसचे प्रशासन पुढील गोष्टी करू शकते:</translation>
@@ -245,7 +246,7 @@
 <translation id="4481530544597605423">जोडणी वेगळी केलेली डिव्हाइस</translation>
 <translation id="4505050298327493054">अॅक्टिव्ह डेस्क.</translation>
 <translation id="4513946894732546136">अभिप्राय</translation>
-<translation id="4527045527269911712">"<ph name="DEVICE_NAME" />" ब्लूटूथ डिव्हाइस पेअरिंगसाठी परवानगी घेऊ इच्छिते.</translation>
+<translation id="4527045527269911712">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते.</translation>
 <translation id="453661520163887813">पूर्ण होण्यात <ph name="TIME" /></translation>
 <translation id="4544944664594876241">स्क्रीन लॉक करण्‍याचा शॉर्टकट बदलला आहे. कृपया <ph name="OLD_SHORTCUT" /> ऐवजी <ph name="NEW_SHORTCUT" /> वापरा.</translation>
 <translation id="4561267230861221837">3G</translation>
@@ -302,7 +303,7 @@
 <translation id="554893713779400387">डिक्टेशन टॉगल करा</translation>
 <translation id="5571066253365925590">ब्लूटूथ सक्षम</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
-<translation id="5600837773213129531">वाचिक अभिप्राय देणे बंद करण्यासाठी Ctrl + Alt + Z दाबा.</translation>
+<translation id="5600837773213129531">वाचिक फीडबॅक देणे बंद करण्यासाठी Ctrl + Alt + Z दाबा.</translation>
 <translation id="5625955975703555628">LTE+</translation>
 <translation id="5648021990716966815">माइक जॅक</translation>
 <translation id="5669267381087807207">सक्रिय करीत आहे </translation>
@@ -374,7 +375,7 @@
 <translation id="6585808820553845416"><ph name="SESSION_TIME_REMAINING" /> मध्ये सेशन समाप्त होते.</translation>
 <translation id="6627638273713273709">Search+Shift+K</translation>
 <translation id="6637729079642709226">वेळ बदला</translation>
-<translation id="6650933572246256093">"<ph name="DEVICE_NAME" />" ब्लूटूथ डिव्हाइस पेअरिंगसाठी परवानगी घेऊ इच्छिते. कृपया त्या डिव्हाइसवर ही पासकी एंटर करा: <ph name="PASSKEY" /></translation>
+<translation id="6650933572246256093">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते. कृपया त्या डिव्हाइसवर ही पासकी प्रविष्ट करा: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">पासवर्ड</translation>
 <translation id="6665545700722362599">वेबसाइट, अ‍ॅप्स आणि एक्स्टेंशनना स्थान सेवा, डिव्हाइसचा मायक्रोफोन, कॅमेरा किंवा इतर वैशिष्ट्ये वापरण्याची परवानगी द्या</translation>
 <translation id="6670153871843998651">डेस्‍क ३</translation>
@@ -441,7 +442,7 @@
 <translation id="7645176681409127223"><ph name="USER_NAME" /> (मालक)</translation>
 <translation id="7647488630410863958">आपल्या सूचना पाहण्यासाठी डिव्हाइस अनलॉक करा</translation>
 <translation id="7649070708921625228">मदत</translation>
-<translation id="7654687942625752712">वाचिक अभिप्राय बंद करण्यासाठी दोन्ही व्हॉल्यूम की पाच सेकंदांसाठी दाबा आणि धरून ठेवा.</translation>
+<translation id="7654687942625752712">वाचिक फीडबॅक बंद करण्यासाठी दोन्ही व्हॉल्युम की पाच सेकंदांसाठी दाबा आणि धरून ठेवा.</translation>
 <translation id="7692480393933218409">कनेक्ट केलेले USB-C डिव्‍हाइसेस चार्ज करीत आहे</translation>
 <translation id="7705524343798198388">VPN</translation>
 <translation id="7723389094756330927">{NUM_NOTIFICATIONS,plural, =1{एक सूचना}other{# सूचना}}</translation>
diff --git a/ash/system/night_light/DEPS b/ash/system/night_light/DEPS
new file mode 100644
index 0000000..179ac35c
--- /dev/null
+++ b/ash/system/night_light/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+  "night_light_controller_impl.cc": [
+    "+cc/base/math_util.h",
+  ],
+}
diff --git a/ash/system/night_light/night_light_controller_impl.cc b/ash/system/night_light/night_light_controller_impl.cc
index 366858a..ee19be3 100644
--- a/ash/system/night_light/night_light_controller_impl.cc
+++ b/ash/system/night_light/night_light_controller_impl.cc
@@ -19,6 +19,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/ranges.h"
 #include "base/time/time.h"
+#include "cc/base/math_util.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "third_party/icu/source/i18n/astro.h"
@@ -115,9 +116,9 @@
 // 1 => Range [20 : 40).
 // 2 => Range [40 : 60).
 // 3 => Range [60 : 80).
-// 4 => Range [80 : 100) (most warm).
+// 4 => Range [80 : 100] (most warm).
 int GetTemperatureRange(float temperature) {
-  return std::floor(5 * temperature);
+  return base::ClampToRange(std::floor(5 * temperature), 0.0f, 4.0f);
 }
 
 // Returns the color matrix that corresponds to the given |temperature|.
@@ -257,6 +258,11 @@
   // given |new_target_temperature| in the given |duration|.
   void AnimateToNewValue(float new_target_temperature,
                          base::TimeDelta duration) {
+    if (cc::MathUtil::IsWithinEpsilon(current_temperature_,
+                                      new_target_temperature)) {
+      return;
+    }
+
     start_temperature_ = current_temperature_;
     target_temperature_ =
         base::ClampToRange(new_target_temperature, 0.0f, 1.0f);
@@ -287,8 +293,8 @@
   void AnimationProgressed(const Animation* animation) override {
     DCHECK_EQ(animation, this);
 
-    if (std::abs(current_temperature_ - target_temperature_) <=
-        std::numeric_limits<float>::epsilon()) {
+    if (cc::MathUtil::IsWithinEpsilon(current_temperature_,
+                                      target_temperature_)) {
       current_temperature_ = target_temperature_;
       Stop();
     }
@@ -538,17 +544,14 @@
   }
 }
 
-void NightLightControllerImpl::RefreshLayersTemperature() {
-  const float new_temperature = GetEnabled() ? GetColorTemperature() : 0.0f;
+void NightLightControllerImpl::RefreshDisplaysTemperature(
+    float color_temperature) {
+  const float new_temperature = GetEnabled() ? color_temperature : 0.0f;
   temperature_animation_->AnimateToNewValue(
       new_temperature, animation_duration_ == AnimationDuration::kShort
                            ? kManualAnimationDuration
                            : kAutomaticAnimationDuration);
 
-  UMA_HISTOGRAM_EXACT_LINEAR(
-      "Ash.NightLight.Temperature", GetTemperatureRange(new_temperature),
-      5 /* number of buckets defined in GetTemperatureRange() */);
-
   // Reset the animation type back to manual to consume any automatically set
   // animations.
   last_animation_duration_ = animation_duration_;
@@ -616,7 +619,11 @@
 
 void NightLightControllerImpl::OnColorTemperaturePrefChanged() {
   DCHECK(active_user_pref_service_);
-  RefreshLayersTemperature();
+  const float color_temperature = GetColorTemperature();
+  UMA_HISTOGRAM_EXACT_LINEAR(
+      "Ash.NightLight.Temperature", GetTemperatureRange(color_temperature),
+      5 /* number of buckets defined in GetTemperatureRange() */);
+  RefreshDisplaysTemperature(color_temperature);
 }
 
 void NightLightControllerImpl::OnScheduleTypePrefChanged() {
@@ -633,7 +640,7 @@
 }
 
 void NightLightControllerImpl::Refresh(bool did_schedule_change) {
-  RefreshLayersTemperature();
+  RefreshDisplaysTemperature(GetColorTemperature());
 
   const ScheduleType type = GetScheduleType();
   switch (type) {
diff --git a/ash/system/night_light/night_light_controller_impl.h b/ash/system/night_light/night_light_controller_impl.h
index f5fff94..b327147d 100644
--- a/ash/system/night_light/night_light_controller_impl.h
+++ b/ash/system/night_light/night_light_controller_impl.h
@@ -159,7 +159,10 @@
   // being able to retrieve a valid geoposition.
   void StoreCachedGeoposition(const SimpleGeoposition& position);
 
-  void RefreshLayersTemperature();
+  // Refreshes the displays color transforms based on the given
+  // |color_temperature|, which will be overridden to a value of 0 if NightLight
+  // is turned off.
+  void RefreshDisplaysTemperature(float color_temperature);
 
   void StartWatchingPrefsChanges();
 
diff --git a/base/trace_event/trace_config.cc b/base/trace_event/trace_config.cc
index 22d6098..5b4493f1 100644
--- a/base/trace_event/trace_config.cc
+++ b/base/trace_event/trace_config.cc
@@ -28,6 +28,8 @@
 const char kRecordAsMuchAsPossible[] = "record-as-much-as-possible";
 const char kTraceToConsole[] = "trace-to-console";
 const char kEnableSystrace[] = "enable-systrace";
+constexpr int kEnableSystraceLength = sizeof(kEnableSystrace) - 1;
+
 const char kEnableArgumentFilter[] = "enable-argument-filter";
 
 // String parameters that can be used to parse the trace config string.
@@ -35,6 +37,7 @@
 const char kTraceBufferSizeInEvents[] = "trace_buffer_size_in_events";
 const char kTraceBufferSizeInKb[] = "trace_buffer_size_in_kb";
 const char kEnableSystraceParam[] = "enable_systrace";
+const char kSystraceEventsParam[] = "enable_systrace_events";
 const char kEnableArgumentFilterParam[] = "enable_argument_filter";
 
 // String parameters that is used to parse memory dump config in trace config
@@ -298,6 +301,7 @@
   memory_dump_config_ = rhs.memory_dump_config_;
   event_filters_ = rhs.event_filters_;
   histogram_names_ = rhs.histogram_names_;
+  systrace_events_ = rhs.systrace_events_;
   return *this;
 }
 
@@ -355,6 +359,7 @@
   process_filter_config_.Clear();
   event_filters_.clear();
   histogram_names_.clear();
+  systrace_events_.clear();
 }
 
 void TraceConfig::InitializeDefault() {
@@ -406,6 +411,15 @@
     else
       SetDefaultMemoryDumpConfig();
   }
+
+  systrace_events_.clear();
+  if (enable_systrace_) {
+    const Value* systrace_events = dict.FindListKey(kSystraceEventsParam);
+    if (systrace_events) {
+      for (const Value& value : systrace_events->GetList())
+        systrace_events_.insert(value.GetString());
+    }
+  }
 }
 
 void TraceConfig::InitializeFromConfigString(StringPiece config_string) {
@@ -425,6 +439,7 @@
   trace_buffer_size_in_events_ = 0;
   trace_buffer_size_in_kb_ = 0;
   enable_systrace_ = false;
+  systrace_events_.clear();
   enable_argument_filter_ = false;
   if (!trace_options_string.empty()) {
     std::vector<std::string> split =
@@ -438,8 +453,27 @@
         record_mode_ = ECHO_TO_CONSOLE;
       } else if (token == kRecordAsMuchAsPossible) {
         record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
-      } else if (token == kEnableSystrace) {
+      } else if (token.find(kEnableSystrace) == 0) {
+        // Find optional events list.
+        const size_t length = token.length();
+        if (length == kEnableSystraceLength) {
+          // Use all predefined categories.
+          enable_systrace_ = true;
+          continue;
+        }
+        const auto system_events_not_trimmed =
+            token.substr(kEnableSystraceLength);
+        const auto system_events =
+            TrimString(system_events_not_trimmed, kWhitespaceASCII, TRIM_ALL);
+        if (system_events[0] != '=') {
+          LOG(ERROR) << "Failed to parse " << token;
+          continue;
+        }
         enable_systrace_ = true;
+        const std::vector<std::string> split_systrace_events = SplitString(
+            system_events.substr(1), " ", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
+        for (const std::string& systrace_event : split_systrace_events)
+          systrace_events_.insert(systrace_event);
       } else if (token == kEnableArgumentFilter) {
         enable_argument_filter_ = true;
       }
@@ -622,9 +656,22 @@
     dict.SetKey(kHistogramNamesParam, Value(std::move(histogram_names)));
   }
 
+  if (enable_systrace_) {
+    if (!systrace_events_.empty()) {
+      std::vector<Value> systrace_events;
+      for (const std::string& systrace_event : systrace_events_)
+        systrace_events.emplace_back(systrace_event);
+      dict.SetKey(kSystraceEventsParam, Value(std::move(systrace_events)));
+    }
+  }
+
   return dict;
 }
 
+void TraceConfig::EnableSystraceEvent(const std::string& systrace_event) {
+  systrace_events_.insert(systrace_event);
+}
+
 void TraceConfig::EnableHistogram(const std::string& histogram_name) {
   histogram_names_.insert(histogram_name);
 }
@@ -647,10 +694,24 @@
     default:
       NOTREACHED();
   }
-  if (enable_systrace_)
-    ret = ret + "," + kEnableSystrace;
-  if (enable_argument_filter_)
-    ret = ret + "," + kEnableArgumentFilter;
+  if (enable_systrace_) {
+    ret += ",";
+    ret += kEnableSystrace;
+    bool first_param = true;
+    for (const std::string& systrace_event : systrace_events_) {
+      if (first_param) {
+        ret += "=";
+        first_param = false;
+      } else {
+        ret += " ";
+      }
+      ret = ret + systrace_event;
+    }
+  }
+  if (enable_argument_filter_) {
+    ret += ",";
+    ret += kEnableArgumentFilter;
+  }
   return ret;
 }
 
diff --git a/base/trace_event/trace_config.h b/base/trace_event/trace_config.h
index 9798c7f..29261905 100644
--- a/base/trace_event/trace_config.h
+++ b/base/trace_event/trace_config.h
@@ -242,6 +242,7 @@
   }
   void SetTraceBufferSizeInKb(size_t size) { trace_buffer_size_in_kb_ = size; }
   void EnableSystrace() { enable_systrace_ = true; }
+  void EnableSystraceEvent(const std::string& systrace_event);
   void EnableArgumentFilter() { enable_argument_filter_ = true; }
   void EnableHistogram(const std::string& histogram_name);
 
@@ -286,6 +287,10 @@
     event_filters_ = filter_configs;
   }
 
+  const std::unordered_set<std::string>& systrace_events() const {
+    return systrace_events_;
+  }
+
   const std::unordered_set<std::string>& histogram_names() const {
     return histogram_names_;
   }
@@ -294,6 +299,7 @@
   FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromValidLegacyFormat);
   FRIEND_TEST_ALL_PREFIXES(TraceConfigTest,
                            TraceConfigFromInvalidLegacyStrings);
+  FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, SystraceEventsSerialization);
 
   // The default trace config, used when none is provided.
   // Allows all non-disabled-by-default categories through, except if they end
@@ -332,6 +338,7 @@
 
   EventFilters event_filters_;
   std::unordered_set<std::string> histogram_names_;
+  std::unordered_set<std::string> systrace_events_;
 };
 
 }  // namespace trace_event
diff --git a/base/trace_event/trace_config_unittest.cc b/base/trace_event/trace_config_unittest.cc
index c7e98a4..16cd67ec 100644
--- a/base/trace_event/trace_config_unittest.cc
+++ b/base/trace_event/trace_config_unittest.cc
@@ -674,5 +674,25 @@
       tc.memory_dump_config().heap_profiler_options.breakdown_threshold_bytes);
 }
 
+TEST(TraceConfigTest, SystraceEventsSerialization) {
+  TraceConfig tc(MemoryDumpManager::kTraceCategory, "");
+  tc.EnableSystrace();
+  EXPECT_EQ(0U, tc.systrace_events().size());
+  tc.EnableSystraceEvent("power");            // As a events category
+  tc.EnableSystraceEvent("timer:tick_stop");  // As an event
+  EXPECT_EQ(2U, tc.systrace_events().size());
+
+  const TraceConfig tc1(MemoryDumpManager::kTraceCategory,
+                        tc.ToTraceOptionsString());
+  EXPECT_EQ(2U, tc1.systrace_events().size());
+  EXPECT_TRUE(tc1.systrace_events().count("power"));
+  EXPECT_TRUE(tc1.systrace_events().count("timer:tick_stop"));
+
+  const TraceConfig tc2(tc.ToString());
+  EXPECT_EQ(2U, tc2.systrace_events().size());
+  EXPECT_TRUE(tc2.systrace_events().count("power"));
+  EXPECT_TRUE(tc2.systrace_events().count("timer:tick_stop"));
+}
+
 }  // namespace trace_event
 }  // namespace base
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc
index 52ab00c..42a00ea2 100644
--- a/cc/layers/painted_scrollbar_layer.cc
+++ b/cc/layers/painted_scrollbar_layer.cc
@@ -11,10 +11,6 @@
 #include "cc/trees/layer_tree_host.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
-namespace {
-static constexpr int kMaxScrollbarDimension = 8192;
-}
-
 namespace cc {
 
 std::unique_ptr<LayerImpl> PaintedScrollbarLayer::CreateLayerImpl(
@@ -239,13 +235,23 @@
   // Pages can end up requesting arbitrarily large scrollbars.  Prevent this
   // from crashing due to OOM and try something smaller.
   SkBitmap skbitmap;
-  if (!skbitmap.tryAllocN32Pixels(content_rect.width(),
-                                  content_rect.height())) {
-    content_rect.Intersect(
-        gfx::Rect(requested_content_rect.x(), requested_content_rect.y(),
-                  kMaxScrollbarDimension, kMaxScrollbarDimension));
-    skbitmap.allocN32Pixels(content_rect.width(), content_rect.height());
+  bool allocation_succeeded =
+      skbitmap.tryAllocN32Pixels(content_rect.width(), content_rect.height());
+  // Assuming 4bpp, caps at 4M.
+  constexpr int kMinScrollbarDimension = 1024;
+  int dimension = std::max(content_rect.width(), content_rect.height()) / 2;
+  while (!allocation_succeeded && dimension >= kMinScrollbarDimension) {
+    content_rect.Intersect(gfx::Rect(requested_content_rect.x(),
+                                     requested_content_rect.y(), dimension,
+                                     dimension));
+    allocation_succeeded =
+        skbitmap.tryAllocN32Pixels(content_rect.width(), content_rect.height());
+    if (!allocation_succeeded)
+      dimension = dimension / 2;
   }
+  CHECK(allocation_succeeded)
+      << "Failed to allocate memory for scrollbar at dimension : " << dimension;
+
   SkiaPaintCanvas canvas(skbitmap);
   canvas.clear(SK_ColorTRANSPARENT);
 
diff --git a/cc/tiles/checker_image_tracker.cc b/cc/tiles/checker_image_tracker.cc
index c31c7b5..ebaf3d0 100644
--- a/cc/tiles/checker_image_tracker.cc
+++ b/cc/tiles/checker_image_tracker.cc
@@ -209,6 +209,7 @@
   image_id_to_decode_.clear();
 
   if (can_clear_decode_policy_tracking) {
+    decoding_mode_map_.clear();
     image_async_decode_state_.clear();
   } else {
     // If we can't clear the decode policy, we need to make sure we still
diff --git a/cc/tiles/checker_image_tracker_unittest.cc b/cc/tiles/checker_image_tracker_unittest.cc
index 47dc8ab1..57984cc 100644
--- a/cc/tiles/checker_image_tracker_unittest.cc
+++ b/cc/tiles/checker_image_tracker_unittest.cc
@@ -381,6 +381,11 @@
   // Now clear the decode tracking as well. The image will be re-checkered.
   can_clear_decode_policy_tracking = true;
   checker_image_tracker_->ClearTracker(can_clear_decode_policy_tracking);
+  // Re-initialize the decoding hint state. The decode policy tracking should
+  // only be done when all image state will be re-created, so is safe to purge.
+  checker_image_tracker_->UpdateImageDecodingHints(
+      {{checkerable_image.paint_image().stable_id(),
+        PaintImage::DecodingMode::kAsync}});
   image_decode_queue =
       BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE);
   EXPECT_EQ(image_decode_queue.size(), 1U);
diff --git a/chrome/VERSION b/chrome/VERSION
index 4b545af..7b4b7c6 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=79
 MINOR=0
-BUILD=3916
+BUILD=3917
 PATCH=0
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb
index ffdc8466..112f4b3 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="1566281227936819866">Ipinapakita ang mga na-save na paraan ng pagbabayad</translation>
+<translation id="2354494097381247142">Available sa keyboard accessory ang mga suhestyon sa pagsagot</translation>
 <translation id="2610239185026711824">Magmungkahi ng password</translation>
 <translation id="2803478378562657435">Ipinapakita ang mga naka-save na password at mga opsyon sa password</translation>
 <translation id="2903493209154104877">Mga Address</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb
index 936060e..e807968 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
 <translation id="1566281227936819866">सेव किए गए भुगतान के तरीके दिखाए जा रहे हैं</translation>
+<translation id="2354494097381247142">कीबोर्ड एक्सेसरी में अपने आप भरने के लिए सुझाव मौजूद हैं</translation>
 <translation id="2610239185026711824">पासवर्ड सुझाएं</translation>
 <translation id="2803478378562657435">सेव किए हुए पासवर्ड और पासवर्ड के विकल्प दिखाए जा रहे हैं</translation>
 <translation id="2903493209154104877">पते</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb
index b1e08f4..bd3f9b4 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
 <translation id="1566281227936819866">저장된 결제 수단 표시 중</translation>
+<translation id="2354494097381247142">키보드 액세서리에서 사용 가능한 자동 완성 제안</translation>
 <translation id="2610239185026711824">비밀번호 추천</translation>
 <translation id="2803478378562657435">저장된 비밀번호 및 비밀번호 옵션 표시 중</translation>
 <translation id="2903493209154104877">주소</translation>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
index 76fb603..550fdfe 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
@@ -16,14 +16,13 @@
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
-import org.chromium.chrome.browser.suggestions.DestructionObserver;
 import org.chromium.chrome.browser.suggestions.ImageFetcher;
 import org.chromium.chrome.browser.suggestions.SuggestionsConfig;
 import org.chromium.chrome.browser.suggestions.SuggestionsDependencyFactory;
 import org.chromium.chrome.browser.suggestions.SuggestionsEventReporter;
-import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
 import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
 import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegateImpl;
 import org.chromium.chrome.browser.suggestions.tile.SuggestionsTileView;
 import org.chromium.chrome.browser.suggestions.tile.Tile;
 import org.chromium.chrome.browser.suggestions.tile.TileGroup;
@@ -38,44 +37,40 @@
  *
  * TODO(mattsimmons): Finish MVC of this. The way the renderer builds the layout complicates things.
  */
-class MostVisitedListCoordinator
-        implements SuggestionsUiDelegate, TileGroup.Observer, TileGroup.TileSetupDelegate {
+class MostVisitedListCoordinator implements TileGroup.Observer, TileGroup.TileSetupDelegate {
     private static final int TITLE_LINES = 1;
 
     // There's a limit of 12 in {@link MostVisitedSitesBridge#setObserver}.
     private static final int MAX_RESULTS = 12;
-    private SuggestionsSource mSuggestionsSource;
-    private SuggestionsRanker mSuggestionsRanker;
-    private SuggestionsEventReporter mEventReporter;
-    private SnackbarManager mSnackbarManager;
     private TileGroup mTileGroup;
-    private ImageFetcher mImageFetcher;
-    private DiscardableReferencePool mReferencePool;
     private TileRenderer mRenderer;
     private ViewGroup mParent;
 
     public MostVisitedListCoordinator(ChromeActivity activity, ViewGroup parent) {
         mParent = parent;
         Profile profile = Profile.getLastUsedProfile();
-        mSuggestionsSource =
+        SuggestionsSource suggestionsSource =
                 SuggestionsDependencyFactory.getInstance().createSuggestionSource(profile);
-        mSuggestionsRanker = new SuggestionsRanker();
-        mEventReporter = SuggestionsDependencyFactory.getInstance().createEventReporter();
+        SuggestionsRanker suggestionsRanker = new SuggestionsRanker();
+        SuggestionsEventReporter eventReporter =
+                SuggestionsDependencyFactory.getInstance().createEventReporter();
 
-        mReferencePool = GlobalDiscardableReferencePool.getReferencePool();
-        mImageFetcher = new ImageFetcher(mSuggestionsSource, profile, mReferencePool);
-        mSnackbarManager = activity.getSnackbarManager();
+        DiscardableReferencePool referencePool = GlobalDiscardableReferencePool.getReferencePool();
+        ImageFetcher imageFetcher = new ImageFetcher(suggestionsSource, profile, referencePool);
+        SnackbarManager snackbarManager = activity.getSnackbarManager();
 
         mRenderer = new TileRenderer(
-                activity, SuggestionsConfig.TileStyle.MODERN, TITLE_LINES, mImageFetcher);
+                activity, SuggestionsConfig.TileStyle.MODERN, TITLE_LINES, imageFetcher);
 
         OfflinePageBridge offlinePageBridge =
                 SuggestionsDependencyFactory.getInstance().getOfflinePageBridge(profile);
 
         TileGroupDelegateImpl tileGroupDelegate =
-                new TileGroupDelegateImpl(activity, profile, null, mSnackbarManager);
-        mTileGroup =
-                new TileGroup(mRenderer, this, null, tileGroupDelegate, this, offlinePageBridge);
+                new TileGroupDelegateImpl(activity, profile, null, snackbarManager);
+        SuggestionsUiDelegate suggestionsUiDelegate = new MostVisitedSuggestionsUiDelegate(
+                suggestionsSource, eventReporter, profile, referencePool, snackbarManager);
+        mTileGroup = new TileGroup(
+                mRenderer, suggestionsUiDelegate, null, tileGroupDelegate, this, offlinePageBridge);
         mTileGroup.startObserving(MAX_RESULTS);
     }
 
@@ -93,52 +88,7 @@
         }
     }
 
-    /** SuggestionsUiDelegate Implementation. */
-    @Override
-    public SuggestionsSource getSuggestionsSource() {
-        return mSuggestionsSource;
-    }
-
-    @Override
-    public SuggestionsRanker getSuggestionsRanker() {
-        return mSuggestionsRanker;
-    }
-
-    @Override
-    public SuggestionsEventReporter getEventReporter() {
-        return mEventReporter;
-    }
-
-    @Override
-    public SuggestionsNavigationDelegate getNavigationDelegate() {
-        return null;
-    }
-
-    @Override
-    public ImageFetcher getImageFetcher() {
-        return mImageFetcher;
-    }
-
-    @Override
-    public SnackbarManager getSnackbarManager() {
-        return mSnackbarManager;
-    }
-
-    @Override
-    public DiscardableReferencePool getReferencePool() {
-        return mReferencePool;
-    }
-
-    @Override
-    public void addDestructionObserver(DestructionObserver destructionObserver) {}
-
-    @Override
-    public boolean isVisible() {
-        return false;
-    }
-
     /** TileGroup.Observer implementation. */
-
     @Override
     public void onTileDataChanged() {
         if (mTileGroup.getTileSections().size() < 1) return;
@@ -181,7 +131,8 @@
         return callback;
     }
 
-    private class MostVisitedTileInteractionDelegate implements TileInteractionDelegate {
+    /** Handle interactions with the Most Visited tiles. */
+    private static class MostVisitedTileInteractionDelegate implements TileInteractionDelegate {
         private Tile mTile;
 
         public MostVisitedTileInteractionDelegate(Tile tile) {
@@ -203,4 +154,19 @@
             // TODO(mattsimmons): Handle this, likely not a blocker for MVP.
         }
     }
+
+    /** Suggestions UI Delegate for constructing the TileGroup. */
+    private static class MostVisitedSuggestionsUiDelegate extends SuggestionsUiDelegateImpl {
+        public MostVisitedSuggestionsUiDelegate(SuggestionsSource suggestionsSource,
+                SuggestionsEventReporter eventReporter, Profile profile,
+                DiscardableReferencePool referencePool, SnackbarManager snackbarManager) {
+            super(suggestionsSource, eventReporter, null, profile, null, referencePool,
+                    snackbarManager);
+        }
+
+        @Override
+        public boolean isVisible() {
+            return false;
+        }
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
index 0fd00415..07b00b6 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">ስብስብ በመፍጠር በፍጥነት ገጾችን ያነጻጽሩ። ለመጀመር አንድ አገናኝን ነክተው ይያዙ።</translation>
 <translation id="5497272504048921382">የተከፈቱ ትሮች</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> ትሮች ተሰብስበዋል</translation>
-<translation id="5586306159936941448">ለመቦደን አንድን ትር ወደ ሌላ ትር ይጎትቱት</translation>
 <translation id="5792534911093536736">ተጨማሪ ትሮች</translation>
 <translation id="58326064309361797">ለመቦደን ትሮችን ይጎትቱ</translation>
 <translation id="6193448654517602979">ትሮችን ምረጥ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb
index 8fa76d4..99fe9d4d 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">يُرجى مقارنة الصفحات بسرعة من خلال إنشاء مجموعة. للبدء، المس رابطًا مع الاستمرار.</translation>
 <translation id="5497272504048921382">علامات تبويب مفتوحة</translation>
 <translation id="5580090775658607195">تم دمج <ph name="TAB_COUNT" /> علامة تبويب.</translation>
-<translation id="5586306159936941448">سحب علامة تبويب إلى علامة تبويب أخرى لتجميعها</translation>
 <translation id="5792534911093536736">المزيد من علامات التبويب</translation>
 <translation id="58326064309361797">سحب علامات التبويب لتجميعها</translation>
 <translation id="6193448654517602979">اختيار علامات التبويب</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
index 377a82e..bb531c4 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Сравнявайте бързо страници, като създадете група. За да започнете, докоснете и задръжте дадена връзка.</translation>
 <translation id="5497272504048921382">Отворени раздели</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> раздела са групирани</translation>
-<translation id="5586306159936941448">Преместете с плъзгане раздел върху друг, за да ги групирате</translation>
 <translation id="5792534911093536736">Още раздели</translation>
 <translation id="58326064309361797">Преместете с плъзгане разделите, за да ги групирате</translation>
 <translation id="6193448654517602979">Избиране на раздели</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb
index 2ef3aa47..a55ba28 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">একটি গ্রুপ তৈরি করে দ্রুত পৃষ্ঠাগুলির তুলনা করুন। শুরু করতে, কোনও একটি লিঙ্ক স্পর্শ করে ধরে থাকুন।</translation>
 <translation id="5497272504048921382">খুলে রাখা ট্যাব</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" />টি ট্যাব গ্রুপ করা হয়েছে</translation>
-<translation id="5586306159936941448">ট্যাবগুলিকে গ্রুপ করতে, একটিকে ড্র্যাগ করে আরেকটির উপর নিয়ে যান</translation>
 <translation id="5792534911093536736">আরও ট্যাব</translation>
 <translation id="58326064309361797">ট্যাবগুলি গ্রুপ করতে ড্র্যাগ করুন</translation>
 <translation id="6193448654517602979">ট্যাব বেছে নিন</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
index c5e21b27..daa12b3 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Crea un grup per comparar pàgines ràpidament. Per començar, mantén premut un enllaç.</translation>
 <translation id="5497272504048921382">Pestanyes obertes</translation>
 <translation id="5580090775658607195">S'han agrupat <ph name="TAB_COUNT" /> pestanyes</translation>
-<translation id="5586306159936941448">Arrossega una pestanya a sobre d'una altra per agrupar-les</translation>
 <translation id="5792534911093536736">Més pestanyes</translation>
 <translation id="58326064309361797">Arrossega les pestanyes per agrupar-les</translation>
 <translation id="6193448654517602979">Selecciona pestanyes</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb
index b71db7b..a3acb78 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Rychle stránky porovnejte tím, že vytvoříte skupinu. Chcete-li začít, podržte odkaz.</translation>
 <translation id="5497272504048921382">Tabulka otevřených karet</translation>
 <translation id="5580090775658607195">Byl seskupen tento počet karet: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Přetažením jedné karty na jinou můžete karty seskupit</translation>
 <translation id="5792534911093536736">Další karty</translation>
 <translation id="58326064309361797">Přetažením můžete karty uspořádat do skupin</translation>
 <translation id="6193448654517602979">Vyberte karty</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
index 92a377d0..943c101 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Sammenlign hurtigt sider ved at oprette en gruppe. Hold et link nede for at starte.</translation>
 <translation id="5497272504048921382">Åbne faner</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> faner blev grupperet</translation>
-<translation id="5586306159936941448">Træk en fane hen oven på en anden fane for at gruppere dem sammen</translation>
 <translation id="5792534911093536736">Flere faner</translation>
 <translation id="58326064309361797">Træk og slip faner for at gruppere dem</translation>
 <translation id="6193448654517602979">Vælg faner</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb
index c35a964..bd13dd45 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Sie können Seiten schnell miteinander vergleichen, indem Sie eine Gruppe erstellen. Berühren und halten Sie einen Link, um den Vorgang zu starten.</translation>
 <translation id="5497272504048921382">Geöffnete Tabs</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> Tabs gruppiert</translation>
-<translation id="5586306159936941448">Tab zum Gruppieren auf einen anderen Tab ziehen</translation>
 <translation id="5792534911093536736">Mehr Tabs</translation>
 <translation id="58326064309361797">Tabs zum Gruppieren ziehen</translation>
 <translation id="6193448654517602979">Tabs auswählen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb
index 3ed36d9..239d23f 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Συγκρίνετε γρήγορα σελίδες δημιουργώντας μια ομάδα. Για να ξεκινήσετε, αγγίξτε παρατεταμένα κάποιον σύνδεσμο.</translation>
 <translation id="5497272504048921382">Ανοιγμένες καρτέλες</translation>
 <translation id="5580090775658607195">Ομαδοποιήθηκαν <ph name="TAB_COUNT" /> καρτέλες</translation>
-<translation id="5586306159936941448">Σύρετε μια καρτέλα σε μια άλλη καρτέλα για να τις ομαδοποιήσετε.</translation>
 <translation id="5792534911093536736">Περισσότερες καρτέλες</translation>
 <translation id="58326064309361797">Σύρετε καρτέλες για να τις ομαδοποιήσετε.</translation>
 <translation id="6193448654517602979">Επιλογή καρτελών</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
index 7d7afb34..d57d3089 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Quickly compare pages by making a group. To start, touch and hold a link.</translation>
 <translation id="5497272504048921382">Opened tabs</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> tabs grouped</translation>
-<translation id="5586306159936941448">Drag a tab onto another tab to group them</translation>
 <translation id="5792534911093536736">More tabs</translation>
 <translation id="58326064309361797">Drag tabs to group them</translation>
 <translation id="6193448654517602979">Select tabs</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb
index 095c495b..147b5c9b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Forma un grupo para comparar las páginas rápidamente. Para comenzar, mantén presionado un vínculo.</translation>
 <translation id="5497272504048921382">Pestañas abiertas</translation>
 <translation id="5580090775658607195">Se agruparon <ph name="TAB_COUNT" /> pestañas</translation>
-<translation id="5586306159936941448">Arrastra una pestaña sobre otra para agruparlas</translation>
 <translation id="5792534911093536736">Más pestañas</translation>
 <translation id="58326064309361797">Arrastra las pestañas para agruparlas</translation>
 <translation id="6193448654517602979">Seleccionar pestañas</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb
index 725d5e4..ff8084b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Crea un grupo para comparar páginas rápidamente. Para comenzar, mantén pulsado un enlace.</translation>
 <translation id="5497272504048921382">Pestañas abiertas</translation>
 <translation id="5580090775658607195">Se han agrupado <ph name="TAB_COUNT" /> pestañas</translation>
-<translation id="5586306159936941448">Arrastra una pestaña y suéltala sobre otra para agruparlas</translation>
 <translation id="5792534911093536736">Más pestañas</translation>
 <translation id="58326064309361797">Arrastra las pestañas para agruparlas</translation>
 <translation id="6193448654517602979">Selecciona pestañas</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
index 0fecb15..cac4685 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Looge rühm, et lehti kiiresti võrrelda. Alustamiseks puudutage pikalt linki.</translation>
 <translation id="5497272504048921382">Avatud vahelehed</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> vahekaarti grupeeriti</translation>
-<translation id="5586306159936941448">Lohistage vaheleht teise vahelehe peale, et need rühmitada</translation>
 <translation id="5792534911093536736">Rohkem vahekaarte</translation>
 <translation id="58326064309361797">Lohistage vahelehti, et neid rühmitata</translation>
 <translation id="6193448654517602979">Valige vahelehed</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb
index 531314f..de36424 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">با ایجاد گروه، صفحه‌ها را سریع مقایسه کنید. برای شروع، پیوندی را لمس کنید و نگه دارید.</translation>
 <translation id="5497272504048921382">برگه‌های باز</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> برگه گروه‌بندی شد</translation>
-<translation id="5586306159936941448">برای گروه‌بندی برگه‌ها، برگه‌ای را روی برگه دیگر بکشید</translation>
 <translation id="5792534911093536736">برگه‌های بیشتر</translation>
 <translation id="58326064309361797">برای گروه‌بندی برگه‌ها، آن‌ها را بکشید</translation>
 <translation id="6193448654517602979">انتخاب برگه‌ها</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb
index 0e8389b1..bb4e8e27 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Luo ryhmä vertaillaksesi sivuja nopeasti. Aloita koskettamalla linkkiä pitkään.</translation>
 <translation id="5497272504048921382">Avatut välilehdet</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> välilehteä ryhmiteltiin</translation>
-<translation id="5586306159936941448">Ryhmittele välilehtiä vetämällä yksi välilehti toiseen</translation>
 <translation id="5792534911093536736">Lisää välilehtiä</translation>
 <translation id="58326064309361797">Ryhmittele välilehtiä vetämällä niitä</translation>
 <translation id="6193448654517602979">Valitse välilehdet</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb
index 126a16d..0458de8 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Mabilis na paghambing-hambingin ang mga page sa pamamagitan ng paggawa ng pangkat. Para magsimula, pindutin nang matagal ang isang link.</translation>
 <translation id="5497272504048921382">Mga binuksang tab</translation>
 <translation id="5580090775658607195">Naigrupo ang <ph name="TAB_COUNT" /> tab</translation>
-<translation id="5586306159936941448">Mag-drag ng tab sa isa pang tab para pagpangkatin ang mga ito</translation>
 <translation id="5792534911093536736">Higit pang tab</translation>
 <translation id="58326064309361797">I-drag ang mga tab para pagpangkatin ang mga ito</translation>
 <translation id="6193448654517602979">Pumili ng mga tab</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
index 3df4b5b..a77fa5a 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Comparez rapidement des pages en créant un groupe. Commencez par appuyer de manière prolongée sur un lien.</translation>
 <translation id="5497272504048921382">Onglets ouverts</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> onglets regroupés</translation>
-<translation id="5586306159936941448">Faites glisser un onglet sur un autre pour les regrouper</translation>
 <translation id="5792534911093536736">Plus d'onglets</translation>
 <translation id="58326064309361797">Faire glisser les onglets pour les regrouper</translation>
 <translation id="6193448654517602979">Sélectionner des onglets</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
index 4ada1515..1921f206 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">ગ્રૂપ બનાવીને ઝડપથી પેજની સરખામણી કરો. શરૂ કરવા માટે, લિંકને સ્પર્શ કરી રાખો.</translation>
 <translation id="5497272504048921382">ખુલેલા ટૅબ</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> ટૅબનું ગ્રૂપ બનાવ્યું</translation>
-<translation id="5586306159936941448">ટૅબનું ગ્રૂપ બનાવવા માટે એક ટૅબને બીજા ટૅબ પર ખેંચો</translation>
 <translation id="5792534911093536736">વધુ ટૅબ</translation>
 <translation id="58326064309361797">ટૅબનું ગ્રૂપ બનાવવા માટે તેને ખેંચો</translation>
 <translation id="6193448654517602979">ટૅબ પસંદ કરો</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
index d89916c..bac9c7b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">पेजों की तुलना तुरंत करने के लिए समूह बनाएं. शुरू करने के लिए, लिंक को दबाकर रखें.</translation>
 <translation id="5497272504048921382">खुले हुए टैब</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> टैब समूह में लगाए गए</translation>
-<translation id="5586306159936941448">दो टैब को समूह में जोड़ने के लिए, एक टैब को खींचें और दूसरे पर छोड़ें</translation>
 <translation id="5792534911093536736">और ज़्यादा टैब</translation>
 <translation id="58326064309361797">टैब को समूह में जोड़ने के लिए उन्हें खींचें और छोड़ें</translation>
 <translation id="6193448654517602979">टैब चुनें</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
index 6d5de07..36b3aaf 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Izradom grupe možete brzo usporediti stranice. Da biste započeli, dodirnite i držite vezu.</translation>
 <translation id="5497272504048921382">Otvorene kartice</translation>
 <translation id="5580090775658607195">Kartice su grupirane (njih <ph name="TAB_COUNT" />)</translation>
-<translation id="5586306159936941448">Povucite jednu karticu preko druge da biste ih grupirali</translation>
 <translation id="5792534911093536736">Više kartica</translation>
 <translation id="58326064309361797">Povucite kartice da biste ih grupirali</translation>
 <translation id="6193448654517602979">Odaberite kartice</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb
index f009bc8..3c602b0 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Csoport kialakításával gyorsan összehasonlíthat oldalakat. A kezdéshez tartsa lenyomva ujját a kívánt linken.</translation>
 <translation id="5497272504048921382">Megnyitott lapok</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> lap csoportosítva</translation>
-<translation id="5586306159936941448">A lapokat egymásra húzva csoportosíthatja</translation>
 <translation id="5792534911093536736">További lapok</translation>
 <translation id="58326064309361797">A lapokat húzással csoportosíthatja</translation>
 <translation id="6193448654517602979">Lapok kiválasztása</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
index 95730811..c80901dc 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Bandingkan halaman secara cepat dengan membuat grup. Untuk memulai, sentuh lama link.</translation>
 <translation id="5497272504048921382">Tab yang terbuka</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> tab dikelompokkan</translation>
-<translation id="5586306159936941448">Tarik tab ke tab lain untuk mengelompokkannya</translation>
 <translation id="5792534911093536736">Tab lainnya</translation>
 <translation id="58326064309361797">Tarik tab untuk mengelompokkannya</translation>
 <translation id="6193448654517602979">Pilih tab</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb
index 971d924..828a4ae 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Confronta rapidamente le pagine creando un gruppo. Innanzitutto, tocca e tieni premuto un link.</translation>
 <translation id="5497272504048921382">Schede aperte</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> schede raggruppate</translation>
-<translation id="5586306159936941448">Trascina una scheda sopra un'altra scheda per raggrupparle</translation>
 <translation id="5792534911093536736">Altre schede</translation>
 <translation id="58326064309361797">Trascina le schede per raggrupparle</translation>
 <translation id="6193448654517602979">Seleziona schede</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb
index bad487f..63f9bd3e 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">כדי להשוות במהירות בין דפים, אפשר ליצור קבוצה. כדי להתחיל, צריך ללחוץ לחיצה ארוכה על קישור.</translation>
 <translation id="5497272504048921382">כרטיסיות שנפתחו</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> כרטיסיות מקובצות</translation>
-<translation id="5586306159936941448">ניתן לגרור כרטיסייה אחת אל כרטיסייה אחרת כדי לקבץ אותן יחד</translation>
 <translation id="5792534911093536736">כרטיסיות נוספות</translation>
 <translation id="58326064309361797">ניתן לגרור כרטיסיות כדי לקבץ אותן</translation>
 <translation id="6193448654517602979">בחירת כרטיסיות</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
index 60d8f80b..8f21485 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">グループを作成して簡単にページを比較できます。グループを作成するには、リンクを長押しします。</translation>
 <translation id="5497272504048921382">開いているタブ</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> 個のタブがグループ化されました</translation>
-<translation id="5586306159936941448">タブをグループ化するには片方のタブをもう片方のタブにドラッグします</translation>
 <translation id="5792534911093536736">その他のタブ</translation>
 <translation id="58326064309361797">タブをグループ化するにはドラッグします</translation>
 <translation id="6193448654517602979">タブを選択</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
index 5b25c69..60ba5ca 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">ಗುಂಪನ್ನು ರಚಿಸುವ ಮೂಲಕ ಪುಟಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಹೋಲಿಸಿ ನೋಡಿ. ಪ್ರಾರಂಭಿಸಲು, ಲಿಂಕ್ ಸ್ಪರ್ಶಿಸಿ ಹಿಡಿಯಿರಿ.</translation>
 <translation id="5497272504048921382">ತೆರೆದಿರುವ ಟ್ಯಾಬ್‌ಗಳು</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> ಟ್ಯಾಬ್‌ಗಳನ್ನು ಗುಂಪು ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="5586306159936941448">ಟ್ಯಾಬ್‌ಗಳನ್ನು ಗುಂಪುಗೂಡಿಸಲು, ಒಂದು ಟ್ಯಾಬ್ ಅನ್ನು ಇನ್ನೊಂದು ಟ್ಯಾಬ್‌ನ ಮೇಲೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ</translation>
 <translation id="5792534911093536736">ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್‌ಗಳು</translation>
 <translation id="58326064309361797">ಟ್ಯಾಬ್‍‍ಗಳನ್ನು ಗುಂಪು ಮಾಡಲು ಅವುಗಳನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ</translation>
 <translation id="6193448654517602979">ಟ್ಯಾಬ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
index e565834b..b46a6dea 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">그룹을 만들어서 페이지를 빠르게 비교하세요. 시작하려면 링크를 길게 터치합니다.</translation>
 <translation id="5497272504048921382">탭이 열림</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" />개의 탭 그룹화됨</translation>
-<translation id="5586306159936941448">탭을 다른 탭으로 드래그하여 그룹화하세요.</translation>
 <translation id="5792534911093536736">탭 더보기</translation>
 <translation id="58326064309361797">탭을 드래그하여 그룹화하세요.</translation>
 <translation id="6193448654517602979">탭 선택</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
index 784338a..33ae8bc 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Sparčiai palyginkite puslapius sukūrę grupę. Jei norite pradėti, palieskite ir palaikykite nuorodą.</translation>
 <translation id="5497272504048921382">Atidaryti skirtukai</translation>
 <translation id="5580090775658607195">Sugrupuota tiek skirtukų: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Vilkite vieną skirtuką ant kito, kad juos sugrupuotumėte</translation>
 <translation id="5792534911093536736">Daugiau skirtukų</translation>
 <translation id="58326064309361797">Vilkite skirtukus, kad juos sugrupuotumėte</translation>
 <translation id="6193448654517602979">Pasirinkti skirtukus</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb
index 409d41e..b789876 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Ātri salīdziniet lapas, izveidojot grupu. Lai sāktu, pieskarieties un turiet saiti.</translation>
 <translation id="5497272504048921382">Atvērtās cilnes</translation>
 <translation id="5580090775658607195">Grupētas <ph name="TAB_COUNT" /> cilnes</translation>
-<translation id="5586306159936941448">Velciet cilnes vienu uz otras, lai tās sagrupētu</translation>
 <translation id="5792534911093536736">Citas cilnes</translation>
 <translation id="58326064309361797">Velciet cilnes, lai tās sagrupētu</translation>
 <translation id="6193448654517602979">Atlasiet cilnes</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb
index 000cd8d..f6aae5c 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">ഒരു ഗ്രൂപ്പ് സൃഷ്‌ടിച്ചുകൊണ്ട്, വേഗത്തിൽ പേജുകൾ താരതമ്യം ചെയ്യൂ. ആരംഭിക്കാൻ ഒരു ലിങ്ക് സ്‌പർശിച്ച് പിടിക്കുക.</translation>
 <translation id="5497272504048921382">തുറന്ന ടാബുകൾ</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> ടാബുകൾ ഗ്രൂപ്പ് ചെയ്‌തു</translation>
-<translation id="5586306159936941448">ടാബുകൾ ഗ്രൂപ്പ് ചെയ്യാൻ ഒരു ടാബ് മറ്റൊരു ടാബിലേക്ക് വലിച്ചിടുക</translation>
 <translation id="5792534911093536736">കൂടുതല്‍‌ ടാബുകള്‍‌</translation>
 <translation id="58326064309361797">ടാബുകൾ ഗ്രൂപ്പ് ചെയ്യാൻ അവ വലിച്ചിടുക</translation>
 <translation id="6193448654517602979">ടാബുകൾ തിരഞ്ഞെടുക്കുക</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
index 454f47a..008baa4 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">गट बनवून त्वरित पेजशी तुलना करा. सुरू करण्यासाठी, लिंकला स्पर्श करा आणि धरून ठेवा.</translation>
 <translation id="5497272504048921382">खुले टॅब</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> टॅबची गटामध्ये विभागणी केली आहे</translation>
-<translation id="5586306159936941448">त्यांना समूहित करण्यासाठी टॅबला दुसऱ्या टॅबवर ड्रॅग करा</translation>
 <translation id="5792534911093536736">अधिक टॅब</translation>
 <translation id="58326064309361797">त्यांचा गट बनवण्यासाठी टॅबना ड्रॅग करा</translation>
 <translation id="6193448654517602979">टॅब निवडा</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb
index ec84fbe0..7c745d1 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Bandingkan halaman dengan pantas dengan membuat kumpulan. Untuk bermula, sentuh &amp; tahan pautan.</translation>
 <translation id="5497272504048921382">Tab dibuka</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> tab dihimpunkan</translation>
-<translation id="5586306159936941448">Seret tab ke atas tab satu lagi untuk menghimpunkannya</translation>
 <translation id="5792534911093536736">Lagi tab</translation>
 <translation id="58326064309361797">Seret tab untuk menghimpunkannya</translation>
 <translation id="6193448654517602979">Pilih tab</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
index 711aa88..aef2ee6c 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Vergelijk pagina's snel door een groep te maken. Tik op een link en houd deze vast om te beginnen.</translation>
 <translation id="5497272504048921382">Geopende tabbladen</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> tabbladen gegroepeerd</translation>
-<translation id="5586306159936941448">Sleep een tabblad bovenop een ander tabblad om ze te groeperen</translation>
 <translation id="5792534911093536736">Meer tabbladen</translation>
 <translation id="58326064309361797">Sleep de tabbladen om ze te groeperen</translation>
 <translation id="6193448654517602979">Tabbladen selecteren</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
index 286526c..05ac8a1 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Sammenlign sider raskt ved å lage en gruppe. For å begynne, trykk og hold på en link.</translation>
 <translation id="5497272504048921382">Åpnede faner</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> faner er gruppert.</translation>
-<translation id="5586306159936941448">Dra en fane oppå en annen fane for å gruppere dem</translation>
 <translation id="5792534911093536736">Flere faner</translation>
 <translation id="58326064309361797">Dra faner for å gruppere dem</translation>
 <translation id="6193448654517602979">Velg faner</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb
index cc0b647..0f9a66d 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Możesz szybko porównać strony, tworząc ich grupę. Aby to zrobić, naciśnij i przytrzymaj link.</translation>
 <translation id="5497272504048921382">Otwarte karty</translation>
 <translation id="5580090775658607195">Pogrupowane karty: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Przeciągnij kartę na inną kartę, by utworzyć z nich grupę</translation>
 <translation id="5792534911093536736">Więcej kart</translation>
 <translation id="58326064309361797">Przeciągaj karty, by je pogrupować</translation>
 <translation id="6193448654517602979">Wybierz karty</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb
index cce6a2b..86370ab 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Compare as páginas rapidamente criando um grupo. Para começar, toque em um link e mantenha-o pressionado.</translation>
 <translation id="5497272504048921382">Guias abertas</translation>
 <translation id="5580090775658607195">Guias agrupadas: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Arraste uma guia até outra para agrupá-las</translation>
 <translation id="5792534911093536736">Mais guias</translation>
 <translation id="58326064309361797">Arraste as guias para agrupá-las</translation>
 <translation id="6193448654517602979">Selecione as guias</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb
index 736de0f..4955cde 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Compare páginas rapidamente através da criação de um grupo. Para começar, toque sem soltar num link.</translation>
 <translation id="5497272504048921382">Separadores abertos.</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> separadores agrupados</translation>
-<translation id="5586306159936941448">Arraste um separador para cima de outro separador para os agrupar.</translation>
 <translation id="5792534911093536736">Mais separadores</translation>
 <translation id="58326064309361797">Arraste os separadores para os agrupar.</translation>
 <translation id="6193448654517602979">Selecione os separadores</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
index bf9b80bd..350e8098 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Compară rapid paginile făcând un grup. Pentru a începe, atinge lung un link.</translation>
 <translation id="5497272504048921382">File deschise</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> file au fost grupate</translation>
-<translation id="5586306159936941448">Trage o filă peste o altă filă pentru a le grupa</translation>
 <translation id="5792534911093536736">Mai multe file</translation>
 <translation id="58326064309361797">Trage filele pentru a le grupa</translation>
 <translation id="6193448654517602979">Selectează file</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
index 10c04d3..bc91aab 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Сравнивайте страницы быстрее, объединяя их в группы. Чтобы начать, нажмите на ссылку и удерживайте ее.</translation>
 <translation id="5497272504048921382">Открытые вкладки</translation>
 <translation id="5580090775658607195">Вкладки сгруппированы (всего <ph name="TAB_COUNT" />).</translation>
-<translation id="5586306159936941448">Чтобы сгруппировать вкладки, перетащите одну из них на другую.</translation>
 <translation id="5792534911093536736">Дополнительные вкладки</translation>
 <translation id="58326064309361797">Перетаскивайте вкладки, чтобы группировать их</translation>
 <translation id="6193448654517602979">Выберите вкладки</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
index 4d5e1c5..3b2ba660 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Ak chcete rýchlo porovnať stránky, vytvorte skupinu. Začnite pridržaním ľubovoľného odkazu.</translation>
 <translation id="5497272504048921382">Otvorené karty</translation>
 <translation id="5580090775658607195">Počet zoskupených kariet: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Karty zoskupíte presunutím jednej na druhú</translation>
 <translation id="5792534911093536736">Viac kariet</translation>
 <translation id="58326064309361797">Karty zoskupíte presunutím</translation>
 <translation id="6193448654517602979">Vyberte karty</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
index 827749b..1762733b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Hitro primerjate strani tako, da ustvarite skupino. Če želite začeti, se dotaknite povezave in jo pridržite.</translation>
 <translation id="5497272504048921382">Odprti zavihki</translation>
 <translation id="5580090775658607195">Št. združenih zavihkov: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Povlecite zavihek na drug zavihek, če ju želite združiti v skupino</translation>
 <translation id="5792534911093536736">Več zavihkov</translation>
 <translation id="58326064309361797">Povlecite zavihke, če jih želite združiti v skupino</translation>
 <translation id="6193448654517602979">Izberite zavihke</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
index 8531cc0..a74ff33 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Направите групу да бисте брзо упоређивали странице. За почетак додирните и задржите линк.</translation>
 <translation id="5497272504048921382">Отворене картице</translation>
 <translation id="5580090775658607195">Картице су груписане (<ph name="TAB_COUNT" />)</translation>
-<translation id="5586306159936941448">Превуците једну картицу на другу да бисте их груписали</translation>
 <translation id="5792534911093536736">Још картица</translation>
 <translation id="58326064309361797">Превуците картице да бисте их груписали</translation>
 <translation id="6193448654517602979">Изаберите картице</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb
index 942943a..af03949 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Jämför sidor snabbt genom att skapa en grupp. Börja med att trycka länge på en länk.</translation>
 <translation id="5497272504048921382">Öppnade flikar</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> flikar har grupperats</translation>
-<translation id="5586306159936941448">Gruppera flikar genom att dra den ena ovanpå den andra</translation>
 <translation id="5792534911093536736">Fler flikar</translation>
 <translation id="58326064309361797">Gruppera flikar genom att dra dem</translation>
 <translation id="6193448654517602979">Välj flikar</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb
index 3c413b5..15eb01b6 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Linganisha kurasa kwa haraka kwa kuanzisha kikundi. Ili uanze, gusa na ushikilie kiungo.</translation>
 <translation id="5497272504048921382">Vichupo ambavyo vimefunguliwa</translation>
 <translation id="5580090775658607195">Umeweka pamoja vichupo <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Buruta kichupo hadi kwenye kichupo kingine ili uziweke katika kikundi</translation>
 <translation id="5792534911093536736">Vichupo zaidi</translation>
 <translation id="58326064309361797">Buruta vichupo ili uviweke katika kikundi</translation>
 <translation id="6193448654517602979">Chagua vichupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb
index 1c71f2d..2ed1eac5 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">ஒரு குழுவை உருவாக்கிப் பக்கங்களை விரைவாக ஒப்பிடலாம். தொடங்க, ஓர் இணைப்பைத் தொட்டுப் பிடிக்கவும்.</translation>
 <translation id="5497272504048921382">திறந்துள்ள தாவல்கள்</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> தாவல்கள் குழுவாக்கப்பட்டுள்ளன</translation>
-<translation id="5586306159936941448">ஒரு தாவலை மற்றொரு தாவலின் மீது இழுப்பதன் மூலம் அவற்றைக் குழுவாக்கலாம்</translation>
 <translation id="5792534911093536736">கூடுதல் தாவல்கள்</translation>
 <translation id="58326064309361797">தாவல்களை இழுப்பதன் மூலம் அவற்றைக் குழுவாக்கலாம்</translation>
 <translation id="6193448654517602979">தாவல்களைத் தேர்ந்தெடுக்கவும்</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
index 9f50cb1..a0ed4f3 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">పేజీలను సమూహంగా వర్గీకరించడం ద్వారా వేగంగా సరిపోల్చండి. ప్రారంభించడానికి, లింక్‌ను తాకి &amp; అలాగే నొక్కి ఉంచండి.</translation>
 <translation id="5497272504048921382">తెరిచిన ట్యాబ్‌లు</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> ట్యాబ్‌లు సమూహంగా వర్గీకరించబడ్డాయి</translation>
-<translation id="5586306159936941448">సమూహంగా చేయడానికి ఒక ట్యాబ్‌ను మరొక ట్యాబ్‌ మీదకు లాగండి</translation>
 <translation id="5792534911093536736">మరిన్ని ట్యాబ్‌లు</translation>
 <translation id="58326064309361797">సమూహంగా చేయడానికి ట్యాబ్‌లను లాగండి</translation>
 <translation id="6193448654517602979">ట్యాబ్‌లను ఎంచుకోండి</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb
index 4dbe6fb3..4bb72ed 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">เปรียบเทียบหน้าต่างๆ อย่างรวดเร็วด้วยการสร้างกลุ่ม แตะลิงก์ค้างไว้เพื่อเริ่มต้น</translation>
 <translation id="5497272504048921382">แท็บที่เปิดไว้</translation>
 <translation id="5580090775658607195">จัดกลุ่มไว้ <ph name="TAB_COUNT" /> แท็บ</translation>
-<translation id="5586306159936941448">ลากแท็บไปอยู่บนแท็บอื่นเพื่อจัดกลุ่ม</translation>
 <translation id="5792534911093536736">แท็บเพิ่มเติม</translation>
 <translation id="58326064309361797">ลากแท็บเพื่อจัดกลุ่ม</translation>
 <translation id="6193448654517602979">เลือกแท็บ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb
index 437845f..81a8092 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Grup oluşturarak sayfaları hızlıca karşılaştırın. Başlamak için bir bağlantıya dokunup basılı tutun.</translation>
 <translation id="5497272504048921382">Sekmeler açıldı</translation>
 <translation id="5580090775658607195"><ph name="TAB_COUNT" /> sekme gruplandı</translation>
-<translation id="5586306159936941448">Sekmeleri gruplandırmak için birini diğerinin üzerine sürükleyin</translation>
 <translation id="5792534911093536736">Diğer sekmeler</translation>
 <translation id="58326064309361797">Gruplandırmak için sekmeleri sürükleyin</translation>
 <translation id="6193448654517602979">Sekmeleri seçin</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb
index d0b32b2..603ecc338 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Швидко порівнюйте сторінки, створивши групу. Щоб почати, натисніть і втримуйте посилання.</translation>
 <translation id="5497272504048921382">Відкриті вкладки</translation>
 <translation id="5580090775658607195">Згруповано стільки вкладок: <ph name="TAB_COUNT" /></translation>
-<translation id="5586306159936941448">Перетягніть одну вкладку на іншу, щоб згрупувати їх</translation>
 <translation id="5792534911093536736">Більше вкладок</translation>
 <translation id="58326064309361797">Перетягуйте вкладки, щоб групувати їх</translation>
 <translation id="6193448654517602979">Виберіть вкладки</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
index 4627014..06536a5 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">Tạo một nhóm để so sánh nhanh các trang. Để bắt đầu, hãy chạm và giữ một đường dẫn liên kết.</translation>
 <translation id="5497272504048921382">Các tab đã mở</translation>
 <translation id="5580090775658607195">Đã nhóm <ph name="TAB_COUNT" /> tab</translation>
-<translation id="5586306159936941448">Kéo một tab vào một tab khác để nhóm lại với nhau</translation>
 <translation id="5792534911093536736">Tab khác</translation>
 <translation id="58326064309361797">Kéo các tab để nhóm lại với nhau</translation>
 <translation id="6193448654517602979">Chọn các tab</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
index 0608c506..b871d136 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">通过分组快速比较网页。为此,请先轻触并按住某个链接。</translation>
 <translation id="5497272504048921382">已打开的标签页</translation>
 <translation id="5580090775658607195">已将 <ph name="TAB_COUNT" /> 个标签页合为一组</translation>
-<translation id="5586306159936941448">将标签拖动到另一个标签上,可将它们归为一组</translation>
 <translation id="5792534911093536736">更多标签页</translation>
 <translation id="58326064309361797">拖动标签可进行分组</translation>
 <translation id="6193448654517602979">选择标签页</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
index 20c8cb2..8cc2902f 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
@@ -13,7 +13,6 @@
 <translation id="5082793167783849073">建立群組以快速比較多個頁面。如要開始建立,請輕觸並按住連結。</translation>
 <translation id="5497272504048921382">開啟的分頁</translation>
 <translation id="5580090775658607195">已將 <ph name="TAB_COUNT" /> 個分頁加入群組</translation>
-<translation id="5586306159936941448">將分頁拖曳至另一個分頁,即可將它們歸為同一個群組</translation>
 <translation id="5792534911093536736">更多分頁</translation>
 <translation id="58326064309361797">拖曳分頁即可進行分組</translation>
 <translation id="6193448654517602979">選取分頁</translation>
diff --git a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_mr.xtb b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_mr.xtb
index 84d2c170..b88fe27 100644
--- a/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_mr.xtb
+++ b/chrome/android/features/vr/java/strings/translations/android_chrome_vr_strings_mr.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
-<translation id="1729516292547892356">व्हर्च्युअल वास्तविकता आशय पाहण्यासाठी, Google VR सेवा अपडेट करा</translation>
+<translation id="1729516292547892356">व्हर्च्युअल रीअॅलिटी आशय पाहण्यासाठी, Google VR सेवा अपडेट करा</translation>
 <translation id="1938981467853765413">फीडबॅक द्या</translation>
 <translation id="360207483134687714">Chrome मध्ये VR अनुभव सुधारण्यात मदत करा</translation>
 <translation id="3789841737615482174">स्थापना करा</translation>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
index 3d8a84c..0a054736 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
@@ -118,6 +118,8 @@
             @Override
             public void onLayoutChange(View v, int left, int top, int right, int bottom,
                     int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                if (sNativeOverlayWindowAndroid == 0) return;
+
                 PictureInPictureActivityJni.get().onViewSizeChanged(
                         sNativeOverlayWindowAndroid, right - left, bottom - top);
             }
@@ -167,7 +169,7 @@
     @Override
     public void onStop() {
         super.onStop();
-        mCompositorView.destroy();
+        if (mCompositorView != null) mCompositorView.destroy();
     }
 
     @Override
@@ -254,8 +256,9 @@
         Intent intent = new Intent(context, PictureInPictureActivity.class);
 
         // Dissociate OverlayWindowAndroid if there is one already.
-        if (sNativeOverlayWindowAndroid != 0)
+        if (sNativeOverlayWindowAndroid != 0) {
             PictureInPictureActivityJni.get().destroy(sNativeOverlayWindowAndroid);
+        }
 
         sNativeOverlayWindowAndroid = nativeOverlayWindowAndroid;
         sInitiatorTab = (Tab) initiatorTab;
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 0a77473..4f7c98642 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">ካርትን ያርትዑ</translation>
 <translation id="2154710561487035718">URL ቅዳ</translation>
 <translation id="2156074688469523661">ቀሪ ጣቢያዎች (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">የሆነ ነገር ከስልክዎ ወደ ሌላ መሣሪያ ለማጋራት በሁለቱም መሣሪያዎች ላይ በChrome ቅንብሮች ውስጥ ስምረትን ያብሩ</translation>
 <translation id="2170088579611075216">ቪአር ይፍቀዱ እና ያስገቡ</translation>
 <translation id="218608176142494674">ማጋራት</translation>
 <translation id="2227444325776770048">እንደ <ph name="USER_FULL_NAME" /> ሆነው ይቀጥሉ</translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">ቀላል ገጽ በGoogle ቀርቧል። ኦርጂናሉን ለመጫን መታ ያድርጉ።</translation>
 <translation id="4452411734226507615">የ<ph name="TAB_TITLE" /> ትር ዝጋ</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ላይ ዕልባት ተደርጓል</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> በ<ph name="PRODUCT_NAME" /> ውስጥ ወርዷል</translation>
 <translation id="445467742685312942">ጣቢያዎች የተጠበቀ ይዘትን እንዲያጫውት ይፍቀዱ</translation>
 <translation id="4468959413250150279">በአንድ የተወሰነ ጣቢያ ላይ ድምጸ-ከል አድርግ።</translation>
 <translation id="4472118726404937099">በመላ መሣሪያዎች ላይ በመለያ መግባት እና ስምረትን ማብራት ለማስመር እና ግላዊነትን ለማላበስ</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">ጣቢያዎች ማይክሮፎንዎን እንዲጠቀሙ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation>
 <translation id="7015203776128479407">የመጀመሪያው የስምረት ውቅረት አላለቀም። ስምረት ጠፍቷል።</translation>
 <translation id="7016516562562142042">ለአሁኑ የፍለጋ ፕሮግራም ተፈቅዷል</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> ወርዷል</translation>
 <translation id="7022756207310403729">በአሳሽ ውስጥ ክፈት</translation>
 <translation id="702463548815491781">TalkBack ወይም መዳረሻ ቀይር ሲበሩ የሚመከር</translation>
 <translation id="7029809446516969842">የይለፍ ቃላት</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">ዩ ኤስ ቢ</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />፣ ትር</translation>
 <translation id="885701979325669005">ማከማቻ</translation>
+<translation id="889338405075704026">ወደ የChrome ቅንብሮች ይሂዱ</translation>
 <translation id="8901170036886848654">ምንም ዕልባቶች አልተገኙም</translation>
 <translation id="8909135823018751308">አጋራ…</translation>
 <translation id="8912362522468806198">የGoogle መለያ</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">አዲስ ትር በማንነት የማያሳውቅ ሁነታ ውስጥ ክፈት</translation>
 <translation id="8998729206196772491">በ<ph name="MANAGED_DOMAIN" /> ወደሚተዳደር መለያ እየገቡና ሙሉውን የChrome ውሂብዎ ቁጥጥር ለአስተዳዳሪው እየሰጡ ነው። የእርስዎ ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር ይተሳሰራል። ከChrome ዘግቶ መውጣት ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን በእርስዎ የGoogle መለያ ላይ እንደተከማቸ ይቆያል።</translation>
 <translation id="9019902583201351841">በእርስዎ ወላጆች የሚቀናበር</translation>
+<translation id="9028914725102941583">በተለያዩ መሣሪያዎች ላይ ለማጋራት ስምረትን ያብሩ</translation>
 <translation id="9029323097866369874"><ph name="DOMAIN" /> ወደ ቪአር እንዲገባ ይፈቀድለት?</translation>
 <translation id="9040142327097499898">ማሳወቂያዎች ይፈቀዳሉ። አካባቢ ለዚህ መሣሪያ ጠፍቷል።</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# ቪዲዮ}one{# ቪዲዮዎች}other{# ቪዲዮዎች}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 9db91cca..e8c2d275 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">تعديل البطاقة</translation>
 <translation id="2154710561487035718">‏نسخ عنوان URL</translation>
 <translation id="2156074688469523661">المواقع المتبقية (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">‏لمشاركة محتوى من هاتفك مع جهاز آخر، يُرجى تفعيل المزامنة في إعدادات Chrome على كلا الجهازين.</translation>
 <translation id="2170088579611075216">السماح بالواقع الافتراضي والدخول إليه</translation>
 <translation id="218608176142494674">المشاركة</translation>
 <translation id="2227444325776770048">المتابعة باسم <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">‏صفحة بسيطة تقدِّمها Google. يُرجى النقر لتحميل الصفحة الأصلية.</translation>
 <translation id="4452411734226507615">إغلاق علامة التبويب <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">أُضيفَت إشارة مرجعية إلى <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">تم تنزيل <ph name="FILE_NAME" /> في <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">السماح لمواقع الويب بتشغيل المحتوى المَحمي</translation>
 <translation id="4468959413250150279">كتم صوت موقع ويب معين.</translation>
 <translation id="4472118726404937099">للمزامنة والتخصيص على جميع الأجهزة، يُرجى تسجيل الدخول وتفعيل المزامنة.</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">السؤال أولاً قبل السماح لمواقع الويب باستخدام الميكروفون (موصى به)</translation>
 <translation id="7015203776128479407">لم ينتهِ إعداد المزامنة الأولية. تم إيقاف المزامنة.</translation>
 <translation id="7016516562562142042">تم منح الإذن لمحرّك البحث الحالي</translation>
-<translation id="7021515813996758557">تم تنزيل <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">فتح في المتصفح</translation>
 <translation id="702463548815491781">‏يُوصى به عند تفعيل TalkBack أو الوصول عبر مفتاح التحويل</translation>
 <translation id="7029809446516969842">كلمات المرور</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">علامة التبويب <ph name="TAB_TITLE" /></translation>
 <translation id="885701979325669005">التخزين</translation>
+<translation id="889338405075704026">‏الانتقال إلى إعدادات Chrome</translation>
 <translation id="8901170036886848654">ما مِن إشارات مرجعية مطابقة</translation>
 <translation id="8909135823018751308">مشاركة…</translation>
 <translation id="8912362522468806198">‏حساب Google‏</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">فتح علامة تبويب جديدة في وضع التصفّح المتخفّي</translation>
 <translation id="8998729206196772491">‏يتم تسجيل دخولك باستخدام حساب تتم إدارته من خلال <ph name="MANAGED_DOMAIN" /> ومنح مشرفه الحق في التحكم في بياناتك على Chrome. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي الخروج من Chrome إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزَّنة على حسابك في Google.</translation>
 <translation id="9019902583201351841">يديره والداك</translation>
+<translation id="9028914725102941583">تفعيل المزامنة للمشاركة في جميع الأجهزة</translation>
 <translation id="9029323097866369874">هل تريد السماح للموقع الإلكتروني <ph name="DOMAIN" /> بالانتقال إلى وضع "الواقع الافتراضي"؟</translation>
 <translation id="9040142327097499898">الإشعارات مسموح بها. وتحديد الموقع الجغرافي متوقف لهذا الجهاز.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{فيديو واحد (#)}zero{# فيديو}two{فيديوهان (#)}few{# فيديوهات}many{# فيديو}other{# فيديو}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index fc52885..aade98d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Редактиране на картата</translation>
 <translation id="2154710561487035718">Копиране на URL адреса</translation>
 <translation id="2156074688469523661">Останали сайтове (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">За да споделите нещо от телефона си на друго устройство, включете синхронизирането от настройките за Chrome и на двете устройства</translation>
 <translation id="2170088579611075216">Разрешаване и стартиране на VR</translation>
 <translation id="218608176142494674">Споделяне</translation>
 <translation id="2227444325776770048">Продължаване като <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Олекотена страница, предоставена от Google. Докоснете за зареждане на оригиналната.</translation>
 <translation id="4452411734226507615">Затваряне на раздела „<ph name="TAB_TITLE" />“</translation>
 <translation id="4452548195519783679">Отметката бе запазена в/ъв „<ph name="FOLDER_NAME" />“</translation>
-<translation id="4453340223357552416">Файлът „<ph name="FILE_NAME" />“ бе изтеглен в/ъв <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Разрешаване на сайтовете да възпроизвеждат защитено съдържание</translation>
 <translation id="4468959413250150279">Спиране на звука за конкретен сайт.</translation>
 <translation id="4472118726404937099">Влезте в профила си и включете синхронизирането, за да се възползвате от синхронизиране и персонализиране на всички устройства</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Извеждане на запитване, преди да се разреши на сайтовете да използват микрофона (препоръчително)</translation>
 <translation id="7015203776128479407">Първоначалното настройване на синхронизирането не бе завършено. Синхронизирането е изключено.</translation>
 <translation id="7016516562562142042">Разрешено за текущата търсеща машина</translation>
-<translation id="7021515813996758557">Успешно изтегляне на <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Отваряне в браузъра</translation>
 <translation id="702463548815491781">Препоръчва се, когато TalkBack или достъпът с превключване са задействани</translation>
 <translation id="7029809446516969842">Пароли</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">„<ph name="TAB_TITLE" />“ – раздел</translation>
 <translation id="885701979325669005">Хранилище</translation>
+<translation id="889338405075704026">Към настройките за Chrome</translation>
 <translation id="8901170036886848654">Няма намерени отметки</translation>
 <translation id="8909135823018751308">Споделяне…</translation>
 <translation id="8912362522468806198">Профил в Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Отваряне на нов раздел в режим „инкогнито“</translation>
 <translation id="8998729206196772491">Влизате с профил, управляван от <ph name="MANAGED_DOMAIN" />, и предоставяте на администратора му контрол върху данните си в Chrome. Те ще се свържат за постоянно с този профил. При излизане от профила в браузъра информацията ви ще се изтрие от устройството, но ще продължи да се съхранява в профила ви в Google.</translation>
 <translation id="9019902583201351841">Управлява се от родителите ви</translation>
+<translation id="9028914725102941583">Включете синхронизирането, за да споделяте на всички устройства</translation>
 <translation id="9029323097866369874">Да се разреши ли на <ph name="DOMAIN" /> да стартира VR?</translation>
 <translation id="9040142327097499898">Известията са разрешени. Местоположението е изключено за това устройство.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# видеоклип}other{# видеоклипа}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
index 3e9bae8..34ef708 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -451,7 +451,6 @@
 <translation id="4440958355523780886">Google লাইট পৃষ্ঠা পাঠিয়েছে। আসল পৃষ্ঠাটি লোড করতে ট্যাপ করুন।</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> ট্যাবটি বন্ধ করুন</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> এ বুকমার্ক করা হয়েছে</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> এ <ph name="FILE_NAME" /> ডাউনলোড করা হয়েছে</translation>
 <translation id="445467742685312942">সাইটকে সুরক্ষিত কন্টেন্ট চালানোর জন্য অনুমতি দিন</translation>
 <translation id="4468959413250150279">নির্দিষ্ট কোনও সাইটের জন্য সাউন্ড মিউট করুন।</translation>
 <translation id="4472118726404937099">ডিভাইস জুড়ে সিঙ্ক এবং ব্যক্তিগতকৃত করতে সাইন-ইন করে সিঙ্ক বিকল্প চালু করুন</translation>
@@ -821,7 +820,6 @@
 <translation id="6992289844737586249">সাইটগুলিকে আপনার মাইক্রোফোন ব্যবহার করতে দিতে মঞ্জুরি দেওয়ার আগে প্রথমে জিজ্ঞাসা করুন (প্রস্তাবিত)</translation>
 <translation id="7015203776128479407">সিঙ্কের প্রাথমিক সেট-আপ সম্পূর্ণ হয়নি। সিঙ্ক বন্ধ আছে।</translation>
 <translation id="7016516562562142042">বর্তমান সার্চ ইঞ্জিনের জন্য অনুমোদন দেওয়া হয়েছে</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> ডাউনলোড হয়েছে</translation>
 <translation id="7022756207310403729">ব্রাউজারে খুলুন</translation>
 <translation id="702463548815491781">'টকব্যাক' অথবা 'অ্যাক্সেস পরিবর্তন করুন' চালু করা থাকলে এটি করার সাজেশন পাবেন</translation>
 <translation id="7029809446516969842">পাসওয়ার্ড</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index f970a95..b01b11e2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Pàgina en mode bàsic oferta per Google. Toca per carregar l'original.</translation>
 <translation id="4452411734226507615">Tanca la pestanya <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Adreça d'interès afegida a <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> s'ha baixat a <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Permet que els llocs web reprodueixin contingut protegit</translation>
 <translation id="4468959413250150279">Silencia el so d'un lloc web concret.</translation>
 <translation id="4472118726404937099">Per sincronitzar i personalitzar el contingut en tots els dispositius, inicia la sessió i activa la sincronització</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Pregunta'm abans de permetre que els llocs web utilitzin el micròfon (opció recomanada)</translation>
 <translation id="7015203776128479407">La configuració de la sincronització inicial no ha finalitzat. La sincronització està desactivada.</translation>
 <translation id="7016516562562142042">Es permet al motor de cerca actual</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> s'ha baixat</translation>
 <translation id="7022756207310403729">Obre al navegador</translation>
 <translation id="702463548815491781">Es recomana quan TalkBack o l'accés amb interruptors estan activats</translation>
 <translation id="7029809446516969842">Contrasenyes</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 1358e36..ca718ab1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Úprava karty</translation>
 <translation id="2154710561487035718">Kopírovat adresu URL</translation>
 <translation id="2156074688469523661">Zbývající weby (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Chcete-li něco z telefonu sdílet do jiného zařízení, zapněte v nastavení Chromu na obou zařízeních synchronizaci</translation>
 <translation id="2170088579611075216">Povolit a spustit virtuální realitu</translation>
 <translation id="218608176142494674">Sdílení</translation>
 <translation id="2227444325776770048">Pokračovat jako uživatel <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Zjednodušenou stránku poskytuje Google. Klepnutím načtete originál.</translation>
 <translation id="4452411734226507615">Zavřít kartu <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Záložka přidána do složky <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Soubor <ph name="FILE_NAME" /> byl stažen v prohlížeči <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Povolit webům přehrávat chráněný obsah</translation>
 <translation id="4468959413250150279">Vypne zvuk na konkrétním webu.</translation>
 <translation id="4472118726404937099">Chcete-li synchronizovat a přizpůsobit různá zařízení, přihlaste se a zapněte synchronizaci</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Pokud web bude chtít použít váš mikrofon, zobrazit dotaz (doporučeno)</translation>
 <translation id="7015203776128479407">Počáteční nastavení synchronizace nebylo dokončeno. Synchronizace je vypnutá.</translation>
 <translation id="7016516562562142042">Pro aktuální vyhledávač povoleno</translation>
-<translation id="7021515813996758557">Soubor <ph name="FILE_NAME" /> byl stažen</translation>
 <translation id="7022756207310403729">Otevřít v prohlížeči</translation>
 <translation id="702463548815491781">Doporučeno, když je zapnuta funkce TalkBack nebo přístup pomocí přepínačů</translation>
 <translation id="7029809446516969842">Hesla</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, karta</translation>
 <translation id="885701979325669005">Úložiště</translation>
+<translation id="889338405075704026">Přejít do nastavení Chromu</translation>
 <translation id="8901170036886848654">Nebyly nalezeny žádné záložky</translation>
 <translation id="8909135823018751308">Sdílet…</translation>
 <translation id="8912362522468806198">Účet Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Otevřít novou kartu v anonymním režimu</translation>
 <translation id="8998729206196772491">Přihlašujete se pomocí účtu spravovaného doménou <ph name="MANAGED_DOMAIN" /> a poskytujete jeho správci kontrolu nad svými daty prohlížeče Chrome. Vaše data budou trvale přidružena k tomuto účtu. Odhlášením z Chromu svá data smažete z tohoto zařízení, ve vašem účtu Google však uložena zůstanou.</translation>
 <translation id="9019902583201351841">Spravováno vašimi rodiči</translation>
+<translation id="9028914725102941583">Chcete-li umožnit sdílení mezi zařízeními, zapněte synchronizaci</translation>
 <translation id="9029323097866369874">Povolit webu <ph name="DOMAIN" /> přejít do režimu virtuální reality?</translation>
 <translation id="9040142327097499898">Oznámení jsou povolena. Poloha je v tomto zařízení vypnutá.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# video}few{# videa}many{# videa}other{# videí}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index c7b35fe..293461e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Lite-side leveret af Google. Tryk for at indlæse originalen.</translation>
 <translation id="4452411734226507615">Luk fanen <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Bogmærket er gemt i <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> downloadet i <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Tillad, at websites afspiller beskyttet indhold</translation>
 <translation id="4468959413250150279">Slå lyden fra for et bestemt website.</translation>
 <translation id="4472118726404937099">Log ind, og aktivér synkronisering for at synkronisere og tilpasse på alle dine enheder</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Spørg, før websites bruger din mikrofon (anbefales)</translation>
 <translation id="7015203776128479407">Den indledende konfiguration af synkronisering blev ikke afsluttet. Synkronisering er deaktiveret.</translation>
 <translation id="7016516562562142042">Tilladt for den nuværende søgemaskine</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> blev downloadet</translation>
 <translation id="7022756207310403729">Åbn i browser</translation>
 <translation id="702463548815491781">Anbefales, når TalkBack eller Kontaktadgang er aktiveret</translation>
 <translation id="7029809446516969842">Adgangskoder</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index a4398bf5..c667e53 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Lite-Modus-Seite von Google bereitgestellt. Zum Laden der Originalseite tippen.</translation>
 <translation id="4452411734226507615">Tab "<ph name="TAB_TITLE" />" schließen</translation>
 <translation id="4452548195519783679">Als Lesezeichen in "<ph name="FOLDER_NAME" />" gespeichert</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> in <ph name="PRODUCT_NAME" /> heruntergeladen</translation>
 <translation id="445467742685312942">Websites erlauben, geschützte Inhalte wiederzugeben</translation>
 <translation id="4468959413250150279">Eine bestimmte Website stummschalten.</translation>
 <translation id="4472118726404937099">Melden Sie sich an und aktivieren Sie die Synchronisierung, um geräteübergreifend zu synchronisieren und zu personalisieren</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Nachfragen, bevor Websites auf Ihr Mikrofon zugreifen dürfen (empfohlen)</translation>
 <translation id="7015203776128479407">Die erstmalige Einrichtung der Synchronisierung wurde nicht abgeschlossen. Synchronisierung ist deaktiviert.</translation>
 <translation id="7016516562562142042">Für die aktuelle Suchmaschine zugelassen</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> heruntergeladen</translation>
 <translation id="7022756207310403729">Im Browser öffnen</translation>
 <translation id="702463548815491781">Empfohlen, wenn TalkBack oder der Schalterzugriff aktiviert ist</translation>
 <translation id="7029809446516969842">Passwörter</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index cebfc05..06a78e9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Επεξεργασία κάρτας</translation>
 <translation id="2154710561487035718">Αντιγραφή διεύθυνσης URL</translation>
 <translation id="2156074688469523661">Ιστότοποι που απομένουν (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Για να κοινοποιήσετε κάτι από το τηλέφωνό σας σε μια άλλη συσκευή, ενεργοποιήστε τον συγχρονισμό στις ρυθμίσεις του Chrome και στις δύο συσκευές.</translation>
 <translation id="2170088579611075216">Αποδοχή και είσοδος σε VR</translation>
 <translation id="218608176142494674">Κοινοποίηση</translation>
 <translation id="2227444325776770048">Συνέχεια ως <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Η σελίδα Lite παρέχεται από την Google. Πατήστε για φόρτωση της αρχικής σελίδας.</translation>
 <translation id="4452411734226507615">Κλείσιμο καρτέλας <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Ο σελιδοδείκτης είναι στο "<ph name="FOLDER_NAME" />"</translation>
-<translation id="4453340223357552416">Η λήψη του <ph name="FILE_NAME" /> πραγματοποιήθηκε στο <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Να επιτρέπεται στους ιστοτόπους η αναπαραγωγή προστατευμένου περιεχομένου</translation>
 <translation id="4468959413250150279">Σίγαση ήχου για συγκεκριμένο ιστότοπο.</translation>
 <translation id="4472118726404937099">Για συγχρονισμό και εξατομίκευση σε διάφορες συσκευές, συνδεθείτε και ενεργοποιήστε τον συγχρονισμό</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να χρησιμοποιήσουν το μικρόφωνό σας (συνιστάται)</translation>
 <translation id="7015203776128479407">Η αρχική ρύθμιση του συγχρονισμού δεν τελείωσε. Ο συγχρονισμός είναι απενεργοποιημένος.</translation>
 <translation id="7016516562562142042">Επιτράπηκε για την τρέχουσα μηχανή αναζήτησης</translation>
-<translation id="7021515813996758557">Έγινε λήψη του αρχείου <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Άνοιγμα σε πρόγρ. περιήγησης</translation>
 <translation id="702463548815491781">Συνιστάται όταν έχει ενεργοποιηθεί το TalkBack ή η πρόσβαση με διακόπτη</translation>
 <translation id="7029809446516969842">Κωδ. πρόσβασης</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">Καρτέλα <ph name="TAB_TITLE" /></translation>
 <translation id="885701979325669005">Αποθήκευση</translation>
+<translation id="889338405075704026">Μεταβείτε στις ρυθμίσεις του Chrome</translation>
 <translation id="8901170036886848654">Δεν βρέθηκαν σελιδοδείκτες</translation>
 <translation id="8909135823018751308">Κοινοποίηση…</translation>
 <translation id="8912362522468806198">Λογαριασμός Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Άνοιγμα καρτέλας σε κατάσταση ανώνυμης περιήγησης</translation>
 <translation id="8998729206196772491">Πρόκειται να συνδεθείτε με έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="MANAGED_DOMAIN" /> και παραχωρείτε στον διαχειριστή του τον έλεγχο της διαχείρισης των δεδομένων σας στο Chrome. Τα δεδομένα σας θα συσχετιστούν οριστικά με αυτόν τον λογαριασμό. Η αποσύνδεση από το Chrome θα διαγράψει τα δεδομένα σας από αυτήν τη συσκευή, αλλά θα διατηρηθούν αποθηκευμένα στον Λογαριασμό σας Google.</translation>
 <translation id="9019902583201351841">Διαχειρίζεται από τους γονείς σου</translation>
+<translation id="9028914725102941583">Ενεργοποιήστε τον συγχρονισμό για κοινοποίηση μεταξύ συσκευών.</translation>
 <translation id="9029323097866369874">Να επιτρέπεται στον τομέα <ph name="DOMAIN" /> η ενεργοποίηση της λειτουργίας VR;</translation>
 <translation id="9040142327097499898">Οι ειδοποιήσεις επιτρέπονται. Η Τοποθεσία είναι απενεργοποιημένη σε αυτήν τη συσκευή.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# Βίντεο}other{# Βίντεο}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index 87c4cdf1..bd72899a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Edit card</translation>
 <translation id="2154710561487035718">Copy URL</translation>
 <translation id="2156074688469523661">Remaining sites (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">To share something from your phone to another device, turn on sync in Chrome settings on both devices</translation>
 <translation id="2170088579611075216">Allow and enter VR</translation>
 <translation id="218608176142494674">Sharing</translation>
 <translation id="2227444325776770048">Continue as <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <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>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> downloaded in <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Allow sites to play protected content</translation>
 <translation id="4468959413250150279">Mute sound for a specific site.</translation>
 <translation id="4472118726404937099">To sync and personalise across devices, sign in and turn on sync</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Ask first before allowing sites to use your microphone (recommended)</translation>
 <translation id="7015203776128479407">Initial sync setup was not finished. Sync is off.</translation>
 <translation id="7016516562562142042">Allowed for current search engine</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> downloaded</translation>
 <translation id="7022756207310403729">Open in browser</translation>
 <translation id="702463548815491781">Recommended when TalkBack or Switch Access are on</translation>
 <translation id="7029809446516969842">Passwords</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, tab</translation>
 <translation id="885701979325669005">Storage</translation>
+<translation id="889338405075704026">Go to Chrome settings</translation>
 <translation id="8901170036886848654">No bookmarks found</translation>
 <translation id="8909135823018751308">Share…</translation>
 <translation id="8912362522468806198">Google Account</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Open a new tab in Incognito mode</translation>
 <translation id="8998729206196772491">You are signing in with an account managed by <ph name="MANAGED_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="9019902583201351841">Managed by your parents</translation>
+<translation id="9028914725102941583">Turn on sync to share across devices</translation>
 <translation id="9029323097866369874">Allow <ph name="DOMAIN" /> to enter VR?</translation>
 <translation id="9040142327097499898">Notifications are allowed. Location is off for this device.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# Video}other{# Videos}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index be51289..cfa39d2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Google proporcionó la página básica. Presiona para cargar la versión original.</translation>
 <translation id="4452411734226507615">Cierra la pestaña <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Se agregó a favoritos en <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Se descargó <ph name="FILE_NAME" /> en <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Permitir que los sitios reproduzcan contenido protegido</translation>
 <translation id="4468959413250150279">Silenciar un sitio específico.</translation>
 <translation id="4472118726404937099">Para sincronizar diferentes dispositivos y personalizar tu experiencia, accede a tu cuenta y activa la sincronización</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Preguntar primero antes de permitir que los sitios usen tu micrófono (recomendado)</translation>
 <translation id="7015203776128479407">No se completó la configuración de la sincronización inicial. La sincronización está desactivada.</translation>
 <translation id="7016516562562142042">Se habilitó para el motor de búsqueda actual</translation>
-<translation id="7021515813996758557">Se descargó <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Abrir en el navegador</translation>
 <translation id="702463548815491781">Se recomienda cuando TalkBack o "Accesibilidad mejorada" están activadas</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 2b162f4..661b8f4b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Página básica ofrecida por Google. Toca para cargar la original.</translation>
 <translation id="4452411734226507615">Cerrar la pestaña <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Marcador añadido a <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> se ha descargado en <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Permitir que los sitios web reproduzcan contenido protegido</translation>
 <translation id="4468959413250150279">Silencia el sonido de un sitio web específico.</translation>
 <translation id="4472118726404937099">Inicia sesión y activa la sincronización para sincronizar y personalizar todos tus dispositivos</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Preguntar antes de permitir que los sitios web utilicen el micrófono (recomendado)</translation>
 <translation id="7015203776128479407">La configuración de sincronización inicial no ha terminado. La sincronización está desactivada.</translation>
 <translation id="7016516562562142042">Permitido en el motor de búsqueda actual</translation>
-<translation id="7021515813996758557">Se ha descargado <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Abrir en el navegador</translation>
 <translation id="702463548815491781">Se recomienda cuando TalkBack o la accesibilidad mediante interruptores están activados</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
index f4380be..03960ed7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Lihtsustatud lehte pakub Google. Puudutage algse lehe laadimiseks.</translation>
 <translation id="4452411734226507615">Vahelehe <ph name="TAB_TITLE" /> sulgemine</translation>
 <translation id="4452548195519783679">Lisatud järjehoidjana kausta <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Fail <ph name="FILE_NAME" /> laaditi alla teenuses <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Saitidel on lubatud esitada kaitstud sisu</translation>
 <translation id="4468959413250150279">Konkreetse saidi heli vaigistamine.</translation>
 <translation id="4472118726404937099">Seadmete vahel sisu sünkroonimiseks ja isikupärastamiseks logige sisse ja lülitage sünkroonimine sisse.</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Küsi enne saitidele minu mikrofoni kasutamiseks juurdepääsu lubamist (soovitatav)</translation>
 <translation id="7015203776128479407">Sünkroonimise algseadistust ei viidud lõpule. Sünkroonimine on välja lülitatud.</translation>
 <translation id="7016516562562142042">Praeguse otsingumootori puhul lubatud</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> laaditi alla</translation>
 <translation id="7022756207310403729">Avamine brauseris</translation>
 <translation id="702463548815491781">Soovitatav juhul, kui TalkBack või lülitiga juurdepääs on sisse lülitatud</translation>
 <translation id="7029809446516969842">Paroolid</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index 1b9030d..248547fd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">ویرایش کارت</translation>
 <translation id="2154710561487035718">کپی نشانی وب</translation>
 <translation id="2156074688469523661">سایت‌های باقی‌مانده (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">‏برای به‌اشتراک گذاشتن چیزی از تلفنتان با دستگاهی دیگر، در تنظیمات Chrome هر دو دستگاه «همگام‌سازی» را روشن کنید</translation>
 <translation id="2170088579611075216">‏اجازه دادن و وارد شدن به VR</translation>
 <translation id="218608176142494674">هم‌رسانی</translation>
 <translation id="2227444325776770048">ادامه دادن به‌عنوان <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">‏صفحه ساده‌شده را Google ارائه کرده است. برای بارگیری صفحه اصلی، ضربه بزنید.</translation>
 <translation id="4452411734226507615">بستن برگه <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">در <ph name="FOLDER_NAME" /> نشانک گذاشته شد</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> در <ph name="PRODUCT_NAME" /> بارگیری شد</translation>
 <translation id="445467742685312942">به سایت‌ها اجازه داده شود محتوای محافظت‌شده پخش کنند</translation>
 <translation id="4468959413250150279">سایتی خاص بی‌صدا شود.</translation>
 <translation id="4472118726404937099">برای همگام‌سازی و شخصی‌سازی در همه دستگاه‌ها، به سیستم وارد شوید و همگام‌سازی را روشن کنید</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">قبل از اجازه به سایت‌ها برای استفاده از میکروفون ابتدا سؤال شود (توصیه می‌شود)</translation>
 <translation id="7015203776128479407">راه‌اندازی اولیه همگام‌سازی کامل نشد. همگام‌سازی خاموش است.</translation>
 <translation id="7016516562562142042">برای موتور جستجوی فعلی مجاز است</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> بارگیری شد</translation>
 <translation id="7022756207310403729">بازکردن در مرورگر</translation>
 <translation id="702463548815491781">‏توصیه در زمانی‌که TalkBack یا «دسترسی سوئیچ» روشن است</translation>
 <translation id="7029809446516969842">گذرواژه‌ها</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />، برگه</translation>
 <translation id="885701979325669005">فضای ذخیره‌سازی</translation>
+<translation id="889338405075704026">‏به تنظیمات Chrome بروید</translation>
 <translation id="8901170036886848654">نشانکی پیدا نشد</translation>
 <translation id="8909135823018751308">اشتراک‌گذاری‌...</translation>
 <translation id="8912362522468806198">‏حساب Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">باز کردن برگه جدیدی در حالت ناشناس</translation>
 <translation id="8998729206196772491">‏هم‌اکنون درحال ورود به سیستم با یک حساب مدیریت‌شده توسط <ph name="MANAGED_DOMAIN" /> و ارائه کنترل داده‌های Chrome خودتان به سرپرست این حساب هستید. داده‌هایتان به‌طور دائم به این حساب مرتبط می‌شوند. با خروج از Chrome، داده‌هایتان از این دستگاه حذف می‌شوند اما همچنان در حساب Google شما باقی می‌ماند.</translation>
 <translation id="9019902583201351841">مدیریت شده توسط والدین شما</translation>
+<translation id="9028914725102941583">برای اشتراک‌گذاری بین دستگاه‌ها، «همگام‌سازی» را روشن کنید</translation>
 <translation id="9029323097866369874">‏به <ph name="DOMAIN" /> اجازه می‌دهید به حالت VR وارد شود؟</translation>
 <translation id="9040142327097499898">اعلان‌ها مجاز هستند. مکان برای این دستگاه خاموش است.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# ویدیو}one{# ویدیو}other{# ویدیو}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 21ecb47..d65320c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Googlen tarjoama yksinkertaistettu sivu. Lataa alkuperäinen napauttamalla.</translation>
 <translation id="4452411734226507615">Sulje välilehti <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Lisätty kirjanmerkiksi kansioon <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> on ladattu kohteeseen <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Salli sivustojen toistaa suojattua sisältöä</translation>
 <translation id="4468959413250150279">Mykistä tietyn sivuston äänet.</translation>
 <translation id="4472118726404937099">Kirjaudu sisään ja ota synkronointi käyttöön, niin sisältö synkronoidaan ja yksilöidään eri laitteilla</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Pyydä lupaa, kun sivustot yrittävät käyttää mikrofonia (suositus).</translation>
 <translation id="7015203776128479407">Synkronoinnin ensimääritystä ei tehty loppuun. Synkronointi ei ole käytössä.</translation>
 <translation id="7016516562562142042">Sallittu nykyisellä hakukoneella</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> ladattiin.</translation>
 <translation id="7022756207310403729">Avaa selaimessa</translation>
 <translation id="702463548815491781">Suositellaan käytettäväksi, kun TalkBack tai Kytkimen käyttö on päällä</translation>
 <translation id="7029809446516969842">Salasanat</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index 7d23464c..59a9e6f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -66,6 +66,7 @@
 <translation id="1407135791313364759">Buksan lahat</translation>
 <translation id="1409426117486808224">Pinasimpleng view para sa mga bukas na tab</translation>
 <translation id="1409879593029778104">Pinigilan ang pag-download sa <ph name="FILE_NAME" /> dahil may ganitong file na sa kasalukuyan.</translation>
+<translation id="1413136574162415971">Matitingnan ng Google kung bahagi ng paglabag sa data ang iyong mga password. Io-on ito kapag nag-sign in ka sa iyong Google Account at na-on ang pag-sync.</translation>
 <translation id="1414981605391750300">Nakikipag-ugnayan sa Google. Maaari itong umabot nang isang minuto…</translation>
 <translation id="1416550906796893042">Bersyon ng application</translation>
 <translation id="1430915738399379752">I-print</translation>
@@ -160,6 +161,7 @@
 <translation id="2091887806945687916">Tunog</translation>
 <translation id="2096012225669085171">Mag-sync at mag-personalize sa lahat ng device</translation>
 <translation id="2100273922101894616">Awtomatikong Mag-sign in</translation>
+<translation id="2100314319871056947">Subukang ibahagi ang text sa mas maliliit na bahagi</translation>
 <translation id="2107397443965016585">Magtanong bago pahintulutan ang mga site na mag-play ng pinoprotektahang content (inirerekomenda)</translation>
 <translation id="2111511281910874386">Pumunta sa page</translation>
 <translation id="2122601567107267586">Hindi mabuksan ang app</translation>
@@ -172,6 +174,7 @@
 <translation id="2154484045852737596">I-edit ang card</translation>
 <translation id="2154710561487035718">Kopyahin ang URL</translation>
 <translation id="2156074688469523661">Mga natitirang site (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Para magbahagi ng isang bagay sa isa pang device mula sa iyong telepono, i-on ang pag-sync sa mga setting ng Chrome sa parehong device</translation>
 <translation id="2170088579611075216">Payagan at pumasok sa VR</translation>
 <translation id="218608176142494674">Pagbabahagi</translation>
 <translation id="2227444325776770048">Magpatuloy bilang si <ph name="USER_FULL_NAME" /></translation>
@@ -253,6 +256,7 @@
 <translation id="2836148919159985482">Pindutin ang button na bumalik upang lumabas sa full screen.</translation>
 <translation id="2842985007712546952">Pangunahing folder</translation>
 <translation id="2858138569776157458">Top na sites</translation>
+<translation id="2860954141821109167">Tiyaking may naka-enable na phone app sa device na ito</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Nakaraang track</translation>
 <translation id="2876369937070532032">Ipadala ang mga URL ng ilang page na binibisita mo sa Google kapag nanganganib ang iyong seguridad</translation>
@@ -277,6 +281,7 @@
 <translation id="2996291259634659425">Gumawa ng passphrase</translation>
 <translation id="2996809686854298943">Kinakailangan ang URL</translation>
 <translation id="300526633675317032">Iki-clear nito ang lahat ng <ph name="SIZE_IN_KB" /> ng storage ng website.</translation>
+<translation id="3016635187733453316">Siguraduhing nakakonekta ang device sa internet</translation>
 <translation id="3029613699374795922"><ph name="KBS" /> KB ang na-download</translation>
 <translation id="3029704984691124060">Hindi nagtutugma ang mga passphrase</translation>
 <translation id="3036750288708366620"><ph name="BEGIN_LINK" />Humingi ng tulong<ph name="END_LINK" /></translation>
@@ -445,7 +450,6 @@
 <translation id="4440958355523780886">Lite na page na hatid ng Google. Mag-tap para i-load ang orihinal.</translation>
 <translation id="4452411734226507615">Isara ang tab na <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Na-bookmark sa <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Na-download ang <ph name="FILE_NAME" /> sa <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Pahintulutan ang mga site na mag-play ng pinoprotektahang content</translation>
 <translation id="4468959413250150279">I-mute ang tunog para sa isang partikular na site.</translation>
 <translation id="4472118726404937099">Para mag-sync at mag-personalize sa mga device, mag-sign in at i-on ang pag-sync</translation>
@@ -815,7 +819,6 @@
 <translation id="6992289844737586249">Magtanong muna bago payagan ang mga site na gamitin ang iyong mikropono (inirerekomenda)</translation>
 <translation id="7015203776128479407">Hindi natapos ang pag-set up ng unang pag-sync. Naka-off ang pag-sync.</translation>
 <translation id="7016516562562142042">Pinapayagan para sa kasalukuyang search engine</translation>
-<translation id="7021515813996758557">Na-download na ang <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Buksan sa browser</translation>
 <translation id="702463548815491781">Inirerekomenda kapag naka-on ang TalkBack o Switch Access</translation>
 <translation id="7029809446516969842">Mga Password</translation>
@@ -841,6 +844,7 @@
 <translation id="723171743924126238">Pumili ng mga larawan</translation>
 <translation id="7233236755231902816">Para makita ang web sa iyong wika, kunin ang pinakabagong bersyon ng Chrome</translation>
 <translation id="7243308994586599757">May mga opsyon malapit sa ibaba ng screen</translation>
+<translation id="7248069434667874558">Tiyaking naka-on sa <ph name="TARGET_DEVICE_NAME" /> ang pag-sync sa Chrome</translation>
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ang napili</translation>
 <translation id="7274013316676448362">Naka-block na site</translation>
 <translation id="7290209999329137901">Hindi available ang pag-rename</translation>
@@ -955,6 +959,7 @@
 <translation id="8007176423574883786">Naka-off para sa device na ito</translation>
 <translation id="8013372441983637696">I-clear din ang iyong data ng Chrome sa device na ito</translation>
 <translation id="8015452622527143194">Ibalik ang lahat ng nasa page sa default na sukat</translation>
+<translation id="8015780634880457457">Matitingnan ng Google kung bahagi ng paglabag sa data ang iyong mga password</translation>
 <translation id="802154636333426148">Hindi na-download</translation>
 <translation id="8026334261755873520">I-clear ang data sa pag-browse</translation>
 <translation id="8035133914807600019">Bagong folder…</translation>
@@ -1017,6 +1022,7 @@
 <translation id="8445448999790540984">Hindi ma-export ang mga password</translation>
 <translation id="8447861592752582886">Bawiin ang pahintulot ng device</translation>
 <translation id="8461694314515752532">I-encrypt ang naka-sync na data gamit ang iyong sariling passphrase sa pag-sync</translation>
+<translation id="8466613982764129868">Tiyaking nakakonekta ang <ph name="TARGET_DEVICE_NAME" /> sa internet</translation>
 <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
 <translation id="8487700953926739672">Available sa offline</translation>
 <translation id="8489271220582375723">Buksan ang page ng history</translation>
@@ -1068,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, tab</translation>
 <translation id="885701979325669005">Storage</translation>
+<translation id="889338405075704026">Pumunta sa mga setting ng Chrome</translation>
 <translation id="8901170036886848654">Walang nakitang bookmark</translation>
 <translation id="8909135823018751308">Ibahagi…</translation>
 <translation id="8912362522468806198">Google Account</translation>
@@ -1086,6 +1093,7 @@
 <translation id="8993760627012879038">Magbukas ng bagong tab sa Incognito mode</translation>
 <translation id="8998729206196772491">Nagsa-sign in ka gamit ang isang account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" /> at binibigyan mo ang administrator nito ng kontrol sa iyong data sa Chrome. Permanenteng mauugnay ang iyong data sa account na ito. Made-delete ang data mo sa device na ito kapag nag-sign out ka sa Chrome, ngunit mananatili itong naka-store sa iyong Google Account.</translation>
 <translation id="9019902583201351841">Pinamamahalaan ng iyong mga magulang</translation>
+<translation id="9028914725102941583">I-on ang pag-sync para makapagbahagi sa mga device</translation>
 <translation id="9029323097866369874">Payagan ang <ph name="DOMAIN" /> na pumasok sa VR?</translation>
 <translation id="9040142327097499898">Pinapayagan ang mga notification. Naka-off ang lokasyon para sa device na ito.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# Video}one{# Video}other{# na Video}}</translation>
@@ -1107,6 +1115,7 @@
 <translation id="9188680907066685419">Mag-sign out sa pinamamahalaang account</translation>
 <translation id="9204836675896933765">1 file ang natitira</translation>
 <translation id="9206873250291191720">A</translation>
+<translation id="9209888181064652401">Hindi makatawag</translation>
 <translation id="9219103736887031265">Mga Larawan</translation>
 <translation id="926205370408745186">Alisin sa Digital Wellness ang iyong aktibidad sa Chrome</translation>
 <translation id="932327136139879170">Home</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index 8ccfe52c..0c6dfbe4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Page simplifiée fournie par Google. Appuyez pour charger la page d'origine.</translation>
 <translation id="4452411734226507615">Fermer l'onglet <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Ajouté aux favoris dans "<ph name="FOLDER_NAME" />"</translation>
-<translation id="4453340223357552416">Le fichier <ph name="FILE_NAME" /> a bien été téléchargé dans <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Autoriser les sites à lire les contenus protégés</translation>
 <translation id="4468959413250150279">Coupe le son d'un site spécifique.</translation>
 <translation id="4472118726404937099">Connectez-vous et activez la synchronisation pour accéder à vos données et les personnaliser sur tous vos appareils</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Demander avant d'autoriser des sites à utiliser mon micro (recommandé)</translation>
 <translation id="7015203776128479407">La configuration de la synchronisation initiale n'était pas terminée. La synchronisation est désactivée.</translation>
 <translation id="7016516562562142042">Autorisé pour le moteur de recherche actuel</translation>
-<translation id="7021515813996758557">Le fichier "<ph name="FILE_NAME" />" a bien été téléchargé.</translation>
 <translation id="7022756207310403729">Ouvrir dans le navigateur</translation>
 <translation id="702463548815491781">Recommandé quand TalkBack ou Switch Access sont activés</translation>
 <translation id="7029809446516969842">Mots de passe</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
index 17c89ce..c935b9f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Google દ્વારા પ્રદાન કરવામાં આવેલું લાઇટ પેજ. ઑરિજિનલ લોડ કરવા માટે ટૅપ કરો.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> ટૅબ બંધ કરો</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> પર બુકમાર્ક કર્યું</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> ને <ph name="PRODUCT_NAME" /> માં ડાઉનલોડ કરી</translation>
 <translation id="445467742685312942">સાઇટને સંરક્ષિત કન્ટેન્ટ ચલાવવાની મંજૂરી આપો</translation>
 <translation id="4468959413250150279">કોઈ એક ચોક્કસ સાઇટ માટે અવાજ બંધ કરો.</translation>
 <translation id="4472118726404937099">સમગ્ર ઉપકરણો સિંક કરવા અને વ્યક્તિગત કરવા માટે, સાઇન ઇન કરો અને સિંક કરવાનું ચાલુ કરો</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">સાઇટ્સને તમારા માઇક્રોફોનનો ઉપયોગ કરવાની મંજૂરી આપતાં પહેલા પૂછો (ભલામણ કરેલ)</translation>
 <translation id="7015203776128479407">આરંભિક સિંક સેટઅપ પૂરું થયું નથી. સિંક કરવાનું બંધ છે.</translation>
 <translation id="7016516562562142042">હાલનાં શોધ એંજિન માટે મંજૂર</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> ડાઉનલોડ કરી</translation>
 <translation id="7022756207310403729">બ્રાઉઝરમાં ખોલો</translation>
 <translation id="702463548815491781">જ્યારે ટૉકબૅક અથવા સ્વિચ ઍક્સેસ ચાલુ હોય ત્યારે આપેલ સુઝાવ</translation>
 <translation id="7029809446516969842">પાસવર્ડ્સ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 18a3004..33e30ec 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -66,6 +66,7 @@
 <translation id="1407135791313364759">सभी बुकमार्क खोलें</translation>
 <translation id="1409426117486808224">खुले टैब के लिए सरल बनाया गया व्यू</translation>
 <translation id="1409879593029778104"><ph name="FILE_NAME" /> डाउनलोड को रोका गया क्‍योंकि फ़ाइल पहले से मौजूद है.</translation>
+<translation id="1413136574162415971">Google यह जांच कर सकता है कि आपके पासवर्ड डेटा का उल्लंघन कर रहे थे या नहीं. जब आप अपने Google खाते से साइन इन करके सिंक करने की सुविधा चालू करेंगे, तब इसे चालू कर दिया जाएगा.</translation>
 <translation id="1414981605391750300">Google से संपर्क किया जा रहा है. इसमें कुछ समय लग सकता है…</translation>
 <translation id="1416550906796893042">ऐप्‍लिकेशन वर्शन</translation>
 <translation id="1430915738399379752">प्रिंट करें</translation>
@@ -160,6 +161,7 @@
 <translation id="2091887806945687916">आवाज़</translation>
 <translation id="2096012225669085171">सभी डिवाइस में सिंक करना और मनमुताबिक बनाना</translation>
 <translation id="2100273922101894616">अपने आप साइन इन करने की सुविधा</translation>
+<translation id="2100314319871056947">टेक्स्ट को छोटे-छोटे हिस्सों में शेयर करने की कोशिश करें</translation>
 <translation id="2107397443965016585">साइटों को सुरक्षित सामग्री चलाने देने से पहले पूछें (ऐसा करने का सुझाव दिया जाता है)</translation>
 <translation id="2111511281910874386">पेज पर जाएं</translation>
 <translation id="2122601567107267586">ऐप्लिकेशन नहीं खोला जा सका</translation>
@@ -253,6 +255,7 @@
 <translation id="2836148919159985482">फ़ुल स्क्रीन से बाहर निकलने के लिए वापस जाएं बटन स्पर्श करें.</translation>
 <translation id="2842985007712546952">मूल फ़ोल्‍डर</translation>
 <translation id="2858138569776157458">मुख्य साइटें</translation>
+<translation id="2860954141821109167">पक्का करें कि इस डिवाइस पर फ़ोन ऐप्लिकेशन चालू है</translation>
 <translation id="2870560284913253234">साइट</translation>
 <translation id="2874939134665556319">पिछला ट्रैक</translation>
 <translation id="2876369937070532032">आपकी सुरक्षा को खतरा होने पर उन पेज के यूआरएल भेजे जाते हैं जिन पर आप Google के ज़रिए जाते हैं.</translation>
@@ -277,6 +280,7 @@
 <translation id="2996291259634659425">'पासफ़्रेज़' बनाएं</translation>
 <translation id="2996809686854298943">URL ज़रूरी है</translation>
 <translation id="300526633675317032">इससे वेबसाइट की पूरी <ph name="SIZE_IN_KB" /> मेमोरी साफ़ हो जाएगी.</translation>
+<translation id="3016635187733453316">पक्का करें कि इस डिवाइस को इंटरनेट से कनेक्ट किया गया है</translation>
 <translation id="3029613699374795922"><ph name="KBS" /> केबी डाउनलोड किया गया</translation>
 <translation id="3029704984691124060">पासफ़्रेज़ मिलान नहीं करते</translation>
 <translation id="3036750288708366620"><ph name="BEGIN_LINK" />सहायता पाएं<ph name="END_LINK" /></translation>
@@ -445,7 +449,6 @@
 <translation id="4440958355523780886">Google की ओर से 'लाइट पेज' दिया गया. 'मूल पेज' लोड करने के लिए टैप करें.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> टैब बंद करें</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> में बुकमार्क किया गया</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> को <ph name="PRODUCT_NAME" /> में डाउनलोड किया गया</translation>
 <translation id="445467742685312942">साइटों को सभी सुरक्षित सामग्री चलाने दें</translation>
 <translation id="4468959413250150279">किसी खास साइट के लिए आवाज़ बंद करें.</translation>
 <translation id="4472118726404937099">सभी डिवाइस पर सिंक करने और मनमुताबिक बनाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें</translation>
@@ -815,7 +818,6 @@
 <translation id="6992289844737586249">साइटों को अपने माइक्रोफ़ोन का इस्तेमाल करने देने से पहले अनुमति लेना ज़रूरी बनाएं (सुझाया गया)</translation>
 <translation id="7015203776128479407">शुरुआती सिंक सेटअप पूरा नहीं हुआ. सिंक बंद है.</translation>
 <translation id="7016516562562142042">मौजूदा सर्च इंजन के लिए अनुमति दी गई है</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> को डाउनलोड किया गया</translation>
 <translation id="7022756207310403729">ब्राउज़र में खोलें</translation>
 <translation id="702463548815491781">उस समय के लिए सुझाया गया जब 'टॉकबैक' या 'ऐक्सेस करने का तरीका बदलें' चालू हों</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
@@ -841,6 +843,7 @@
 <translation id="723171743924126238">फ़ोटो चुनें</translation>
 <translation id="7233236755231902816">वेब को अपनी भाषा में देखने के लिए, Chrome का नया वर्शन पाएं</translation>
 <translation id="7243308994586599757">विकल्‍प स्‍क्रीन के नीचे उपलब्‍ध हैं</translation>
+<translation id="7248069434667874558">पक्का करें कि <ph name="TARGET_DEVICE_NAME" /> पर Chrome में सिंक करने की सुविधा चालू है</translation>
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> चुने गए</translation>
 <translation id="7274013316676448362">अवरोधित साइट</translation>
 <translation id="7290209999329137901">नाम बदलने की सुविधा उपलब्ध नहीं है</translation>
@@ -955,6 +958,7 @@
 <translation id="8007176423574883786">इस डिवाइस के लिए बंद कर दिया गया है</translation>
 <translation id="8013372441983637696">इस डिवाइस से अपना Chrome डेटा भी हटाएं</translation>
 <translation id="8015452622527143194">पेज पर सब कुछ वापस डिफ़ॉल्ट आकार में लाएं</translation>
+<translation id="8015780634880457457">Google यह जांच कर सकता है कि आपके पासवर्ड डेटा का उल्लंघन कर रहे थे या नहीं</translation>
 <translation id="802154636333426148">डाउनलोड विफल रहा</translation>
 <translation id="8026334261755873520">ब्राउज़िंग डेटा साफ़ करें</translation>
 <translation id="8035133914807600019">नया फ़ोल्‍डर…</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8445448999790540984">पासवर्ड निर्यात नहीं कर सकते</translation>
 <translation id="8447861592752582886">डिवाइस अनुमति निरस्त करें</translation>
 <translation id="8461694314515752532">सिंक किए गए डेटा को अपने खुद के सिंक लंबे पासवर्ड से सुरक्षित करें</translation>
+<translation id="8466613982764129868">पक्का करें कि <ph name="TARGET_DEVICE_NAME" /> को इंटरनेट से कनेक्ट किया गया है</translation>
 <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
 <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation>
 <translation id="8489271220582375723">इतिहास पेज खोलें</translation>
@@ -1107,6 +1112,7 @@
 <translation id="9188680907066685419">प्रबंधित खाते से प्रस्थान करें</translation>
 <translation id="9204836675896933765">1 फ़ाइल बची है</translation>
 <translation id="9206873250291191720">A</translation>
+<translation id="9209888181064652401">कॉल नहीं कर पा रहे</translation>
 <translation id="9219103736887031265">इमेज</translation>
 <translation id="926205370408745186">'डिजिटल वेलबीइंग' से अपनी Chrome गतिविधि हटाएं</translation>
 <translation id="932327136139879170">होम बटन</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index 02af094..02b55a47 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Uredite karticu</translation>
 <translation id="2154710561487035718">Kopiraj URL</translation>
 <translation id="2156074688469523661">Preostale web-lokacije (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Da biste dijelili nešto s telefona s nekim drugim uređajem, uključite sinkronizaciju u Chromeovim postavkama na oba uređaja</translation>
 <translation id="2170088579611075216">Dopusti i unesi VR</translation>
 <translation id="218608176142494674">Dijeljenje</translation>
 <translation id="2227444325776770048">Nastavite kao <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Jednostavnu stranicu pruža Google. Dodirnite da biste učitali izvornu stranicu.</translation>
 <translation id="4452411734226507615">Zatvori karticu <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Oznaka dodana u mapu <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Datoteka <ph name="FILE_NAME" /> preuzeta u pregledniku <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Web-lokacijama je dopuštena reprodukcija zaštićenog sadržaja</translation>
 <translation id="4468959413250150279">Isključivanje zvuka za određenu web-lokaciju.</translation>
 <translation id="4472118726404937099">Ako želite sinkronizirati i prilagoditi više uređaja, prijavite se i uključite sinkronizaciju</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Web-lokacije moraju tražiti dopuštenje za upotrebu mikrofona (preporučeno)</translation>
 <translation id="7015203776128479407">Početno postavljanje sinkronizacije nije dovršeno. Sinkronizacija je isključena.</translation>
 <translation id="7016516562562142042">Dopušteno za trenutačnu tražilicu</translation>
-<translation id="7021515813996758557">Datoteka <ph name="FILE_NAME" /> je preuzeta</translation>
 <translation id="7022756207310403729">Otvori u pregledniku</translation>
 <translation id="702463548815491781">Preporučuje se kada su uključeni TalkBack ili prekidač za pristup</translation>
 <translation id="7029809446516969842">Zaporke</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, kartica</translation>
 <translation id="885701979325669005">Prostor za pohranu</translation>
+<translation id="889338405075704026">Otvorite Chromeove postavke</translation>
 <translation id="8901170036886848654">Nije pronađena nijedna oznaka</translation>
 <translation id="8909135823018751308">Dijeljenje…</translation>
 <translation id="8912362522468806198">Google Račun</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Otvaranje nove kartice u anonimnom načinu</translation>
 <translation id="8998729206196772491">Prijavljujete se računom kojim upravlja <ph name="MANAGED_DOMAIN" /> i njegovom administratoru dajete kontrolu nad svojim podacima u Chromeu. Vaši će se podaci trajno povezati s tim računom. Ako se odjavite iz Chromea, vaši će se podaci izbrisati s ovog uređaja, no ostat će pohranjeni na vašem Google računu.</translation>
 <translation id="9019902583201351841">Upravljaju tvoji roditelji</translation>
+<translation id="9028914725102941583">Uključite sinkronizaciju da biste dijelili na uređajima</translation>
 <translation id="9029323097866369874">Želite li dopustiti web-lokaciji <ph name="DOMAIN" /> pokretanje VR-a?</translation>
 <translation id="9040142327097499898">Obavijesti su dopuštene. Lokacija je isključena za ovaj uređaj.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# videozapis}one{# videozapis}few{# videozapisa}other{# videozapisa}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index df67143..c324b35 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Egyszerű oldal a Google-tól. Koppintással betöltheti az eredetit.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> lap bezárása</translation>
 <translation id="4452548195519783679">Könyvjelzők közé téve itt: <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">A(z) <ph name="PRODUCT_NAME" /> letöltötte a következő fájlt: <ph name="FILE_NAME" /></translation>
 <translation id="445467742685312942">Védett tartalmak lejátszásának engedélyezése a webhelyek számára</translation>
 <translation id="4468959413250150279">Egy adott webhely hangjának némítása.</translation>
 <translation id="4472118726404937099">Az eszközök közötti szinkronizáláshoz és személyre szabáshoz jelentkezzen be, és kapcsolja be a szinkronizálást</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a mikrofon használatát (ajánlott)</translation>
 <translation id="7015203776128479407">A szinkronizálás kezdeti beállítása nem fejeződött be. A szinkronizálás ki van kapcsolva.</translation>
 <translation id="7016516562562142042">Engedélyezett a jelenlegi keresőmotor számára</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> letöltve</translation>
 <translation id="7022756207310403729">Megnyitás böngészőben</translation>
 <translation id="702463548815491781">Ajánlott, amikor a TalkBack vagy a Kapcsolóalapú hozzáférés be van kapcsolva</translation>
 <translation id="7029809446516969842">Jelszavak</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 5ce8019..5622a18 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Halaman ringan yang ditampilkan oleh Google. Ketuk untuk memuat halaman asli.</translation>
 <translation id="4452411734226507615">Tutup tab <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Dibookmark ke <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> didownload di <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Izinkan situs memutar konten yang dilindungi</translation>
 <translation id="4468959413250150279">Mematikan suara untuk situs tertentu.</translation>
 <translation id="4472118726404937099">Untuk menyinkronkan dan mempersonalisasi berbagai perangkat, login dan aktifkan sinkronisasi</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Tanya terlebih dahulu sebelum mengizinkan situs menggunakan mikrofon Anda (disarankan)</translation>
 <translation id="7015203776128479407">Penyiapan sinkronisasi awal belum selesai. Sinkronisasi nonaktif.</translation>
 <translation id="7016516562562142042">Diizinkan untuk mesin telusur yang sedang digunakan</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> didownload</translation>
 <translation id="7022756207310403729">Buka di browser</translation>
 <translation id="702463548815491781">Disarankan saat TalkBack atau Tombol Akses aktif</translation>
 <translation id="7029809446516969842">Sandi</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index 17cf580..94d0bf2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Pagina Lite fornita da Google. Tocca per caricare l'originale.</translation>
 <translation id="4452411734226507615">Chiudi la scheda <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Preferito aggiunto in: <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> scaricato in <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Consenti ai siti di riprodurre contenuti protetti</translation>
 <translation id="4468959413250150279">Disattiva l'audio per un sito specifico.</translation>
 <translation id="4472118726404937099">Accedi e attiva la sincronizzazione per sincronizzare e personalizzare tutti i dispositivi</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Chiedi conferma prima di consentire ai siti di utilizzare il microfono (opzione consigliata)</translation>
 <translation id="7015203776128479407">La configurazione della sincronizzazione iniziale non è stata terminata. La sincronizzazione è disattivata.</translation>
 <translation id="7016516562562142042">Consentita per il motore di ricerca corrente</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> scaricato</translation>
 <translation id="7022756207310403729">Apri nel browser</translation>
 <translation id="702463548815491781">Consigliata quando TalkBack o Switch Access sono attivi</translation>
 <translation id="7029809446516969842">Password</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index 34cab26..e2c5b69 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">‏גרסת Lite של הדף נוצרה על ידי Google. אפשר להקיש כדי לטעון את הגרסה המקורית.</translation>
 <translation id="4452411734226507615">סגירת הכרטיסייה <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">התווסף לסימניות ב-<ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">הורדה של <ph name="FILE_NAME" /> בוצעה ב-<ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">מתן הרשאה לאתרים להציג תוכן מוגן</translation>
 <translation id="4468959413250150279">השתקת צלילים באתר ספציפי.</translation>
 <translation id="4472118726404937099">כדי לסנכרן ולהתאים אישית את החוויה במכשירים שונים, יש להיכנס לחשבון ולהפעיל את הסנכרון</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">יש לשאול לפני שמאפשרים לאתרים להשתמש במיקרופון (מומלץ)</translation>
 <translation id="7015203776128479407">הגדרת הסנכרון הראשונית לא הושלמה. הסנכרון מושבת.</translation>
 <translation id="7016516562562142042">מופעל למנוע החיפוש הנוכחי</translation>
-<translation id="7021515813996758557">הורדת הקובץ <ph name="FILE_NAME" /> בוצעה</translation>
 <translation id="7022756207310403729">פתיחה בדפדפן</translation>
 <translation id="702463548815491781">‏מומלץ אם הפעלת TalkBack או גישה באמצעות מתג</translation>
 <translation id="7029809446516969842">סיסמאות</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index a03a9fa..f38cb66 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Google から提供されている軽量版のページです。元のページを読み込むにはタップしてください。</translation>
 <translation id="4452411734226507615">「<ph name="TAB_TITLE" />」タブを閉じます</translation>
 <translation id="4452548195519783679">「<ph name="FOLDER_NAME" />」にブックマークしました</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> を <ph name="PRODUCT_NAME" /> でダウンロードしました</translation>
 <translation id="445467742685312942">保護されたコンテンツの再生をサイトに許可する</translation>
 <translation id="4468959413250150279">特定のサイトの音声をミュートします。</translation>
 <translation id="4472118726404937099">複数のデバイスで独自の設定を同期して共有するには、ログインして同期を有効にします</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">サイトにマイクの使用を許可する前に確認する(推奨)</translation>
 <translation id="7015203776128479407">最初の同期設定が終了していません。同期は無効です。</translation>
 <translation id="7016516562562142042">現在の検索エンジンに対して許可</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> をダウンロードしました</translation>
 <translation id="7022756207310403729">ブラウザで開く</translation>
 <translation id="702463548815491781">TalkBack またはスイッチ アクセスを有効にしている場合におすすめです</translation>
 <translation id="7029809446516969842">パスワード</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
index eef29b6..59a23271 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -450,7 +450,6 @@
 <translation id="4440958355523780886">ಪುಟದ ಲೈಟ್ ಆವೃತ್ತಿಯನ್ನು Google ಒದಗಿಸಿದೆ. ಮೂಲ ಆವೃತ್ತಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> ಟ್ಯಾಬ್‌ ಮುಚ್ಚಿ</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ಗೆ ಬುಕ್‌ಮಾರ್ಕ್ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ <ph name="FILE_NAME" /> ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="445467742685312942">ಸಂರಕ್ಷಿತ ವಿಷಯವನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿ ನೀಡಿ</translation>
 <translation id="4468959413250150279">ನಿರ್ದಿಷ್ಟ ಸೈಟ್‌ನ ಧ್ವನಿಯನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ</translation>
 <translation id="4472118726404937099">ಸಾಧನಗಳಾದ್ಯಂತ ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು, ಸೈನ್ ಇನ್ ಮಾಡಿ ಮತ್ತು ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation>
@@ -820,7 +819,6 @@
 <translation id="6992289844737586249">ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್‍ ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸುವ ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="7015203776128479407">ಪ್ರಾರಂಭಿಕ ಸಿಂಕ್ ಸೆಟಪ್ ಮುಗಿದಿಲ್ಲ. ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ.</translation>
 <translation id="7016516562562142042">ಪ್ರಸ್ತುತ ಹುಡುಕಾಟ ಇಂಜಿನ್‌ಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="7022756207310403729">ಬ್ರೌಸರ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="702463548815491781">TalkBack ಅಥವಾ ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ ಆನ್ ಆಗಿದ್ದಾಗ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="7029809446516969842">ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index 2ebeefbb..05d78d2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -66,6 +66,7 @@
 <translation id="1407135791313364759">모두 열기</translation>
 <translation id="1409426117486808224">열린 탭 간단히 보기</translation>
 <translation id="1409879593029778104">파일이 이미 존재하여 <ph name="FILE_NAME" /> 다운로드가 중지되었습니다.</translation>
+<translation id="1413136574162415971">비밀번호가 정보 유출에 포함되었는지 Google에서 확인할 수 있습니다. Google 계정으로 로그인한 다음 동기화를 사용 설정하면 이 기능이 설정됩니다.</translation>
 <translation id="1414981605391750300">Google에 연결하는 중입니다. 잠시만 기다려 주세요...</translation>
 <translation id="1416550906796893042">애플리케이션 버전</translation>
 <translation id="1430915738399379752">인쇄</translation>
@@ -160,6 +161,7 @@
 <translation id="2091887806945687916">소리</translation>
 <translation id="2096012225669085171">모든 기기 동기화 및 맞춤설정</translation>
 <translation id="2100273922101894616">자동 로그인</translation>
+<translation id="2100314319871056947">좀 더 짧은 길이로 텍스트를 줄인 다음 공유해 보세요.</translation>
 <translation id="2107397443965016585">사이트에서 보호된 콘텐츠를 재생하도록 허용하기 전에 확인(권장)</translation>
 <translation id="2111511281910874386">페이지로 이동</translation>
 <translation id="2122601567107267586">앱을 열 수 없음</translation>
@@ -253,6 +255,7 @@
 <translation id="2836148919159985482">전체화면을 종료하려면 뒤로 버튼을 터치하세요.</translation>
 <translation id="2842985007712546952">상위 폴더</translation>
 <translation id="2858138569776157458">인기 사이트</translation>
+<translation id="2860954141821109167">이 기기에서 전화 앱이 사용 설정되어 있는지 확인하세요.</translation>
 <translation id="2870560284913253234">사이트</translation>
 <translation id="2874939134665556319">이전 트랙</translation>
 <translation id="2876369937070532032">보안상의 위험이 있을 때 일부 방문 페이지의 URL을 Google로 전송함</translation>
@@ -277,6 +280,7 @@
 <translation id="2996291259634659425">암호 만들기</translation>
 <translation id="2996809686854298943">URL이 필요합니다.</translation>
 <translation id="300526633675317032">웹사이트 저장공간 <ph name="SIZE_IN_KB" />가 모두 삭제됩니다.</translation>
+<translation id="3016635187733453316">이 기기가 인터넷에 연결되어 있는지 확인하세요.</translation>
 <translation id="3029613699374795922"><ph name="KBS" />KB 다운로드됨</translation>
 <translation id="3029704984691124060">암호가 일치하지 않습니다.</translation>
 <translation id="3036750288708366620"><ph name="BEGIN_LINK" />도움 받기<ph name="END_LINK" /></translation>
@@ -445,7 +449,6 @@
 <translation id="4440958355523780886">Google에서 제공하는 라이트 페이지입니다. 원본 페이지를 로드하려면 탭하세요.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> 탭 닫기</translation>
 <translation id="4452548195519783679">북마크를 <ph name="FOLDER_NAME" />에 추가함</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" />에 <ph name="FILE_NAME" /> 파일을 다운로드함</translation>
 <translation id="445467742685312942">사이트에서 보호된 콘텐츠를 재생하도록 허용</translation>
 <translation id="4468959413250150279">특정 사이트를 음소거합니다.</translation>
 <translation id="4472118726404937099">모든 기기에서 동기화하고 맞춤설정하려면 로그인하고 동기화를 사용 설정하세요.</translation>
@@ -815,7 +818,6 @@
 <translation id="6992289844737586249">사이트에서 마이크를 사용하기 전에 확인(권장)</translation>
 <translation id="7015203776128479407">초기 동기화 설정이 완료되지 않았습니다. 동기화가 사용 중지되었습니다.</translation>
 <translation id="7016516562562142042">현재 검색엔진에 허용됨</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" />(이)가 다운로드됨</translation>
 <translation id="7022756207310403729">브라우저에서 열기</translation>
 <translation id="702463548815491781">음성 안내 지원 또는 스위치 제어를 사용 중일 때 권장됩니다.</translation>
 <translation id="7029809446516969842">비밀번호</translation>
@@ -841,6 +843,7 @@
 <translation id="723171743924126238">이미지 선택</translation>
 <translation id="7233236755231902816">내가 사용하는 언어로 웹을 보려면 최신 버전의 Chrome을 사용하세요.</translation>
 <translation id="7243308994586599757">화면 하단에서 옵션 선택 가능</translation>
+<translation id="7248069434667874558"><ph name="TARGET_DEVICE_NAME" />에서 Chrome 동기화가 사용 설정되어 있는지 확인하세요.</translation>
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" />개 선택됨</translation>
 <translation id="7274013316676448362">차단된 사이트</translation>
 <translation id="7290209999329137901">이름 변경 불가</translation>
@@ -955,6 +958,7 @@
 <translation id="8007176423574883786">기기에 대해 사용 중지됨</translation>
 <translation id="8013372441983637696">이 기기에서 내 Chrome 데이터 삭제</translation>
 <translation id="8015452622527143194">페이지의 모든 항목을 기본 크기로 되돌리기</translation>
+<translation id="8015780634880457457">비밀번호가 정보 유출에 포함되었는지 Google에서 확인할 수 있습니다.</translation>
 <translation id="802154636333426148">다운로드 실패</translation>
 <translation id="8026334261755873520">인터넷 사용 기록 삭제</translation>
 <translation id="8035133914807600019">새 폴더…</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8445448999790540984">비밀번호를 내보낼 수 없음</translation>
 <translation id="8447861592752582886">기기 액세스 권한 취소</translation>
 <translation id="8461694314515752532">나만의 동기화 암호로 동기화된 데이터 암호화</translation>
+<translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" />이(가) 인터넷에 연결되어 있는지 확인하세요.</translation>
 <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
 <translation id="8487700953926739672">오프라인으로 사용 가능</translation>
 <translation id="8489271220582375723">방문 기록 페이지 열기</translation>
@@ -1107,6 +1112,7 @@
 <translation id="9188680907066685419">관리 계정에서 로그아웃</translation>
 <translation id="9204836675896933765">파일 1개가 남았습니다.</translation>
 <translation id="9206873250291191720">A</translation>
+<translation id="9209888181064652401">전화를 걸 수 없음</translation>
 <translation id="9219103736887031265">이미지</translation>
 <translation id="926205370408745186">디지털 웰빙에서 Chrome 활동 삭제</translation>
 <translation id="932327136139879170">홈</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index 1ee06a0..b76cc4f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Supaprastintasis puslapis, kurį teikia „Google“. Palieskite, kad būtų įkeltas pradinis puslapis.</translation>
 <translation id="4452411734226507615">Uždaryti skirtuką „<ph name="TAB_TITLE" />“</translation>
 <translation id="4452548195519783679">Sukurta „<ph name="FOLDER_NAME" />“ žymė</translation>
-<translation id="4453340223357552416">Failas „<ph name="FILE_NAME" />“ atsisiųstas naršyklėje „<ph name="PRODUCT_NAME" />“</translation>
 <translation id="445467742685312942">Leisti svetainėms leisti saugomą turinį</translation>
 <translation id="4468959413250150279">Konkrečios svetainės garso išjungimas.</translation>
 <translation id="4472118726404937099">Jei norite sinchronizuoti ir suasmeninti turinį visuose įrenginiuose, prisijunkite ir įjunkite sinchronizavimą</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Pirmiausia klausti prieš leidžiant svetainėms naudoti mikrofoną (rekomenduojama)</translation>
 <translation id="7015203776128479407">Pradinis sinchronizavimo nustatymas nebaigtas. Sinchronizavimas išjungtas.</translation>
 <translation id="7016516562562142042">Leidžiama dabartiniam paieškos varikliui</translation>
-<translation id="7021515813996758557">Failas „<ph name="FILE_NAME" />“ atsisiųstas</translation>
 <translation id="7022756207310403729">Atidaryti naršyklėje</translation>
 <translation id="702463548815491781">Rekomenduojama, kai įjungta „TalkBack“ arba prieiga jungikliu</translation>
 <translation id="7029809446516969842">Slaptažodžiai</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 9ba203b..be5e669 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Vienkāršota lapa, ko nodrošina Google. Lai ielādētu sākotnējo lapu, pieskarieties.</translation>
 <translation id="4452411734226507615">Aizvērt cilni <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Grāmatzīme saglabāta mapē <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Fails <ph name="FILE_NAME" /> lejupielādēts pārlūkā <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Ļaut vietnēm atskaņot aizsargātu saturu</translation>
 <translation id="4468959413250150279">Izslēgt skaņu noteiktai vietnei</translation>
 <translation id="4472118726404937099">Lai sinhronizētu un personalizētu saturu dažādās ierīcēs, pierakstieties un ieslēdziet sinhronizāciju.</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Jautāt, pirms atļaut vietnēm izmantot jūsu mikrofonu (ieteicams)</translation>
 <translation id="7015203776128479407">Sākotnējā sinhronizācijas iestatīšana netika pabeigta. Sinhronizācija ir izslēgta.</translation>
 <translation id="7016516562562142042">Atļauta pašreizējai meklētājprogrammai</translation>
-<translation id="7021515813996758557">Fails <ph name="FILE_NAME" /> ir lejupielādēts.</translation>
 <translation id="7022756207310403729">Atvērt pārlūkā</translation>
 <translation id="702463548815491781">Ieteicams, ja ir ieslēgta lietotne TalkBack vai slēdžu piekļuves funkcija.</translation>
 <translation id="7029809446516969842">Paroles</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
index e549ab0..92e21e9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -444,7 +444,6 @@
 <translation id="4440958355523780886">Google നൽകുന്ന ലൈറ്റ് പേജ്. യഥാർത്ഥ പേജ് ലോഡ് ചെയ്യാൻ ടാപ്പ് ചെയ്യുക.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> ടാബ് അടയ്ക്കുക</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ഫോൾഡറിലേക്ക് ബുക്ക്മാർക്ക് ചെയ്‌തു</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> എന്നതിൽ <ph name="FILE_NAME" /> ഡൗൺലോഡുചെയ്‌തു</translation>
 <translation id="445467742685312942">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുക</translation>
 <translation id="4468959413250150279">ഒരു പ്രത്യേക സൈറ്റിനായി ശബ്‌ദം മ്യൂട്ട് ചെയ്യുക.</translation>
 <translation id="4472118726404937099">ഉപകരണങ്ങളിൽ ഉടനീളം സമന്വയിപ്പിക്കാനും വ്യക്തിപരമാക്കാനും, സൈൻ ഇൻ ചെയ്‌ത് സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation>
@@ -812,7 +811,6 @@
 <translation id="6992289844737586249">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കുന്നതിന് മുമ്പ് ആദ്യം ചോദിക്കുക (ശുപാർശചെയ്‌തിരിക്കുന്നു)</translation>
 <translation id="7015203776128479407">പ്രാഥമിക സമന്വയ സജ്ജീകരണം പൂർത്തിയാക്കിയിട്ടില്ല. സമന്വയം ഓഫാണ്.</translation>
 <translation id="7016516562562142042">നിലവിലെ തിരയൽ യന്ത്രത്തിൽ അനുവദിച്ചിരിക്കുന്നു</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> ഡൗൺലോഡുചെയ്‌തു</translation>
 <translation id="7022756207310403729">ബ്രൗസറിൽ തുറക്കുക</translation>
 <translation id="702463548815491781">TalkBack അല്ലെങ്കിൽ ആക്‌സസ് മാറുക ഓണായിരിക്കുമ്പോൾ ശുപാർശ ചെയ്യുന്നു</translation>
 <translation id="7029809446516969842">പാസ്‌വേഡുകള്‍</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
index 861163f..2a6146a3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -41,6 +41,7 @@
 <translation id="1258753120186372309">Google डूडल: <ph name="DOODLE_DESCRIPTION" /></translation>
 <translation id="1260236875608242557">शोधा आणि एक्सप्लोर करा</translation>
 <translation id="1264974993859112054">क्रीडा</translation>
+<translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> शेअर करू शकलो नाही</translation>
 <translation id="1272079795634619415">थांबा</translation>
 <translation id="1283039547216852943">विस्तृत करण्यासाठी टॅप करा</translation>
 <translation id="1285320974508926690">या साइटचा कधीही भाषांतर करु नका</translation>
@@ -70,6 +71,7 @@
 <translation id="1430915738399379752">प्रिंट</translation>
 <translation id="1445680696957526815">Chrome चे घटक एकमेकांशी विसंगत आहेत. Chrome श्रेणीसुधारित होत असावे, कृपया काही मिनिटांमध्ये पुन्हा प्रयत्न करा. समस्या सुरु राहिल्यास, Chrome अनइंस्टॉल करून पहा आणि पुन्हा इंस्टॉल करून पहा.</translation>
 <translation id="1446450296470737166">MIDI डिव्हाइसेसच्या पूर्ण नियंत्रणास अनुमती द्या</translation>
+<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेअर करू शकत नाही</translation>
 <translation id="145097072038377568">Android सेटिंग्ज मध्‍ये बंद करा</translation>
 <translation id="1477626028522505441">सर्व्हर समस्यांमुळे <ph name="FILE_NAME" /> डाउनलोड अयशस्वी झाले.</translation>
 <translation id="1501480321619201731">गट हटवा</translation>
@@ -152,6 +154,7 @@
 <translation id="2049961518639794558">फाइल एक्स्टेंशन बदलल्यास अनपेक्षित वर्तन होऊ शकते जे तुमच्या डिव्हाइससाठी हानिकारक असू शकते.</translation>
 <translation id="2056878612599315956">साइट थांबवली</translation>
 <translation id="2063713494490388661">शोधण्यासाठी टॅप करा</translation>
+<translation id="2067805253194386918">मजकूर</translation>
 <translation id="2079545284768500474">पहिल्यासारखे करा</translation>
 <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> पैकी <ph name="RESULT_NUMBER" /> परिणाम</translation>
 <translation id="2091887806945687916">ध्वनी</translation>
@@ -322,6 +325,7 @@
 <translation id="3384347053049321195">इमेज शेअर करा</translation>
 <translation id="3386292677130313581">साइटना तुमचे स्थान जाणून घेण्याची अनुमती देण्यापूर्वी विचारा (शिफारस केलेले)</translation>
 <translation id="3387650086002190359">फाइल सिस्टम एररमुळे <ph name="FILE_NAME" /> डाउनलोड अयशस्वी झाले.</translation>
+<translation id="3389286852084373014">मजकूर खूप मोठा आहे</translation>
 <translation id="3398320232533725830">बुकमार्क व्यवस्थापक उघडा</translation>
 <translation id="3414952576877147120">आकार:</translation>
 <translation id="3443221991560634068">वर्तमान पृष्‍ठ रीलोड करा</translation>
@@ -346,6 +350,7 @@
 <translation id="3599863153486145794">साइन-इन केलेल्या सर्व डिव्हाइसमधून इतिहास साफ करते. तुमच्या Google खात्यामध्ये <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> वर कदाचित ब्राउझिंगचे इतर फॉर्म असतील.</translation>
 <translation id="3600792891314830896">ध्वनी प्ले करणाऱ्या साइट म्यूट करा</translation>
 <translation id="3616113530831147358">ऑडिओ</translation>
+<translation id="3631987586758005671"><ph name="DEVICE_NAME" /> शी शेअर करत आहे</translation>
 <translation id="3632295766818638029">पासवर्ड पहा</translation>
 <translation id="363596933471559332">स्टोअर क्रेडेंशियल वापरून वेबसाइटवर आपोआप साइन इन करा. वैशिष्ट्य बंद असते तेव्हा, वेबसाइटवर साइन इन करण्यापूर्वी दरवेळी तुम्हाला पडताळणीसाठी विचारले जाईल.</translation>
 <translation id="3658159451045945436">रीसेट केल्याने तुमचा डेटा सेव्हिंग इतिहास, भेट दिलेल्या साइटच्या सूचीसह, मिटवला जातो.</translation>
@@ -440,7 +445,6 @@
 <translation id="4440958355523780886">Google ने पुरवलेले लाइट पेज. मूळ पेज लोड करण्यासाठी टॅप करा.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> टॅब बंद करा</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ला बुकमार्क केले</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> मध्ये <ph name="FILE_NAME" /> डाउनलोड केली</translation>
 <translation id="445467742685312942">साइटना संरक्षित आशय प्ले करू द्या</translation>
 <translation id="4468959413250150279">विशिष्ट साइटसाठी ध्वनी म्यूट करा.</translation>
 <translation id="4472118726404937099">सर्व डिव्हाइसवर सिंक आणि पर्सनलाइझ करण्यासाठी, साइन इन करा आणि सिंक सुरू करा</translation>
@@ -574,6 +578,7 @@
 <translation id="5324858694974489420">पालक सेटिंग्ज</translation>
 <translation id="5327248766486351172">नाव</translation>
 <translation id="5335288049665977812">साइटना JavaScript रन करण्याची अनुमती द्या (शिफारस केलेले)</translation>
+<translation id="5342314432463739672">परवानगीच्या विनंत्या</translation>
 <translation id="5357811892247919462">टॅब मिळाला</translation>
 <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> खुला टॅब, टॅब स्विच करण्यासाठी टॅप करा}other{<ph name="OPEN_TABS_MANY" /> खुला टॅब, टॅब स्विच करण्यासाठी टॅप करा}}</translation>
 <translation id="5391532827096253100">या साइटवरील तुमचे कनेक्शन सुरक्षित नाही. साइट माहिती</translation>
@@ -604,7 +609,7 @@
 <translation id="5516455585884385570">सूचना सेटिंग्ज उघडा</translation>
 <translation id="5517095782334947753">आपल्याकडे <ph name="FROM_ACCOUNT" /> मधील बुकमार्क, इतिहास, पासवर्ड आणि अन्य सेटिंग्ज आहेत.</translation>
 <translation id="5524843473235508879">रीडिरेक्‍ट ब्लॉक केले.</translation>
-<translation id="5527082711130173040">डिव्हाइस स्कॅन करण्‍यासाठी Chrome ला स्थान अॅक्सेसची आवश्यकता असते. <ph name="BEGIN_LINK1" />परवानग्या अपडेट करा<ph name="END_LINK1" />. स्थान अॅक्सेस देखील <ph name="BEGIN_LINK2" />या डिव्हाइसाठी बंद केला आहे<ph name="END_LINK2" />.</translation>
+<translation id="5527082711130173040">डिव्हाइस स्कॅन करण्‍यासाठी Chrome ला स्थान अॅक्सेसची आवश्यकता असते. <ph name="BEGIN_LINK1" />परवानग्या अपडेट करा<ph name="END_LINK1" />. या डिव्हाइससाठी स्थान अॅक्सेस देखील <ph name="BEGIN_LINK2" /> बंद केला आहे<ph name="END_LINK2" />.</translation>
 <translation id="5527111080432883924">साइटला क्लिपबोर्डमधून मजकूर आणि इमेज रीड करण्याची अनुमती देण्यापूर्वी विचारा (शिफारस केली)</translation>
 <translation id="5530766185686772672">गुप्त टॅब बंद करा</translation>
 <translation id="5534334044554683961">तुम्ही VR वापरत असताना, ही साइट कदाचित पुढील गोष्टींबद्दल अधिक माहिती मिळवू शकेल:
@@ -743,6 +748,7 @@
 <translation id="6532866250404780454">तुम्ही Chrome मध्ये भेट दिलेल्या साइट दाखवणार नाही. सर्व साइट टायमर हटवले जातील.</translation>
 <translation id="6534565668554028783">Google ने प्रतिसाद देण्यास बराच वेळ घेतला</translation>
 <translation id="6538442820324228105"><ph name="GBS" /> GB डाउलोड केले</translation>
+<translation id="6539092367496845964">काहीतरी चूक झाली. पुन्हा प्रयत्न करा.</translation>
 <translation id="654446541061731451">बीममध्ये एक टॅब निवडा</translation>
 <translation id="6545017243486555795">सर्व डेटा साफ करा</translation>
 <translation id="6545864417968258051">ब्लूटूथ स्कॅन करत आहे</translation>
@@ -760,7 +766,7 @@
 <translation id="6643649862576733715">वाचवलेल्या डेटानुसार क्रमाने लावा</translation>
 <translation id="6648977384226967773">{CONTACT,plural, =1{<ph name="CONTACT_PREVIEW" />\u2026 आणि <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अधिक}other{<ph name="CONTACT_PREVIEW" />\u2026 आणि <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अधिक}}</translation>
 <translation id="6649642165559792194">इमेज <ph name="BEGIN_NEW" />नवीन<ph name="END_NEW" /> चे पूर्वावलोकन करा</translation>
-<translation id="6656545060687952787">डिव्हाइस स्कॅन करण्‍यासाठी Chrome ला स्थान अॅक्सेसची आवश्‍यकता असते. <ph name="BEGIN_LINK" />परवानग्या अपडेट करा<ph name="END_LINK" /></translation>
+<translation id="6656545060687952787">डिव्‍हाइस स्कॅन करण्‍यासाठी Chrome ला स्थान अॅक्सेसची आवश्‍यकता असते. <ph name="BEGIN_LINK" />परवानग्या अपडेट करा<ph name="END_LINK" /></translation>
 <translation id="6657585470893396449">पासवर्ड</translation>
 <translation id="6659594942844771486">टॅब</translation>
 <translation id="666731172850799929"><ph name="APP_NAME" /> मध्ये उघडा</translation>
@@ -808,7 +814,6 @@
 <translation id="6992289844737586249">साइटना तुमचा मायक्रोफोन वापरण्याची अनुमती देण्यापूर्वी प्रथम विचारा (शिफारस केलेले)</translation>
 <translation id="7015203776128479407">सुरुवातीचे सिंक सेट करणे पूर्ण झाले नाही. सिंक बंद आहे.</translation>
 <translation id="7016516562562142042">वर्तमान शोध इंजिनसाठी अनुमती दिली</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> डाउनलोड केले</translation>
 <translation id="7022756207310403729">ब्राउझरमध्ये उघडा</translation>
 <translation id="702463548815491781">TalkBack किंवा स्विच ॲक्सेस सुरू असताना शिफारस केलेले</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
@@ -873,6 +878,7 @@
 <translation id="7493994139787901920"><ph name="VERSION" /> (<ph name="TIME_SINCE_UPDATE" /> वाजता अपडेट केले)</translation>
 <translation id="7494974237137038751">डेटा वाचवला</translation>
 <translation id="7498271377022651285">कृपया प्रतीक्षा करा...</translation>
+<translation id="7510943789645525906">तुम्ही वापरत असलेला पासवर्ड डेटा भंगचा भाग असल्यास तुम्हाला चेतावणी देते</translation>
 <translation id="7514365320538308">डाउनलोड करा</translation>
 <translation id="751961395872307827">साइटशी कनेक्ट करु शकत नाही</translation>
 <translation id="7521387064766892559">JavaScript</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
index 4f51f0d4..a5c5eac 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Edit kad</translation>
 <translation id="2154710561487035718">Salin URL</translation>
 <translation id="2156074688469523661">Baki tapak (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Untuk berkongsi sesuatu daripada telefon anda kepada peranti lain, hidupkan penyegerakan dalam tetapan Chrome pada kedua-dua peranti</translation>
 <translation id="2170088579611075216">Benarkan &amp; masuk ke VR</translation>
 <translation id="218608176142494674">Perkongsian</translation>
 <translation id="2227444325776770048">Teruskan sebagai <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Halaman Lite disediakan oleh Google. Ketik untuk memuatkan halaman asal.</translation>
 <translation id="4452411734226507615">Tutup tab <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Ditandai halaman ke <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> dimuat turun dalam <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Benarkan tapak memainkan kandungan yang dilindungi</translation>
 <translation id="4468959413250150279">Redam bunyi untuk tapak tertentu.</translation>
 <translation id="4472118726404937099">Log masuk dan hidupkan penyegerakan untuk melakukan penyegerakan dan pemperibadian pada semua peranti</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Tanya dahulu sebelum membenarkan tapak menggunakan mikrofon anda (disyorkan)</translation>
 <translation id="7015203776128479407">Penyediaan penyegerakan awal tidak diselesaikan. Penyegerakan dimatikan.</translation>
 <translation id="7016516562562142042">Dibenarkan untuk enjin carian semasa</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> dimuat turun</translation>
 <translation id="7022756207310403729">Buka dalam penyemak imbas</translation>
 <translation id="702463548815491781">Disyorkan apabila TalkBack atau Akses Suis dihidupkan</translation>
 <translation id="7029809446516969842">Kata laluan</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, tab</translation>
 <translation id="885701979325669005">Storan</translation>
+<translation id="889338405075704026">Pergi ke tetapan Chrome</translation>
 <translation id="8901170036886848654">Tiada penanda halaman ditemui</translation>
 <translation id="8909135823018751308">Kongsi…</translation>
 <translation id="8912362522468806198">Akaun Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Buka tetingkap baharu dalam mod Inkognito</translation>
 <translation id="8998729206196772491">Anda log masuk dengan akaun yang diurus oleh <ph name="MANAGED_DOMAIN" /> dan memberikan kawalan terhadap data Chrome anda kepada pentadbirnya. Data anda akan terikat secara kekal kepada akaun ini. Tindakan log keluar daripada Chrome akan memadamkan data anda daripada peranti ini, tetapi data itu akan kekal disimpan dalam Akaun Google anda.</translation>
 <translation id="9019902583201351841">Diurus oleh ibu bapa anda</translation>
+<translation id="9028914725102941583">Hidupkan penyegerakan untuk berkongsi merentas peranti</translation>
 <translation id="9029323097866369874">Benarkan <ph name="DOMAIN" /> untuk memasuki VR?</translation>
 <translation id="9040142327097499898">Pemberitahuan dibenarkan. Lokasi dimatikan untuk peranti ini.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# Video}other{# Video}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index ed58d1a..086fbb4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Pas bewerken</translation>
 <translation id="2154710561487035718">URL kopiëren</translation>
 <translation id="2156074688469523661">Resterende sites (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Als je iets op je telefoon wilt delen met een ander apparaat, schakel je de synchronisatie in de Chrome-instellingen op beide apparaten in</translation>
 <translation id="2170088579611075216">VR toestaan en openen</translation>
 <translation id="218608176142494674">Delen</translation>
 <translation id="2227444325776770048">Doorgaan als <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Lite-pagina weergegeven door Google. Tik om het origineel te laden.</translation>
 <translation id="4452411734226507615">Tabblad <ph name="TAB_TITLE" /> sluiten</translation>
 <translation id="4452548195519783679">Bladwijzer gemaakt in <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> gedownload in <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Sites toestaan om beschermde content af te spelen</translation>
 <translation id="4468959413250150279">Geluid dempen voor een specifieke site.</translation>
 <translation id="4472118726404937099">Log in en schakel synchronisatie in om verschillende apparaten te synchroniseren en te personaliseren</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Eerst vragen voordat sites je microfoon mogen gebruiken (aanbevolen)</translation>
 <translation id="7015203776128479407">Aanvankelijke synchronisatie-instelling is niet voltooid. Synchronisatie is uitgeschakeld.</translation>
 <translation id="7016516562562142042">Toegestaan voor huidige zoekmachine</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> gedownload</translation>
 <translation id="7022756207310403729">Openen in browser</translation>
 <translation id="702463548815491781">Aanbevolen wanneer TalkBack of 'Toegang via schakelaar' is ingeschakeld</translation>
 <translation id="7029809446516969842">Wachtwoorden</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, tabblad</translation>
 <translation id="885701979325669005">Opslag</translation>
+<translation id="889338405075704026">Naar Chrome-instellingen</translation>
 <translation id="8901170036886848654">Geen bladwijzers gevonden</translation>
 <translation id="8909135823018751308">Delen</translation>
 <translation id="8912362522468806198">Google-account</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Een nieuw venster openen in de incognitomodus</translation>
 <translation id="8998729206196772491">Je logt in met een account dat wordt beheerd door <ph name="MANAGED_DOMAIN" /> waarmee je de eigenaar beheer geeft over je Chrome-gegevens. Je gegevens worden permanent gekoppeld aan dit account. Als je uitlogt van Chrome, worden je gegevens van dit apparaat verwijderd. Ze blijven echter opgeslagen in je Google-account.</translation>
 <translation id="9019902583201351841">Beheerd door je ouders</translation>
+<translation id="9028914725102941583">Schakel de synchronisatie in om content op apparaten te delen</translation>
 <translation id="9029323097866369874"><ph name="DOMAIN" /> toestaan om VR te activeren?</translation>
 <translation id="9040142327097499898">Meldingen zijn toegestaan. Locatie is uitgeschakeld voor dit apparaat.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# video}other{# video's}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 4c077c7..ef1c179 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Endre kortet</translation>
 <translation id="2154710561487035718">Kopier nettadresse</translation>
 <translation id="2156074688469523661">Andre nettsteder (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">For å dele noe på telefonen med en annen enhet, slå på synkronisering i Chrome-innstillingene på begge enhetene</translation>
 <translation id="2170088579611075216">Tillat og start VR</translation>
 <translation id="218608176142494674">Deling</translation>
 <translation id="2227444325776770048">Fortsett som <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Forenklet versjon av siden levert av Google. Trykk for å laste inn den opprinnelige siden.</translation>
 <translation id="4452411734226507615">Lukk <ph name="TAB_TITLE" />-fanen</translation>
 <translation id="4452548195519783679">Satt som bokmerke i <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> er lastet ned i <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Tillat at nettsteder kan spille beskyttet innhold</translation>
 <translation id="4468959413250150279">Kutt lyden for et bestemt nettsted.</translation>
 <translation id="4472118726404937099">For å synkronisere og gi et personlig preg på alle enhetene, slå på synkronisering</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Spør før nettsteder får bruke mikrofonen (anbefales)</translation>
 <translation id="7015203776128479407">Innledende synkroniseringsoppsett ble ikke fullført. Synkronisering er slått av.</translation>
 <translation id="7016516562562142042">tillatt for den aktive søkemotoren</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> er lastet ned</translation>
 <translation id="7022756207310403729">Åpne i nettleseren</translation>
 <translation id="702463548815491781">Anbefalt når TalkBack eller brytertilgang er på</translation>
 <translation id="7029809446516969842">Passord</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" /> – fane</translation>
 <translation id="885701979325669005">Lagring</translation>
+<translation id="889338405075704026">Gå til Chrome-innstillingene</translation>
 <translation id="8901170036886848654">Fant ingen bokmerker</translation>
 <translation id="8909135823018751308">Del</translation>
 <translation id="8912362522468806198">Google-konto</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Åpne en ny fane i inkognitomodus</translation>
 <translation id="8998729206196772491">Du logger på med en konto som administreres av <ph name="MANAGED_DOMAIN" />, og du gir administratoren for dette domenet kontroll over Chrome-dataene dine. Dataene dine blir permanent knyttet til denne kontoen. Når du logger av Chrome, slettes dataene dine fra denne enheten, men de fortsetter å være lagret i Google-kontoen din.</translation>
 <translation id="9019902583201351841">Administrert av foreldrene dine</translation>
+<translation id="9028914725102941583">Slå på synkronisering for å dele på tvers av enheter</translation>
 <translation id="9029323097866369874">Vil du tillate <ph name="DOMAIN" /> å gå inn i VR?</translation>
 <translation id="9040142327097499898">Varsler er tillatt. Posisjon er slått av for denne enheten.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# video}other{# videoer}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 6ca7f86..8cc57ed 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Edytowanie karty</translation>
 <translation id="2154710561487035718">Kopiuj adres URL</translation>
 <translation id="2156074688469523661">Pozostałe strony (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Jeśli chcesz udostępnić coś z telefonu na innym urządzeniu, w ustawieniach Chrome na obu urządzeniach włącz synchronizację</translation>
 <translation id="2170088579611075216">Zezwól na tryb VR i włącz go</translation>
 <translation id="218608176142494674">Udostępnianie</translation>
 <translation id="2227444325776770048">Kontynuuj jako <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Lżejsza wersja strony dostarczona przez Google. Kliknij, by załadować wersję oryginalną.</translation>
 <translation id="4452411734226507615">Zamknij kartę <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Utworzono zakładkę w folderze <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Plik <ph name="FILE_NAME" /> został pobrany w: <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Zezwalaj stronom na odtwarzanie treści chronionych</translation>
 <translation id="4468959413250150279">Wycisz dźwięk na konkretnej stronie.</translation>
 <translation id="4472118726404937099">Aby synchronizować i personalizować wszystkie swoje urządzenia, zaloguj się i włącz synchronizację</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Pytaj, zanim zezwolisz stronom na korzystanie z mikrofonu (zalecane)</translation>
 <translation id="7015203776128479407">Nie ukończono początkowej konfiguracji synchronizacji. Synchronizacja jest wyłączona.</translation>
 <translation id="7016516562562142042">Zezwolono na dostęp obecnej wyszukiwarce</translation>
-<translation id="7021515813996758557">Plik <ph name="FILE_NAME" /> został pobrany</translation>
 <translation id="7022756207310403729">Otwórz w przeglądarce</translation>
 <translation id="702463548815491781">Zalecane, gdy włączono TalkBack lub Switch Access</translation>
 <translation id="7029809446516969842">Hasła</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">Karta <ph name="TAB_TITLE" /></translation>
 <translation id="885701979325669005">Pamięć</translation>
+<translation id="889338405075704026">Otwórz ustawienia Chrome</translation>
 <translation id="8901170036886848654">Nie znaleziono zakładek</translation>
 <translation id="8909135823018751308">Udostępnij…</translation>
 <translation id="8912362522468806198">Konta Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Otwórz nową kartę w trybie incognito</translation>
 <translation id="8998729206196772491">Logujesz się na konto, którym zarządza <ph name="MANAGED_DOMAIN" />, i przekazujesz jego administratorowi kontrolę nad Twoimi danymi Chrome. Zostaną one trwale przypisane do tego konta. Gdy się wylogujesz, znikną one z tego urządzenia, ale pozostaną zapisane na Twoim koncie Google.</translation>
 <translation id="9019902583201351841">Zarządzany przez Twoich rodziców</translation>
+<translation id="9028914725102941583">Aby udostępniać treści między urządzeniami, włącz synchronizację</translation>
 <translation id="9029323097866369874">Zezwolić domenie <ph name="DOMAIN" /> na uruchamianie VR?</translation>
 <translation id="9040142327097499898">Powiadomienia są włączone. Lokalizacja jest wyłączona na tym urządzeniu.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# film}few{# filmy}many{# filmów}other{# filmu}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index 351bd56..bcf9b2b1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Editar cartão</translation>
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sites restantes (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Para compartilhar conteúdo do seu smartphone com outro dispositivo, ative a sincronização nas configurações do Chrome nos dois dispositivos</translation>
 <translation id="2170088579611075216">Permitir e entrar na RV</translation>
 <translation id="218608176142494674">Compartilhamento</translation>
 <translation id="2227444325776770048">Continuar como <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Página Lite exibida pelo Google. Toque para carregar a original.</translation>
 <translation id="4452411734226507615">Fechar guia <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Adicionado como favorito em <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Download do arquivo <ph name="FILE_NAME" /> realizado no <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Permitir que sites reproduzam conteúdo protegido</translation>
 <translation id="4468959413250150279">Desative o som de um site específico.</translation>
 <translation id="4472118726404937099">Para sincronizar e personalizar vários dispositivos, faça login e ative a sincronização</translation>
@@ -820,7 +820,6 @@
 <translation id="6992289844737586249">Perguntar antes de permitir que sites usem o microfone (recomendado)</translation>
 <translation id="7015203776128479407">A configuração de sincronização inicial não foi concluída. A sincronização está desativada.</translation>
 <translation id="7016516562562142042">Permitido para o mecanismo de pesquisa atual</translation>
-<translation id="7021515813996758557">O download de <ph name="FILE_NAME" /> foi concluído</translation>
 <translation id="7022756207310403729">Abrir no navegador</translation>
 <translation id="702463548815491781">Recomendado quando o TalkBack ou o acesso com interruptor estão ativados</translation>
 <translation id="7029809446516969842">Senhas</translation>
@@ -1076,6 +1075,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, guia</translation>
 <translation id="885701979325669005">Armazenamento</translation>
+<translation id="889338405075704026">Acesse as configurações do Chrome</translation>
 <translation id="8901170036886848654">Nenhum favorito encontrado</translation>
 <translation id="8909135823018751308">Compartilhar...</translation>
 <translation id="8912362522468806198">Conta do Google</translation>
@@ -1094,6 +1094,7 @@
 <translation id="8993760627012879038">Abrir uma nova guia no modo de navegação anônima</translation>
 <translation id="8998729206196772491">Você está fazendo login com uma conta gerenciada por <ph name="MANAGED_DOMAIN" /> e dando ao administrador dela o controle sobre seus dados do Chrome, os quais ficarão permanentemente vinculados a essa conta. Se você sair do Chrome, seus dados serão excluídos desse dispositivo, mas permanecerão armazenados na sua Conta do Google.</translation>
 <translation id="9019902583201351841">Gerenciado pelos seus pais</translation>
+<translation id="9028914725102941583">Ative a sincronização para compartilhar entre dispositivos</translation>
 <translation id="9029323097866369874">Permitir que <ph name="DOMAIN" /> entre na RV?</translation>
 <translation id="9040142327097499898">As notificações são permitidas. A localização está desativada neste dispositivo.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# vídeo}one{# vídeo}other{# vídeos}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index 16c2178..ed774b0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Editar cartão</translation>
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sites restantes (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Para partilhar conteúdos do seu telemóvel com outro dispositivo, ative a sincronização nas definições do Chrome em ambos os dispositivos.</translation>
 <translation id="2170088579611075216">Permitir e iniciar RV</translation>
 <translation id="218608176142494674">Partilha</translation>
 <translation id="2227444325776770048">Continuar como <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Página em modo lite fornecida pela Google. Toque para carregar a página original.</translation>
 <translation id="4452411734226507615">Fechar o separador <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Adicionado aos marcadores em <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> transferido no <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Permitir que os sites reproduzam conteúdos protegidos</translation>
 <translation id="4468959413250150279">Desative o som de um site específico.</translation>
 <translation id="4472118726404937099">Para sincronizar e personalizar entre dispositivos, inicie sessão e ative a sincronização.</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Perguntar antes de permitir que os sites utilizem o microfone (recomendado)</translation>
 <translation id="7015203776128479407">A configuração da sincronização inicial não foi concluída. A sincronização está desativada.</translation>
 <translation id="7016516562562142042">Permitido para o motor de pesquisa atual</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> transferido</translation>
 <translation id="7022756207310403729">Abrir no navegador</translation>
 <translation id="702463548815491781">Recomendado quando o TalkBack ou o Acesso por comutador estão ativados.</translation>
 <translation id="7029809446516969842">Palavras-passe</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">Separador <ph name="TAB_TITLE" /></translation>
 <translation id="885701979325669005">Armazenamento</translation>
+<translation id="889338405075704026">Aceder às definições do Chrome</translation>
 <translation id="8901170036886848654">Nenhum marcador encontrado</translation>
 <translation id="8909135823018751308">Partilhar…</translation>
 <translation id="8912362522468806198">Conta Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Abrir novo separador no modo de navegação anónima</translation>
 <translation id="8998729206196772491">Está a iniciar sessão com uma conta gerida por <ph name="MANAGED_DOMAIN" /> e a conceder ao respetivo gestor o controlo dos seus dados do Chrome. Os dados ficarão permanentemente associados a esta conta. Terminar sessão no Chrome elimina os seus dados deste dispositivo, embora permaneçam armazenados na Conta Google.</translation>
 <translation id="9019902583201351841">Gerido pelos teus pais</translation>
+<translation id="9028914725102941583">Ative a sincronização para partilhar entre dispositivos</translation>
 <translation id="9029323097866369874">Pretende permitir que <ph name="DOMAIN" /> entre na RV?</translation>
 <translation id="9040142327097499898">As notificações são permitidas. A localização está desativada para este dispositivo.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# vídeo}other{# vídeos}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index 497de11..c779190c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Pagină Lite oferită de Google. Atinge pentru a încărca versiunea originală.</translation>
 <translation id="4452411734226507615">Închide fila <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Marcaj adăugat în <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> s-a descărcat în <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Permite site-urilor să redea conținut protejat</translation>
 <translation id="4468959413250150279">Dezactivează sunetul pentru un anumit site.</translation>
 <translation id="4472118726404937099">Pentru a sincroniza și a personaliza pe toate dispozitivele, conectează-te și activează sincronizarea</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Întreabă înainte de a permite site-urilor să folosească microfonul (recomandat)</translation>
 <translation id="7015203776128479407">Configurarea inițială a sincronizării nu a fost finalizată. Sincronizarea este dezactivată.</translation>
 <translation id="7016516562562142042">Se permite pentru motorul de căutare actual</translation>
-<translation id="7021515813996758557">Fișierul <ph name="FILE_NAME" /> a fost descărcat</translation>
 <translation id="7022756207310403729">Deschide în browser</translation>
 <translation id="702463548815491781">Recomandat atunci când este activată opțiunea TalkBack sau Acces prin comutare</translation>
 <translation id="7029809446516969842">Parole</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index 0260edd..297879f9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Lite-версия страницы получена с помощью Google. Нажмите, чтобы загрузить оригинал.</translation>
 <translation id="4452411734226507615">Закрыть вкладку "<ph name="TAB_TITLE" />"</translation>
 <translation id="4452548195519783679">Закладка добавлена в папку "<ph name="FOLDER_NAME" />"</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" />: скачан файл <ph name="FILE_NAME" /></translation>
 <translation id="445467742685312942">Разрешить сайтам воспроизводить защищенный контент</translation>
 <translation id="4468959413250150279">Отключить звуки на определенном сайте.</translation>
 <translation id="4472118726404937099">Чтобы синхронизировать и персонализировать данные на всех устройствах, войдите в аккаунт и включите синхронизацию.</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Запрашивать разрешение на доступ к микрофону (рекомендуется)</translation>
 <translation id="7015203776128479407">Первоначальная настройка синхронизации не завершена. Синхронизация выключена.</translation>
 <translation id="7016516562562142042">Открыт доступ для текущей поисковой системы</translation>
-<translation id="7021515813996758557">Файл <ph name="FILE_NAME" /> скачан.</translation>
 <translation id="7022756207310403729">Открыть в браузере</translation>
 <translation id="702463548815491781">Рекомендовано при включенных функциях TalkBack и Switch Access</translation>
 <translation id="7029809446516969842">Пароли</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 176c4116..c3f1294d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Úprava karty</translation>
 <translation id="2154710561487035718">Kopírovať webovú adresu</translation>
 <translation id="2156074688469523661">Zostávajúce weby (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Ak chcete niečo zdieľať zo svojho telefónu do iného zariadenia, zapnite v oboch synchronizáciu v nastaveniach Chromu</translation>
 <translation id="2170088579611075216">Povoliť a vstúpiť do VR</translation>
 <translation id="218608176142494674">Zdieľanie</translation>
 <translation id="2227444325776770048">Pokračovať ako <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Zjednodušenú verziu stránky poskytol Google. Klepnutím načítate pôvodnú verziu.</translation>
 <translation id="4452411734226507615">Zavrieť kartu <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Uložené ako záložka v priečinku <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Súbor <ph name="FILE_NAME" /> bol stiahnutý v prehliadači <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Povoliť webom prehrávať chránený obsah</translation>
 <translation id="4468959413250150279">Vypnite zvuk konkrétneho webu.</translation>
 <translation id="4472118726404937099">Ak chcete synchronizovať a prispôsobovať viaceré zariadenia, prihláste sa a zapnite synchronizáciu</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Opýtať sa pred povolením webu používať váš mikrofón (odporúčané)</translation>
 <translation id="7015203776128479407">Počiatočné nastavenie synchronizácie nebolo dokončené. Synchronizácia je vypnutá.</translation>
 <translation id="7016516562562142042">Povolené v aktuálnom vyhľadávači</translation>
-<translation id="7021515813996758557">Súbor <ph name="FILE_NAME" /> bol stiahnutý</translation>
 <translation id="7022756207310403729">Otvoriť v prehliadači</translation>
 <translation id="702463548815491781">Odporúčané, keď je zapnutá aplikácia TalkBack alebo prístup s prepínačmi</translation>
 <translation id="7029809446516969842">Heslá</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, karta</translation>
 <translation id="885701979325669005">Úložisko</translation>
+<translation id="889338405075704026">Prejsť do nastavení Chromu</translation>
 <translation id="8901170036886848654">Nenašli sa žiadne záložky</translation>
 <translation id="8909135823018751308">Zdieľať…</translation>
 <translation id="8912362522468806198">účtu Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Otvorenie novej karty v režime inkognito</translation>
 <translation id="8998729206196772491">Prihlasujete sa pomocou účtu spravovaného doménou <ph name="MANAGED_DOMAIN" /> a jej správcovi tým dávate kontrolu nad svojimi údajmi Chromu. Vaše údaje budú natrvalo prepojené s týmto účtom. Odhlásením z Chromu odstránite údaje z príslušného zariadenia, avšak naďalej zostanú uložené vo vašom účte Google.</translation>
 <translation id="9019902583201351841">Spravované vašimi rodičmi</translation>
+<translation id="9028914725102941583">Zapnite synchronizáciu a zdieľajte medzi zariadeniami</translation>
 <translation id="9029323097866369874">Povoliť webu <ph name="DOMAIN" /> prejsť do VR?</translation>
 <translation id="9040142327097499898">Upozornenia sú povolené. Poloha je v tomto zariadení vypnutá.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# video}few{# videá}many{# Videos}other{# videí}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index 16a9a245..aff0fae 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Stran v osnovnem načinu, ki jo je prikazal Google. Dotaknite se, če želite naložiti izvirno stran.</translation>
 <translation id="4452411734226507615">Zapiranje zavihka <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Zaznamek ustvarjen v mapi <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> – preneseno v izdelku <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Spletnim mestom dovoli predvajanje zaščitene vsebine</translation>
 <translation id="4468959413250150279">Izklop zvoka za določeno spletno mesto.</translation>
 <translation id="4472118726404937099">Če želite sinhronizirati in prilagajati v vseh napravah, se prijavite in vklopite sinhronizacijo</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Prikaži poziv, preden se spletnim mestom dovoli uporaba mikrofona (priporočeno)</translation>
 <translation id="7015203776128479407">Začetna nastavitev sinhronizacije ni bila dokončana. Sinhronizacija je izklopljena.</translation>
 <translation id="7016516562562142042">Dovoljeno za trenutni iskalnik</translation>
-<translation id="7021515813996758557">Datoteka <ph name="FILE_NAME" /> je prenesena</translation>
 <translation id="7022756207310403729">Odpiranje v brskalniku</translation>
 <translation id="702463548815491781">Priporočljivo, ko je vklopljena aplikacija TalkBack ali funkcija dostopa s stikalom</translation>
 <translation id="7029809446516969842">Gesla</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index 29509e7..4be0ad6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Поједностављену страницу пружа Google. Додирните да бисте учитали првобитну страницу.</translation>
 <translation id="4452411734226507615">Затвори картицу <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Обележивач је додат у <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Датотека <ph name="FILE_NAME" /> је преузета у <ph name="PRODUCT_NAME" />-у</translation>
 <translation id="445467742685312942">Дозволите сајтовима да пуштају заштићени садржај</translation>
 <translation id="4468959413250150279">Искључи звук за одређени сајт</translation>
 <translation id="4472118726404937099">Да бисте синхронизовали и персонализовали садржај на уређајима, пријавите се и укључите синхронизацију</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Питај пре него што дозволиш сајтовима да користе микрофон (препоручено)</translation>
 <translation id="7015203776128479407">Почетно подешавање синхронизације није завршено. Синхронизација је искључена.</translation>
 <translation id="7016516562562142042">Дозвољено је за актуелни претраживач</translation>
-<translation id="7021515813996758557">Преузели сте <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Отвори у прегледачу</translation>
 <translation id="702463548815491781">Препоручујемо вам када укључите TalkBack или приступ помоћу прекидача</translation>
 <translation id="7029809446516969842">Лозинке</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 77e9de7d..b7cdd00 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Lite-sida tillhandahållen av Google. Tryck för att läsa in originalet.</translation>
 <translation id="4452411734226507615">Stäng fliken <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Bokmärkt i <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> har laddats ned i <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Tillåt att webbplatser spelar upp skyddat innehåll</translation>
 <translation id="4468959413250150279">Stäng av ljudet för en webbplats.</translation>
 <translation id="4472118726404937099">Logga in och aktivera synkronisering om du vill synkronisera och anpassa alla dina enheter</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Fråga innan webbplatser tillåts att använda mikrofonen (rekommenderas)</translation>
 <translation id="7015203776128479407">Den initiala synkroniseringskonfigureringen avslutades inte. Synkroniseringen är inaktiverad.</translation>
 <translation id="7016516562562142042">Tillåt för den nuvarande sökmotorn</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> har laddats ned</translation>
 <translation id="7022756207310403729">Öppna i webbläsaren</translation>
 <translation id="702463548815491781">Rekommenderas när TalkBack eller brytarstyrning är aktiverat</translation>
 <translation id="7029809446516969842">Lösenord</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index faad9d1..607cf38 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Badilisha kadi</translation>
 <translation id="2154710561487035718">Nakili UR:</translation>
 <translation id="2156074688469523661">Tovuti zilizosalia (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Ili ushiriki kitu kutoka simu yako hadi kifaa kingine, washa usawazishaji katika mipangilio ya Chrome kwenye vifaa vyote viwili</translation>
 <translation id="2170088579611075216">Ruhusu na uingie katika VR</translation>
 <translation id="218608176142494674">Inashiriki</translation>
 <translation id="2227444325776770048">Endelea ukitumia <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Ukurasa mwepesi umetolewa na Google. Gusa ili upakie ukurasa halisi.</translation>
 <translation id="4452411734226507615">Funga kichupo cha <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Imetia alamishwa kwenye <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> imepakuliwa katika <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Ruhusu tovuti icheze maudhui yanayolindwa</translation>
 <translation id="4468959413250150279">Zima sauti katika tovuti mahususi.</translation>
 <translation id="4472118726404937099">Ingia katika akaunti na uwashe kipengele cha usawazishaji ili usawazishe na uweke mapendeleo kwenye vifaa vyako vyote</translation>
@@ -818,7 +818,6 @@
 <translation id="6992289844737586249">Uliza kwanza kabla ya kuruhusu tovuti zitumie maikrofoni yako (inapendekezwa)</translation>
 <translation id="7015203776128479407">Haikukamilisha kuweka usawazishaji wa mipangilio ya kwanza. Umezima kipengele cha kusawazisha.</translation>
 <translation id="7016516562562142042">Imeruhusiwa kwa mtambo wa sasa wa kutafuta</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> imepakuliwa</translation>
 <translation id="7022756207310403729">Fungua katika kivinjari</translation>
 <translation id="702463548815491781">Inapendekezwa wakati umewasha TalkBack au kipengele cha Kufikia Kupitia Swichi</translation>
 <translation id="7029809446516969842">Manenosiri</translation>
@@ -1073,6 +1072,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, kichupo</translation>
 <translation id="885701979325669005">Hifadhi</translation>
+<translation id="889338405075704026">Nenda kwenye mipangilio ya Chrome</translation>
 <translation id="8901170036886848654">Hakuna alamisho zilizopatikana</translation>
 <translation id="8909135823018751308">Shiriki...</translation>
 <translation id="8912362522468806198">Akaunti ya Google</translation>
@@ -1091,6 +1091,7 @@
 <translation id="8993760627012879038">Fungua kichupo kipya katika Hali fiche</translation>
 <translation id="8998729206196772491">Unaingia kwa kutumia akaunti inayodhibitiwa na <ph name="MANAGED_DOMAIN" /> na kumpa msimamizi wa kikoa hicho udhibiti wa data yako ya Chrome. Data yako ya Chrome itahusishwa na akaunti hii daima. Kuondoka kwenye Chrome kutafuta data yako kwenye kifaa hiki, lakini itaendelea kuhifadhiwa katika Akaunti yako ya Google.</translation>
 <translation id="9019902583201351841">Inadhibitiwa na wazazi wako</translation>
+<translation id="9028914725102941583">Washa usawazishaji ili ushiriki kwenye vifaa vyote</translation>
 <translation id="9029323097866369874">Ungependa kuruhusu <ph name="DOMAIN" /> kuanzisha VR?</translation>
 <translation id="9040142327097499898">Arifa zinaruhusiwa. Kipengele cha mahali kimezimwa kwenye kifaa hiki.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{Video #}other{Video #}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
index 6d911ba6..ef64c8d3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Google வழங்கும் Lite பக்கம். அசல் பக்கத்தை ஏற்ற, தட்டவும்.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> தாவலை மூடும்</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> இல் புத்தகக்குறியைச் சேர்த்தது</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> இல் <ph name="FILE_NAME" /> பதிவிறக்கப்பட்டது</translation>
 <translation id="445467742685312942">பாதுகாக்கப்பட்ட உள்ளடக்கத்தை இயக்குவதற்குத் தளங்களை அனுமதிக்கும்</translation>
 <translation id="4468959413250150279">குறிப்பிட்ட தளத்திற்கு ஒலியடக்கு</translation>
 <translation id="4472118726404937099">அனைத்துச் சாதனங்களுக்கு இடையிலும் ஒத்திசைக்க மற்றும் தனிப்பயனாக்க, உள்நுழைந்து, ஒத்திசைவை இயக்கவும்</translation>
@@ -583,7 +582,7 @@
 <translation id="5324858694974489420">பெற்றோர் அமைப்புகள்</translation>
 <translation id="5327248766486351172">பெயர்</translation>
 <translation id="5335288049665977812">JavaScriptஐ இயக்குவதற்கு, தளங்களை அனுமதி (பரிந்துரைக்கப்படுகிறது)</translation>
-<translation id="5342314432463739672">அனுமதி கோரிக்கைகள்</translation>
+<translation id="5342314432463739672">அனுமதிக் கோரிக்கைகள்</translation>
 <translation id="5357811892247919462">பகிர்ந்த தாவல் பெறப்பட்டது</translation>
 <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> திறந்துள்ள தாவல், தாவல்களை மாற்ற, தட்டவும்}other{<ph name="OPEN_TABS_MANY" /> திறந்துள்ள தாவல்கள், தாவல்களை மாற்ற, தட்டவும்}}</translation>
 <translation id="5391532827096253100">இந்தத் தளத்திற்கான இணைப்பு பாதுகாப்பானதல்ல. தளத் தகவல்</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">எனது மைக்ரோஃபோனைப் பயன்படுத்தத் தளங்களை அனுமதிக்கும் முன் கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
 <translation id="7015203776128479407">ஒத்திசைப்பதற்கான துவக்க அமைவு முடியவில்லை. ஒத்திசைவு முடக்கப்பட்டுள்ளது.</translation>
 <translation id="7016516562562142042">நடப்புத் தேடல் இன்ஜினுக்கு அனுமதிக்கப்பட்டுள்ளது</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> பதிவிறக்கப்பட்டது</translation>
 <translation id="7022756207310403729">உலாவியில் திற</translation>
 <translation id="702463548815491781">TalkBack அல்லது ‘சுவிட்ச் அணுகல்’ இயக்கத்தில் இருக்கும்போது பரிந்துரைக்கப்படுகிறது</translation>
 <translation id="7029809446516969842">கடவுச்சொற்கள்</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
index 4d4f069..8284cfb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -440,7 +440,6 @@
 <translation id="4440958355523780886">Google నుండి లైట్ పేజీ అందించబడింది. అసలు పేజీని లోడ్ చేయడానికి నొక్కండి.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> ట్యాబ్‌ను మూసివేయండి</translation>
 <translation id="4452548195519783679"><ph name="FOLDER_NAME" />కి బుక్‌మార్క్ చేసారు</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" />లో <ph name="FILE_NAME" /> డౌన్‌లోడ్ చేయబడింది</translation>
 <translation id="445467742685312942">రక్షిత కంటెంట్‌ను ప్లే చేయడానికి సైట్‌లను అనుమతిస్తుంది</translation>
 <translation id="4468959413250150279">నిర్దిష్ట సైట్ కోసం ధ్వనిని మ్యూట్ చేయండి.</translation>
 <translation id="4472118726404937099">మీ అన్ని పరికరాలలో సమకాలీకరణ చేయాలన్నా లేదా మీ అభిరుచికి అనుగుణంగా సెట్ చేయాలన్నా, సైన్ ఇన్ చేసి సమకాలీకరణ ఎంపికను ఆన్ చేయాలి</translation>
@@ -808,7 +807,6 @@
 <translation id="6992289844737586249">మీ మైక్రోఫోన్‌ను ఏవైనా సైట్‌లు ఉపయోగించగలిగేలా వాటిని అనుమతించే ముందు, మిమ్మల్ని అడుగుతుంది (సిఫార్సు చేయబడింది)</translation>
 <translation id="7015203776128479407">ప్రాథమిక సింక్ సెటప్ పూర్తి కాలేదు. సింక్ ఆఫ్‌లో ఉంది.</translation>
 <translation id="7016516562562142042">ప్రస్తుత శోధన ఇంజిన్‌కు అనుమతించబడింది</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> డౌన్‌లోడ్ చేయబడింది</translation>
 <translation id="7022756207310403729">బ్రౌజర్‌లో తెరువు</translation>
 <translation id="702463548815491781">TalkBack లేదా స్విచ్ యాక్సెస్ ఆన్‌లో ఉన్నప్పుడు సిఫార్సు చేయబడింది</translation>
 <translation id="7029809446516969842">పాస్‌వర్డ్‌లు</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 2256c116..1789bde 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">หน้าเวอร์ชัน Lite จัดเตรียมโดย Google แตะเพื่อโหลดต้นฉบับ</translation>
 <translation id="4452411734226507615">ปิดแท็บ <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">เพิ่มบุ๊กมาร์กไปยัง <ph name="FOLDER_NAME" /> แล้ว</translation>
-<translation id="4453340223357552416">ดาวน์โหลด <ph name="FILE_NAME" /> ไว้ใน <ph name="PRODUCT_NAME" /> แล้ว</translation>
 <translation id="445467742685312942">อนุญาตให้เว็บไซต์เล่นเนื้อหาที่ได้รับความคุ้มครอง</translation>
 <translation id="4468959413250150279">ปิดเสียงไซต์ที่ต้องการ</translation>
 <translation id="4472118726404937099">ลงชื่อเข้าใช้และเปิดการซิงค์เพื่อซิงค์และปรับเปลี่ยนข้อมูลตามความต้องการในอุปกรณ์ทุกเครื่อง</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์ใช้ไมโครโฟน (แนะนำ)</translation>
 <translation id="7015203776128479407">ตั้งค่าการซิงค์เริ่มต้นไม่สำเร็จ การซิงค์ปิดอยู่</translation>
 <translation id="7016516562562142042">อนุญาตสำหรับเครื่องมือค้นหาปัจจุบัน</translation>
-<translation id="7021515813996758557">ดาวน์โหลด <ph name="FILE_NAME" /> แล้ว</translation>
 <translation id="7022756207310403729">เปิดในเบราว์เซอร์</translation>
 <translation id="702463548815491781">แนะนำให้ใช้เมื่อ TalkBack หรือการเข้าถึงด้วยสวิตช์เปิดอยู่</translation>
 <translation id="7029809446516969842">รหัสผ่าน</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 29a7fcdf..df72487 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Google tarafından sağlanan basit sayfa. Sayfanın orijinalini yüklemek için dokunun.</translation>
 <translation id="4452411734226507615"><ph name="TAB_TITLE" /> sekmesini kapat</translation>
 <translation id="4452548195519783679">Yer işareti <ph name="FOLDER_NAME" /> klasörüne eklendi</translation>
-<translation id="4453340223357552416"><ph name="FILE_NAME" /> dosyası <ph name="PRODUCT_NAME" /> uygulamasında indirildi</translation>
 <translation id="445467742685312942">Sitelerin korumalı içeriği oynatmasına izin ver</translation>
 <translation id="4468959413250150279">Belirli bir site için sesi kapatın.</translation>
 <translation id="4472118726404937099">Cihazlar arasında senkronizasyon ve kişiselleştirme yapmak için oturum açın ve senkronizasyonu etkinleştirin</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Sitelerin, mikrofonunuzu kullanmasına izin verilmeden önce size sorulsun (önerilen)</translation>
 <translation id="7015203776128479407">İlk senkronizasyon kurulumu tamamlanmadı. Senkronizasyon kapalı.</translation>
 <translation id="7016516562562142042">Geçerli arama motoru için izin verildi</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> dosyası indirildi</translation>
 <translation id="7022756207310403729">Tarayıcıda aç</translation>
 <translation id="702463548815491781">TalkBack veya Anahtar Erişimi açık olduğunda önerilir</translation>
 <translation id="7029809446516969842">Şifreler</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index e38312f3..c6fbb06 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -174,6 +174,7 @@
 <translation id="2154484045852737596">Редагувати картку</translation>
 <translation id="2154710561487035718">Копіювати URL-адресу</translation>
 <translation id="2156074688469523661">Інші сайти (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="2157851137955077194">Щоб мати доступ до даних свого телефона на іншому пристрою, увімкніть синхронізацію в налаштуваннях Chrome на обох пристроях</translation>
 <translation id="2170088579611075216">Перейти у VR</translation>
 <translation id="218608176142494674">Спільний доступ</translation>
 <translation id="2227444325776770048">Продовжити як <ph name="USER_FULL_NAME" /></translation>
@@ -449,7 +450,6 @@
 <translation id="4440958355523780886">Спрощену сторінку надає Google. Натисніть, щоб завантажити оригінал.</translation>
 <translation id="4452411734226507615">Закрити вкладку <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Закладку збережено в папці "<ph name="FOLDER_NAME" />"</translation>
-<translation id="4453340223357552416">Файл <ph name="FILE_NAME" /> завантажено в продукті <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Дозволити сайтам відтворювати захищений вміст</translation>
 <translation id="4468959413250150279">Вимкнути звук для певного сайту.</translation>
 <translation id="4472118726404937099">Щоб синхронізувати й персоналізувати дані на пристроях, увійдіть в обліковий запис і ввімкніть синхронізацію</translation>
@@ -819,7 +819,6 @@
 <translation id="6992289844737586249">Запитувати, перш ніж дозволити сайтам використовувати мікрофон (рекомендується)</translation>
 <translation id="7015203776128479407">Початкове налаштування синхронізації не завершено. Синхронізацію вимкнено.</translation>
 <translation id="7016516562562142042">Дозволено для поточної пошукової системи</translation>
-<translation id="7021515813996758557">Файл "<ph name="FILE_NAME" />" завантажено</translation>
 <translation id="7022756207310403729">Відкрити у веб-переглядачі</translation>
 <translation id="702463548815491781">Рекомендується, коли ввімкнено TalkBack або кнопковий доступ</translation>
 <translation id="7029809446516969842">Паролі</translation>
@@ -1075,6 +1074,7 @@
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">Вкладка "<ph name="TAB_TITLE" />"</translation>
 <translation id="885701979325669005">Обсяг пам’яті</translation>
+<translation id="889338405075704026">Перейти в налаштування Chrome</translation>
 <translation id="8901170036886848654">Немає закладок</translation>
 <translation id="8909135823018751308">Надіслати…</translation>
 <translation id="8912362522468806198">Обліковий запис Google</translation>
@@ -1093,6 +1093,7 @@
 <translation id="8993760627012879038">Відкрити нове вікно в режимі анонімного перегляду</translation>
 <translation id="8998729206196772491">Ви входите в обліковий запис, зареєстрований у домені <ph name="MANAGED_DOMAIN" />, і надаєте його адміністратору доступ до своїх даних Chrome. Ваші дані буде назавжди зв’язано з цим обліковим записом. Якщо ви вийдете з облікового запису в Chrome, дані буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="9019902583201351841">Керується батьками</translation>
+<translation id="9028914725102941583">Увімкніть синхронізацію, щоб мати доступ до даних на всіх пристроях</translation>
 <translation id="9029323097866369874">Дозволити сайту <ph name="DOMAIN" /> перейти у VR?</translation>
 <translation id="9040142327097499898">На цьому пристрої вимкнено геодані. Сповіщення дозволено.</translation>
 <translation id="9041669420854607037">{FILE_COUNT,plural, =1{# відео}one{# відео}few{# відео}many{# відео}other{# відео}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index a592ee7..89f735e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">Trang phiên bản rút gọn do Google cung cấp. Nhấn để tải trang gốc.</translation>
 <translation id="4452411734226507615">Đóng tab <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">Đã đánh dấu trang vào <ph name="FOLDER_NAME" /></translation>
-<translation id="4453340223357552416">Đã tải xuống <ph name="FILE_NAME" /> trong <ph name="PRODUCT_NAME" /></translation>
 <translation id="445467742685312942">Cho phép trang web phát nội dung được bảo vệ</translation>
 <translation id="4468959413250150279">Tắt âm thanh trên một trang web cụ thể.</translation>
 <translation id="4472118726404937099">Để đồng bộ hóa và cá nhân hóa trên các thiết bị, hãy đăng nhập và bật tính năng đồng bộ hóa</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">Hỏi trước trước khi cho phép các trang web sử dụng micrô của bạn (được đề xuất)</translation>
 <translation id="7015203776128479407">Quá trình thiết lập đồng bộ hóa ban đầu chưa hoàn tất. Tính năng đồng bộ hóa đã tắt.</translation>
 <translation id="7016516562562142042">Được cho phép đối với công cụ tìm kiếm hiện tại</translation>
-<translation id="7021515813996758557">Đã tải <ph name="FILE_NAME" /> xuống</translation>
 <translation id="7022756207310403729">Mở trong trình duyệt</translation>
 <translation id="702463548815491781">Khuyên dùng khi dịch vụ TalkBack hoặc Tiếp cận bằng công tắc đang bật</translation>
 <translation id="7029809446516969842">Mật khẩu</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index 5e1de8e4..8a61bcf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">由 Google 提供的精简版网页。点按即可加载原始网页。</translation>
 <translation id="4452411734226507615">关闭“<ph name="TAB_TITLE" />”标签页</translation>
 <translation id="4452548195519783679">已将书签添加到“<ph name="FOLDER_NAME" />”</translation>
-<translation id="4453340223357552416">已在 <ph name="PRODUCT_NAME" /> 中下载 <ph name="FILE_NAME" /></translation>
 <translation id="445467742685312942">允许网站播放受保护内容。</translation>
 <translation id="4468959413250150279">将某个特定网站静音。</translation>
 <translation id="4472118726404937099">要在您的所有设备上保持同步并进行个性化设置,请登录您的帐号并开启同步功能</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">在允许网站使用您的麦克风前先询问(推荐)</translation>
 <translation id="7015203776128479407">初始同步设置未完成。同步功能处于关闭状态。</translation>
 <translation id="7016516562562142042">允许当前搜索引擎使用</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> 已下载完毕</translation>
 <translation id="7022756207310403729">在浏览器中打开</translation>
 <translation id="702463548815491781">建议在开启 TalkBack 或“开关控制”时使用</translation>
 <translation id="7029809446516969842">密码</translation>
@@ -885,7 +883,7 @@
 <translation id="7493994139787901920"><ph name="VERSION" />(上次更新时间:<ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">已节省的流量</translation>
 <translation id="7498271377022651285">请稍候…</translation>
-<translation id="7510943789645525906">如果您使用的某个密码属于已遭泄露的数据,就会向您发出警告</translation>
+<translation id="7510943789645525906">如有密码遭遇数据泄露就会向您发出警告</translation>
 <translation id="7514365320538308">下载</translation>
 <translation id="751961395872307827">无法连接到该网站</translation>
 <translation id="7521387064766892559">JavaScript</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index cb7c20b..b4a5895 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -449,7 +449,6 @@
 <translation id="4440958355523780886">由 Google 提供的精簡版網頁。輕觸即可載入原始網頁。</translation>
 <translation id="4452411734226507615">關閉 [<ph name="TAB_TITLE" />] 分頁</translation>
 <translation id="4452548195519783679">已將書籤加入「<ph name="FOLDER_NAME" />」</translation>
-<translation id="4453340223357552416"><ph name="PRODUCT_NAME" /> 已下載「<ph name="FILE_NAME" />」</translation>
 <translation id="445467742685312942">允許網站播放受保護的內容</translation>
 <translation id="4468959413250150279">將特定網站設為靜音。</translation>
 <translation id="4472118726404937099">如要進行同步處理並在所有裝置上享有個人化的體驗,請登入並開啟同步處理功能</translation>
@@ -819,7 +818,6 @@
 <translation id="6992289844737586249">允許網站使用你的麥克風前,必須先詢問你 (建議)</translation>
 <translation id="7015203776128479407">尚未完成初始同步處理設定。已關閉同步功能。</translation>
 <translation id="7016516562562142042">允許目前的搜尋引擎存取位置資訊</translation>
-<translation id="7021515813996758557"><ph name="FILE_NAME" /> 下載完成</translation>
 <translation id="7022756207310403729">在瀏覽器中開啟</translation>
 <translation id="702463548815491781">建議在 TalkBack 或開關功能開啟時使用</translation>
 <translation id="7029809446516969842">密碼</translation>
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 10d8608..9ea2ba96 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -2664,7 +2664,8 @@
     <ph name="LICENSE_TYPE">$1<ex>Perpetual</ex></ph> (<ph name="LICENSE_COUNT">$2<ex>10</ex></ph> rem.)
   </message>
 
-  <!-- About network UI display strings -->
+  <!-- About network UI (chrome://network) display strings (for developer
+       debugging) -->
   <message name="IDS_NETWORK_UI_TITLE" desc="Title of the page">
     Network
   </message>
@@ -2704,6 +2705,9 @@
   <message name="IDS_NETWORK_UI_FAVORITE_NETWORKS" desc="Label for list of favorite networks">
     Favorite Networks:
   </message>
+  <message name="IDS_NETWORK_UI_ETHERNET_EAP" desc="Label for section with the EthernetEAP network">
+    Ethernet EAP:
+  </message>
   <message name="IDS_NETWORK_UI_DEVICES" desc="Label for list of network devices, e.g. wifi or cellular">
     Devices:
   </message>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index 00794836..fabba58 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -92,6 +92,8 @@
 <translation id="4230135487732243613">I-link ang iyong data sa Chromium sa account na ito?</translation>
 <translation id="4271805377592243930">Humingi ng tulong sa Chromium</translation>
 <translation id="4285930937574705105">Nabigo ang pag-install dahil sa hindi natukoy na error. Kung kasalukuyang tumatakbo ang Chromium, pakisara ito at subukang muli.</translation>
+<translation id="4371648796594901282">Para sa mga detalye ng Chromium OS, pakitingnan ang <ph name="LINK_BEGIN" />
+      Tungkol sa Chromium OS<ph name="LINK_END" /></translation>
 <translation id="4407044323746248786">Lumabas pa rin sa Chromium?</translation>
 <translation id="4415566066719264597">Hayaang Tumakbo ang Chromium sa Background</translation>
 <translation id="4423735387467980091">I-customize at kontrolin ang Chromium</translation>
@@ -124,6 +126,7 @@
 <translation id="5623402015214259806">{0,plural, =0{May available na update sa Chromium}=1{May available na update sa Chromium}one{# araw nang may available na update sa Chromium}other{# na araw nang may available na update sa Chromium}}</translation>
 <translation id="5631814766731275228">pangalan at larawan sa Chromium</translation>
 <translation id="5634636535844844681">Kailangan ng Chromium ng Windows 7 o mas bago.</translation>
+<translation id="5653831366781983928">Paki-restart ang Chromium ngayon</translation>
 <translation id="5680901439334282664">mag-sign in sa Chromium</translation>
 <translation id="5698481217667032250">Ipakita ang Chromium sa wikang ito</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
@@ -166,6 +169,7 @@
 <translation id="6734080038664603509">I-update ang &amp;Chromium</translation>
 <translation id="6734291798041940871">Naka-install na ang Chromium para sa lahat ng user sa iyong computer.</translation>
 <translation id="6810143991807788455">Tumulong na pahusayin ang Chromium sa pamamagitan ng pag-uulat sa mga kasalukuyang setting</translation>
+<translation id="6847869444787758381">Ipinapaalam sa iyo ng Chromium kung nakompromiso ang mga password mo</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (kinopya sa Chromium)</translation>
 <translation id="6868056391275687737">May tumatakbong iba pang kopya ng Chromium. Para i-update, isara ang mga ito.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 159d0a7..1129ee4 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -90,6 +90,8 @@
 <translation id="4230135487732243613">आपके क्रोमियम डेटा को इस खाते से लिंक करें?</translation>
 <translation id="4271805377592243930">क्रोमियम के लिए सहायता पाएं</translation>
 <translation id="4285930937574705105">अनिर्दिष्ट कारण से इंस्‍टॉलेशन विफल हुआ. अगर Google Chrome अभी खुला हुआ है, तो कृपया उसे बंद करें और फिर से प्रयास करें.</translation>
+<translation id="4371648796594901282">'क्रोमियम OS' की जानकारी के लिए, कृपया <ph name="LINK_BEGIN" />
+      'क्रोमियम OS' के बारे में<ph name="LINK_END" /> देखें</translation>
 <translation id="4407044323746248786">फिर भी क्रोमियम से बाहर निकलें?</translation>
 <translation id="4415566066719264597">क्रोमियम को बैकग्राउंड में चलने दें</translation>
 <translation id="4423735387467980091">क्रोमियम को पसंद के मुताबिक बनाएं और नियंत्रित करें</translation>
@@ -122,6 +124,7 @@
 <translation id="5623402015214259806">{0,plural, =0{क्रोमियम का एक अपडेट उपलब्ध है}=1{क्रोमियम का एक अपडेट उपलब्ध है}one{क्रोमियम का एक अपडेट # दिनों से उपलब्ध है}other{क्रोमियम का एक अपडेट # दिनों से उपलब्ध है}}</translation>
 <translation id="5631814766731275228">क्रोमियम पर नाम और तस्वीर</translation>
 <translation id="5634636535844844681">क्रोमियम के लिए Windows 7 या उसके बाद के वर्शन की आवश्यकता होती है.</translation>
+<translation id="5653831366781983928">कृपया 'क्रोमियम' को अभी रीस्टार्ट करें</translation>
 <translation id="5680901439334282664">क्रोमियम में साइन इन करें</translation>
 <translation id="5698481217667032250">क्रोमियम को इस भाषा में दिखाएं</translation>
 <translation id="5820394555380036790">क्रोमियम OS</translation>
@@ -164,6 +167,7 @@
 <translation id="6734080038664603509">क्रोमियम अपडेट करें</translation>
 <translation id="6734291798041940871">आपके कंप्यूटर पर मौजूद सभी उपयोगकर्ताओं के लिए क्रोमियम पहले से इंस्टॉल है.</translation>
 <translation id="6810143991807788455">वर्तमान सेटिंग की रिपोर्ट करके क्रोमियम को बेहतर बनाने में सहायता करें</translation>
+<translation id="6847869444787758381">'क्रोमियम' यह बताता है कि कहीं आपके पासवर्ड का गलत इस्तेमाल तो नहीं किया गया है</translation>
 <translation id="6857782730669500492">क्रोमियम - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (क्रोमियम पर कॉपी किया गया)</translation>
 <translation id="6868056391275687737">क्रोमियम की दूसरी कॉपी चल रही हैं. अपडेट करने के लिए उन्हें बंद करें.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 6fe81f2..03f56fa 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -92,6 +92,8 @@
 <translation id="4230135487732243613">Chromium 데이터를 이 계정에 연결하시겠습니까?</translation>
 <translation id="4271805377592243930">Chromium 도움말 보기</translation>
 <translation id="4285930937574705105">확인되지 않은 오류로 설치에 실패했습니다. Chromium이 실행 중인 경우 종료한 후 다시 실행하세요.</translation>
+<translation id="4371648796594901282">Chromium OS에 관한 자세한 내용은 <ph name="LINK_BEGIN" />
+      Chromium OS 소개<ph name="LINK_END" />를 참조하세요.</translation>
 <translation id="4407044323746248786">Chromium을 종료하시겠습니까?</translation>
 <translation id="4415566066719264597">백그라운드에서 Chromium을 실행</translation>
 <translation id="4423735387467980091">Chromium 맞춤설정 및 제어</translation>
@@ -124,6 +126,7 @@
 <translation id="5623402015214259806">{0,plural, =0{Chromium 업데이트 출시}=1{Chromium 업데이트 출시}other{Chromium 업데이트가 출시된 지 #일 지남}}</translation>
 <translation id="5631814766731275228">Chromium 이름 및 사진</translation>
 <translation id="5634636535844844681">Chromium은 Windows 7 이상 버전에서 사용할 수 있습니다.</translation>
+<translation id="5653831366781983928">지금 Chromium을 다시 시작하세요</translation>
 <translation id="5680901439334282664">Chromium에 로그인</translation>
 <translation id="5698481217667032250">이 언어로 Chromium 표시</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
@@ -166,6 +169,7 @@
 <translation id="6734080038664603509">Chromium 업데이트</translation>
 <translation id="6734291798041940871">모든 사용자가 사용할 수 있도록 컴퓨터에 Chromium이 이미 설치되어 있습니다.</translation>
 <translation id="6810143991807788455">현재 설정을 보고하여 Chromium 개선에 참여</translation>
+<translation id="6847869444787758381">비밀번호가 유출되면 Chromium에서 알려줍니다.</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay(Chromium에 복사됨)</translation>
 <translation id="6868056391275687737">다른 Chromium 버전이 실행 중입니다. 업데이트하려면 실행 중인 버전을 종료하세요.</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index 5e330dc..c9389fb 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -4,7 +4,7 @@
 <translation id="1065672644894730302">तुमची प्राधान्ये वाचता आली नाहीत.
 काही वैशिष्‍ट्ये अनुपलब्ध असू शकतात आणि प्राधान्यांमधील बदल सेव्ह केले जाणार नाहीत.</translation>
 <translation id="1104942323762546749">Chromium ला तुमचे पासवर्ड निर्यात करायचे आहेत. हे करू देण्यासाठी तुमचा Windows पासवर्ड टाइप करा.</translation>
-<translation id="1115445892567829615">Chromium तुमचा डेटा सिंक करू शकले नाही. कृपया तुमचे सिंक पासफ्रेज अपडेट करा.</translation>
+<translation id="1115445892567829615">Chromium तुमचा डेटा सिंक करू शकले नाही. कृपया तुमची सिंक पासफ्रेज अपडेट करा.</translation>
 <translation id="113122355610423240">Chromium तुमचा डीफॉल्ट ब्राउझर आहे</translation>
 <translation id="1170115874949214249">तुमच्या फोनवर Chromium इंस्टॉल करा. आम्ही तुमच्या खाते रिकव्हरी फोन नंबरवर एक SMS पाठवू.</translation>
 <translation id="1174473354587728743">कॉंप्युटर शेअर करायचा? तुम्हाला आवडते त्या प्रकारे तुम्ही Chromium सेट करू शकता.</translation>
@@ -17,7 +17,7 @@
 <translation id="1668054258064581266">Chromium वरून तुमचे खाते काढल्यानंतर, प्रभावी होण्यासाठी तुम्हाला तुमचे उघडे टॅब रीलोड करण्याची आवश्यकता असू शकते.</translation>
 <translation id="1688750314291223739">वेबवर तुमची पर्सनलाइझ केलेली ब्राउझर वैशिष्ट्ये सेव्ह करण्यासाठी सिंक सेट करा आणि कोणत्याही कॉंप्युटरवरील Chromium वरून ते अॅक्सेस करा.</translation>
 <translation id="1708666629004767631">Chromium ची नवीन, सुरक्षित आवृत्ती उपलब्ध आहे.</translation>
-<translation id="1766096484055239003">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावी यासाठी तुम्ही Chrome पुन्हा लाँच करण्याची आवश्यकता आहे</translation>
+<translation id="1766096484055239003">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावी यासाठी तुम्ही Chrome पुन्हा लाँच करणे अावश्यक आहे</translation>
 <translation id="1774152462503052664">Chromium बॅकग्राउंडमध्ये चालू द्या</translation>
 <translation id="1779356040007214683">Chromium अधिक सुरक्षित बनविण्‍यासाठी, आम्‍ही <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> मध्‍ये सूचीबद्ध नसलेले आणि आपल्‍या माहिती शिवाय कदाचित जोडले गेलेले काही विस्‍तार अक्षम केले.</translation>
 <translation id="1808667845054772817">Chromium पुनर्स्थापित करा</translation>
@@ -154,7 +154,7 @@
 <translation id="6434250628340475518">Chromium OS सिस्टम</translation>
 <translation id="6457450909262716557">{SECONDS,plural, =1{Chromium १ सेकंदात रीस्टार्ट होईल}other{Chromium # सेकंदांत रीस्टार्ट होईल}}</translation>
 <translation id="6475912303565314141">तुम्ही Chromium सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
-<translation id="6485906693002546646">तुम्ही तुमची Chromium सामग्री सिंक करण्यासाठी <ph name="PROFILE_EMAIL" /> वापरत आहात. तुमचे सिंक प्राधान्य अपडेट करण्यासाठी किंवा Google खाते न सोडता Chromium वापरण्यासाठी, <ph name="SETTINGS_LINK" /> ला भेट द्या.</translation>
+<translation id="6485906693002546646">तुम्ही तुमचा Chromium आशय सिंक करण्यासाठी <ph name="PROFILE_EMAIL" /> वापरत आहात. तुमचे सिंक प्राधान्य अपडेट करण्यासाठी किंवा Google खाते न सोडता Chromium वापरण्यासाठी, <ph name="SETTINGS_LINK" /> ला भेट द्या.</translation>
 <translation id="6510925080656968729">Chromium अनइंस्टॉल करा</translation>
 <translation id="6570579332384693436">शब्दलेखनाच्या चुकांमध्ये सुधारणा करण्यासाठी Chromium तुम्ही मजकूर भागामध्ये टाइप केलेला मजकूर Google ला पाठवते</translation>
 <translation id="6598877126913850652">Chromium च्या सूचना सेटिंग्जमध्ये जा</translation>
@@ -173,7 +173,7 @@
 <translation id="6970811910055250180">तुमचे डिव्हाइस अपडेट करीत आहे...</translation>
 <translation id="6990124437352146030">या साइटसाठी Chromium ला तुमचा मायक्रोफोन अॅक्सेस करण्याची परवानगी हवी आहे</translation>
 <translation id="705851970750939768">Chromium अपडेट करा</translation>
-<translation id="7066436765290594559">Chromium OS तुमचा डेटा सिंक करू शकले नाही. कृपया तुमचा सिंक सांकेतिक पासफ्रेझ अपडेट करा.</translation>
+<translation id="7066436765290594559">Chromium OS तुमचा डेटा सिंक करू शकले नाही. कृपया तुमची सिंक सांकेतिक पासफ्रेज अपडेट करा.</translation>
 <translation id="7067091210845072982">इमेजचे उपयोगी वर्णन नसल्यास, Chromium तुमच्यासाठी ते देण्याचा प्रयत्न करेल. वर्णने तयार करण्यासाठी, इमेज Google ला पाठवल्या जातात.</translation>
 <translation id="7196312274710523067">Chromium लाँच करता आले नाही. पुन्हा प्रयत्न करा.</translation>
 <translation id="7205698830395646142">Chromium मेनूमध्‍ये लपवा</translation>
@@ -195,6 +195,8 @@
 <translation id="753534427205733210">{0,plural, =1{Chromium एका मिनिटामध्ये पुन्हा लॉंच होईल}other{Chromium # मिनिटांमध्ये पुन्हा लाँच होईल}}</translation>
 <translation id="7549178288319965365">Chromium OS बद्दल</translation>
 <translation id="7561906087460245826">तसेच Chromium (<ph name="URL" />) वरील डेटा साफ करा</translation>
+<translation id="7585853947355360626">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" />
+      Chromium OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation>
 <translation id="761356813943268536">Chromium तुमचा कॅमेरा आणि मायक्रोफोन वापरत आहे.</translation>
 <translation id="7617377681829253106">Chromium आता उत्कृष्ट झाले आहे</translation>
 <translation id="7686590090926151193">Chromium तुमचा डीफॉल्ट ब्राउझर नाही</translation>
@@ -228,6 +230,8 @@
 <translation id="8619360774459241877">Chromium लाँच करत आहे...</translation>
 <translation id="8621669128220841554">नमूद न केलेल्या एररमुळे स्थापना अयशस्वी झाली. कृपया Chromium पुन्‍हा डाउनलोड करा.</translation>
 <translation id="8667808506758191620">तुमचे <ph name="DEVICE_TYPE" /> अद्ययावत आहे.</translation>
+<translation id="8682540261359803721">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" />
+      Chromium ब्राउझर सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation>
 <translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
 <translation id="8704119203788522458">हे तुमचे Chromium आहे</translation>
 <translation id="8739167630197873875">तुम्ही Chromium बंद करता तेव्हा कुकी साफ करता. सिंक करणे सुरू ठेवण्यासाठी, हे <ph name="COOKIE_SETTINGS_LINK" /> बदला.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index a35d991..1b53f01 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -4296,7 +4296,6 @@
 <translation id="7371006317849674875">የሚጀምርበት ጊዜ</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">በሚንቀሳቀስበት ጊዜ የመዳፊት ጠቋሚን አድምቅ</translation>
-<translation id="7377169924702866686">Caps Lock በርቷል።</translation>
 <translation id="7377451353532943397">የዳሳሽ መዳረሻን ማገዱን ቀጥል</translation>
 <translation id="7378627244592794276">አይ</translation>
 <translation id="73786666777299047">Chrome የድር መደብርን ይክፈቱ</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">አገልጋይ አይገኝም።</translation>
 <translation id="8391218455464584335">ቪኒል</translation>
 <translation id="8391712576156218334">ምስል ሊገኝ አይችልም። ቆይተው እንደገና ይሞክሩ።</translation>
-<translation id="8392234662362215700">የቁልፍ ሰሌዳ አቀማመጥን ለመቀየር Control-Shift-Space ይምቱ።</translation>
 <translation id="8392364544846746346">አንድ ጣቢያ በመሣሪያዎ ላይ ፋይሎችን ወይም አቃፊዎችን ማርትዕ ሲፈልግ ይጠይቅ</translation>
 <translation id="8392451568018454956">የ<ph name="USER_EMAIL_ADDRESS" /> አማራጮች ምናሌ</translation>
 <translation id="8393511274964623038">ተሰኪውን አቁም</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">ሌላ የብሉቱዝ ደህንነት ቁልፍ አክል</translation>
 <translation id="8656768832129462377">አታረጋግጥ</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> የእርስዎን ማያ ገጽ እና ኦዲዮ ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation>
-<translation id="8659875081143553823">አንዴ ይጠብቁ</translation>
 <translation id="8660174278198826384">ከእርስዎ ድርጅት የመሣሪያ አስተዳዳሪውን ያነጋግሩ</translation>
 <translation id="8661290697478713397">አገናኙን ማን&amp;ነትን በማያሳውቅ መስኮት ክፈት</translation>
 <translation id="8662671328352114214">የ<ph name="TYPE" /> አውታረ መረብን ይቀላቀሉ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index ea85af3..3fa0009 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4298,7 +4298,6 @@
 <translation id="7371006317849674875">وقت البدء</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">تمييز مؤشر الماوس عندما يتحرك</translation>
-<translation id="7377169924702866686">‏مفتاح Caps Lock في وضع التشغيل.</translation>
 <translation id="7377451353532943397">مواصلة حظر إمكانية الوصول إلى أجهزة الاستشعار</translation>
 <translation id="7378627244592794276">لا</translation>
 <translation id="73786666777299047">‏فتح سوق Chrome الإلكتروني</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">الخادم غير متاح.</translation>
 <translation id="8391218455464584335">أسطوانة موسيقية</translation>
 <translation id="8391712576156218334">الصورة غير متاحة. يُرجى إعادة المحاولة لاحقًا.</translation>
-<translation id="8392234662362215700">‏انقر على Control-Shift-Space لتبديل تخطيط لوحة المفاتيح.</translation>
 <translation id="8392364544846746346">طلب الإذن عند محاولة موقع إلكتروني تعديل الملفات والمجلدات على أجهزتك</translation>
 <translation id="8392451568018454956">قائمة الخيارات لـ <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">إيقاف المكون الإضافي</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">إضافة مفتاح أمان بلوتوث آخر</translation>
 <translation id="8656768832129462377">عدم التحقق</translation>
 <translation id="8658645149275195032">يشارك <ph name="APP_NAME" /> الشاشة والصوت من خلال <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">لحظة من فضلك</translation>
 <translation id="8660174278198826384">يُرجى التواصل مع مشرف الجهاز لمؤسستك.</translation>
 <translation id="8661290697478713397">ف&amp;تح رابط في نافذة التصفح المتخفي</translation>
 <translation id="8662671328352114214">الانضمام إلى شبكة <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 8c1d024..13d3dfd 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Начален час</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Открояване на курсора на мишката, когато се движи</translation>
-<translation id="7377169924702866686">„Caps Lock“ е включен.</translation>
 <translation id="7377451353532943397">Достъпът до сензорите да продължи да се блокира</translation>
 <translation id="7378627244592794276">Не</translation>
 <translation id="73786666777299047">Отваряне на уеб магазина на Chrome</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Няма достъп до сървъра.</translation>
 <translation id="8391218455464584335">Грамофонна плоча</translation>
 <translation id="8391712576156218334">Изображението не е налице. Опитайте отново по-късно.</translation>
-<translation id="8392234662362215700">Натиснете „Control-Shift-интервал“ за превключване на клавиатурната подредба.</translation>
 <translation id="8392364544846746346">Извеждане на запитване, когато сайт иска да редактира файлове или папки на устройството ви</translation>
 <translation id="8392451568018454956">Меню с опции за <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Спиране на приставката</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Добавяне на друг ключ за сигурност с Bluetooth</translation>
 <translation id="8656768832129462377">Без проверка</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> споделя екрана и звука ви с/ъс „<ph name="TAB_NAME" />“.</translation>
-<translation id="8659875081143553823">Една секунда</translation>
 <translation id="8660174278198826384">Обърнете се към администратора на устройства за организацията си</translation>
 <translation id="8661290697478713397">Отваряне на връзката в прозорец при използване на функ&amp;цията „инкогнито“</translation>
 <translation id="8662671328352114214">Присъединяване към <ph name="TYPE" /> мрежа</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 83f5eafd..e43cebf 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">শুরুর সময়</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">মাউস কার্সারটি যখন নড়াচড়া করে তখন একে হাইলাইট করুন</translation>
-<translation id="7377169924702866686">Caps Lock চালু আছে৷</translation>
 <translation id="7377451353532943397">সেন্সর অ্যাক্সেস ব্লক করা চালিয়ে যান</translation>
 <translation id="7378627244592794276">না</translation>
 <translation id="73786666777299047">Chrome ওয়েব স্টোর খুলুন</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">সার্ভার অনুপলব্ধ৷</translation>
 <translation id="8391218455464584335">ভিনাইল</translation>
 <translation id="8391712576156218334">ইমেজ এখন উপলভ্য নয়। পরে আবার চেষ্টা করুন।</translation>
-<translation id="8392234662362215700">কীবোর্ড লেআউট স্যুইচ করতে Control-Shift-Space</translation>
 <translation id="8392364544846746346">কোনও সাইট আপনার ডিভাইসে থাকা ফাইল বা ফোল্ডার এডিট করতে চাইলে অনুমতি নিতে বলুন</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> এর জন্য বিকল্পগুলির মেনু</translation>
 <translation id="8393511274964623038">প্লাগ-ইন বন্ধ করুন</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">অন্য একটি ব্লুটুথ নিরাপত্তা কী যোগ করুন</translation>
 <translation id="8656768832129462377">চেক করবেন না</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> এর সঙ্গে আপনার স্ক্রিন এবং অডিও শেয়ার করছে।</translation>
-<translation id="8659875081143553823">একটু অপেক্ষা করুন</translation>
 <translation id="8660174278198826384">আপনার সংস্থার ডিভাইস অ্যাডমিনের সাথে যোগাযোগ করুন</translation>
 <translation id="8661290697478713397">লিঙ্কটি ছদ্মবেশী উইন্ডোতে খুলুন</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> নেটওয়ার্কে সংযুক্ত হন</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 96cb334..baca7a6f 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -2506,7 +2506,7 @@
 <translation id="4722920479021006856"><ph name="APP_NAME" /> comparteix la vostra pantalla.</translation>
 <translation id="4724450788351008910">Ha canviat l'afiliació</translation>
 <translation id="4725511304875193254">Corgi</translation>
-<translation id="4725851834065990915">La teva contrasenya ha quedat al descobert a causa de la violació de les dades en un lloc web o una aplicació que fas servir. Chrome et recomana que comprovis les contrasenyes desades.</translation>
+<translation id="4725851834065990915">La teva contrasenya ha quedat exposada a causa de la violació de les dades en un lloc web o una aplicació que fas servir. Chrome et recomana que comprovis les contrasenyes desades.</translation>
 <translation id="4726710629007580002">S'han produït advertiments en provar d'instal·lar aquesta extensió:</translation>
 <translation id="4727847987444062305">Sessió de convidat gestionada</translation>
 <translation id="4728558894243024398">Plataforma</translation>
@@ -3912,7 +3912,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> no pot executar-se com a arrel.</translation>
 <translation id="6812841287760418429">Mantén els canvis</translation>
 <translation id="6817174620439930047">Pregunta'm quan un lloc web vulgui utilitzar els missatges exclusius del sistema per accedir a dispositius MIDI (opció recomanada)</translation>
-<translation id="6819440013020405090">La teva contrasenya ha quedat al descobert a causa de la violació de les dades en un lloc web o una aplicació que fas servir. Chrome et recomana que comprovis les contrasenyes desades i que canviïs la contrasenya del lloc web <ph name="ORIGIN" />.</translation>
+<translation id="6819440013020405090">La teva contrasenya ha quedat exposada a causa de la violació de les dades en un lloc web o una aplicació que fas servir. Chrome et recomana que comprovis les contrasenyes desades i que canviïs la contrasenya del lloc web <ph name="ORIGIN" />.</translation>
 <translation id="682123305478866682">Emet l'escriptori</translation>
 <translation id="6823506025919456619">Inicieu la sessió a Chrome per poder veure els vostres dispositius</translation>
 <translation id="6824564591481349393">Copi&amp;a l'adreça electrònica</translation>
@@ -4299,7 +4299,6 @@
 <translation id="7371006317849674875">Hora d'inici</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Destaca el cursor del ratolí quan es mogui</translation>
-<translation id="7377169924702866686">Bloq Maj està activat.</translation>
 <translation id="7377451353532943397">Continua bloquejant l'accés als sensors</translation>
 <translation id="7378627244592794276">No</translation>
 <translation id="73786666777299047">Obre Chrome Web Store</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">El servidor no està disponible.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">La imatge no està disponible. Torna-ho a provar més tard.</translation>
-<translation id="8392234662362215700">Premeu Ctrl+Maj+espai per canviar la disposició del teclat.</translation>
 <translation id="8392364544846746346">Pregunta'm quan un lloc web vulgui editar els fitxers o les carpetes del dispositiu</translation>
 <translation id="8392451568018454956">Menú d'opcions per a <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Atura el connector</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">Afegeix una altra clau de seguretat per Bluetooth</translation>
 <translation id="8656768832129462377">No els comprovis</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> està compartint la pantalla i l'àudio amb <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Un moment</translation>
 <translation id="8660174278198826384">Contacta amb l'administrador del dispositiu de la teva organització</translation>
 <translation id="8661290697478713397">Obre l'enllaç en una finestra d'incò&amp;gnit</translation>
 <translation id="8662671328352114214">Connecta't a una xarxa <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 7df3a33c..36ea227 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -4298,7 +4298,6 @@
 <translation id="7371006317849674875">Čas zahájení</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Zvýraznit ukazatel myši, když se pohybuje.</translation>
-<translation id="7377169924702866686">Caps Lock je zapnutý.</translation>
 <translation id="7377451353532943397">I nadále blokovat přístup k senzorům</translation>
 <translation id="7378627244592794276">Ne</translation>
 <translation id="73786666777299047">Otevřít Internetový obchod Chrome</translation>
@@ -5004,7 +5003,6 @@
 <translation id="8390449457866780408">Server není dostupný.</translation>
 <translation id="8391218455464584335">Vinyl</translation>
 <translation id="8391712576156218334">Vybraný obrázek není k dispozici. Zkuste to znovu později.</translation>
-<translation id="8392234662362215700">Rozložení klávesnice přepnete stisknutím kláves Ctrl + Shift + mezerník.</translation>
 <translation id="8392364544846746346">Zeptat se, když chce web upravit soubory nebo složky v zařízení</translation>
 <translation id="8392451568018454956">Nabídka možností pro uživatele <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ukončit plugin</translation>
@@ -5175,7 +5173,6 @@
 <translation id="8656619792520327915">Přidat další bezpečnostní klíč Bluetooth</translation>
 <translation id="8656768832129462377">Nekontrolovat</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> sdílí vaši obrazovku a zvuk s kartou <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Chviličku prosím počkejte</translation>
 <translation id="8660174278198826384">Kontaktujte správce zařízení své organizace</translation>
 <translation id="8661290697478713397">Otevřít odkaz v &amp;anonymním okně</translation>
 <translation id="8662671328352114214">Připojení k síti <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 86dfa261..3fa38db 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Starttidspunkt</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Fremhæv musemarkøren, når den bevæger sig</translation>
-<translation id="7377169924702866686">Caps Lock er slået til.</translation>
 <translation id="7377451353532943397">Fortsæt blokering af adgang til sensorer</translation>
 <translation id="7378627244592794276">Nej</translation>
 <translation id="73786666777299047">Åbn Chrome Webshop</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Serveren er utilgængelig.</translation>
 <translation id="8391218455464584335">Vinylplade</translation>
 <translation id="8391712576156218334">Billedet er ikke tilgængeligt. Prøv igen senere.</translation>
-<translation id="8392234662362215700">Tryk på Ctrl+Shift+mellemrumstasten for at skifte tastaturlayout.</translation>
 <translation id="8392364544846746346">Spørg, når et website vil redigere filer eller mapper på din enhed</translation>
 <translation id="8392451568018454956">Menuen Indstillinger for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Stop plugin</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Tilføj en anden Bluetooth-sikkerhedsnøgle</translation>
 <translation id="8656768832129462377">Undlad at kontrollere</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> deler din skærm og lyd med <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Vent et øjeblik</translation>
 <translation id="8660174278198826384">Kontakt enhedsadministratoren for din organisation</translation>
 <translation id="8661290697478713397">Åbn link i inko&amp;gnitovindue</translation>
 <translation id="8662671328352114214">Opret forbindelse til <ph name="TYPE" />-netværk</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 17398ec8..c36310f 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -4296,7 +4296,6 @@
 <translation id="7371006317849674875">Startzeit</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Mauszeiger bei Bewegung hervorheben</translation>
-<translation id="7377169924702866686">Feststelltaste An</translation>
 <translation id="7377451353532943397">Zugriff auf den Sensor weiterhin blockieren</translation>
 <translation id="7378627244592794276">Nein</translation>
 <translation id="73786666777299047">Chrome Web Store öffnen</translation>
@@ -5002,7 +5001,6 @@
 <translation id="8390449457866780408">Der Server ist nicht verfügbar.</translation>
 <translation id="8391218455464584335">Schallplatte</translation>
 <translation id="8391712576156218334">Bild ist nicht verfügbar. Versuchen Sie es später noch einmal.</translation>
-<translation id="8392234662362215700">Drücken Sie Strg + Umschalttaste + Leertaste, um das Tastaturlayout zu ändern.</translation>
 <translation id="8392364544846746346">Nachfragen, wenn eine Website Dateien oder Ordner auf meinem Gerät bearbeiten möchte</translation>
 <translation id="8392451568018454956">Optionsmenü für <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Plug-in anhalten</translation>
@@ -5173,7 +5171,6 @@
 <translation id="8656619792520327915">Weiteren Sicherheitsschlüssel hinzufügen</translation>
 <translation id="8656768832129462377">Nicht überprüfen</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> teilt Bildschirm und Audio mit <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Bitte warten</translation>
 <translation id="8660174278198826384">Wenden Sie sich an den Geräteadministrator Ihrer Organisation</translation>
 <translation id="8661290697478713397">Link in Inko&amp;gnito-Fenster öffnen</translation>
 <translation id="8662671328352114214">In <ph name="TYPE" />-Netzwerk einwählen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index d03c848..ff74d41 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Ώρα έναρξης</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Επισήμανση του δείκτη του ποντικιού όταν κινείται</translation>
-<translation id="7377169924702866686">Το Caps Lock είναι ενεργοποιημένο.</translation>
 <translation id="7377451353532943397">Να συνεχιστεί ο αποκλεισμός της πρόσβασης στους αισθητήρες</translation>
 <translation id="7378627244592794276">Όχι</translation>
 <translation id="73786666777299047">Άνοιγμα του Chrome Web Store</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">Ο διακομιστής δεν είναι διαθέσιμος.</translation>
 <translation id="8391218455464584335">Βινύλιο</translation>
 <translation id="8391712576156218334">Η εικόνα δεν είναι διαθέσιμη. Δοκιμάστε ξανά αργότερα.</translation>
-<translation id="8392234662362215700">Πατήστε Control-Shift-Space για εναλλαγή διάταξης πληκτρολογίου.</translation>
 <translation id="8392364544846746346">Να γίνεται ερώτηση όταν ένας ιστότοπος θέλει να επεξεργαστεί αρχεία ή φακέλους στη συσκευή σας</translation>
 <translation id="8392451568018454956">Μενού επιλογών για τη διεύθυνση <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Διακοπή προσθήκης</translation>
@@ -5179,7 +5177,6 @@
 <translation id="8656619792520327915">Προσθήκη άλλου κλειδιού ασφαλείας Bluetooth</translation>
 <translation id="8656768832129462377">Να μην ελέγχεται</translation>
 <translation id="8658645149275195032">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται την οθόνη και τον ήχο σας με την καρτέλα <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Περιμένετε μια στιγμή</translation>
 <translation id="8660174278198826384">Επικοινωνήστε με τον διαχειριστή συσκευής του οργανισμού σας</translation>
 <translation id="8661290697478713397">Άνοιγμα Συνδέσμου σε Παράθυρο Ανών&amp;υμης Περιήγησης</translation>
 <translation id="8662671328352114214">Συμμετοχή στο δίκτυο <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 4552a0f..3292cfdb 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Start time</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Highlight the mouse cursor when it's moving</translation>
-<translation id="7377169924702866686">Caps Lock is on.</translation>
 <translation id="7377451353532943397">Continue blocking sensor access</translation>
 <translation id="7378627244592794276">Nope</translation>
 <translation id="73786666777299047">Open Chrome Web Store</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Server unavailable.</translation>
 <translation id="8391218455464584335">Vinyl</translation>
 <translation id="8391712576156218334">Image is unavailable. Try again later.</translation>
-<translation id="8392234662362215700">Tap Control-Shift-Space to switch keyboard layout.</translation>
 <translation id="8392364544846746346">Ask when a site wants to edit files or folders on your device</translation>
 <translation id="8392451568018454956">Options menu for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Stop plug-in</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Add another Bluetooth security key</translation>
 <translation id="8656768832129462377">Do not check</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> is sharing your screen and audio with <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Just a sec</translation>
 <translation id="8660174278198826384">Contact the device admin for your organisation</translation>
 <translation id="8661290697478713397">Open Link in Inco&amp;gnito Window</translation>
 <translation id="8662671328352114214">Join <ph name="TYPE" /> network</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 283808d51..9a692159 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -4297,7 +4297,6 @@
 <translation id="7371006317849674875">Hora de inicio</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Resaltar el cursor del mouse cuando se mueve</translation>
-<translation id="7377169924702866686">Bloq Mayús está activado.</translation>
 <translation id="7377451353532943397">Seguir bloqueando el acceso a los sensores</translation>
 <translation id="7378627244592794276">No</translation>
 <translation id="73786666777299047">Abrir Chrome Web Store</translation>
@@ -5004,7 +5003,6 @@
 <translation id="8390449457866780408">El servidor no está disponible.</translation>
 <translation id="8391218455464584335">Vinilo</translation>
 <translation id="8391712576156218334">La imagen no está disponible. Vuelve a intentarlo más tarde.</translation>
-<translation id="8392234662362215700">Presiona Control-Mayúscula-Espacio para cambiar el diseño del teclado.</translation>
 <translation id="8392364544846746346">Preguntar cuando un sitio quiera editar archivos o carpetas de tu dispositivo</translation>
 <translation id="8392451568018454956">Menú de opciones para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Detener el complemento</translation>
@@ -5175,7 +5173,6 @@
 <translation id="8656619792520327915">Agregar otra llave de seguridad Bluetooth</translation>
 <translation id="8656768832129462377">No revisar</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> comparte tu pantalla y audio con <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Un momento</translation>
 <translation id="8660174278198826384">Comunícate con el administrador de dispositivos de tu organización</translation>
 <translation id="8661290697478713397">Abrir el vínculo en una ventana de incó&amp;gnito</translation>
 <translation id="8662671328352114214">Unirse a la red <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 4026f71f..2f244e2 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -4299,7 +4299,6 @@
 <translation id="7371006317849674875">Hora de inicio</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Resaltar el cursor del ratón al moverlo</translation>
-<translation id="7377169924702866686">El bloqueo de mayúsculas está activado.</translation>
 <translation id="7377451353532943397">Seguir bloqueando el acceso a los sensores</translation>
 <translation id="7378627244592794276">No</translation>
 <translation id="73786666777299047">Abrir Chrome Web Store</translation>
@@ -5006,7 +5005,6 @@
 <translation id="8390449457866780408">Servidor no disponible</translation>
 <translation id="8391218455464584335">Vinilo</translation>
 <translation id="8391712576156218334">La imagen no está disponible. Inténtalo de nuevo más tarde.</translation>
-<translation id="8392234662362215700">Pulsa Control+Mayús+Espacio para cambiar de diseño de teclado.</translation>
 <translation id="8392364544846746346">Preguntar cuando un sitio web quiera editar archivos o carpetas que haya en tu dispositivo</translation>
 <translation id="8392451568018454956">Menú de opciones de <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Detener complemento</translation>
@@ -5177,7 +5175,6 @@
 <translation id="8656619792520327915">Añadir otra llave de seguridad Bluetooth</translation>
 <translation id="8656768832129462377">No comprobar</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> está compartiendo la pantalla y el audio con <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Un segundo</translation>
 <translation id="8660174278198826384">Ponte en contacto con el administrador de dispositivos de tu organización</translation>
 <translation id="8661290697478713397">Abrir enlace en una ventana de incó&amp;gnito</translation>
 <translation id="8662671328352114214">Unirse a una red <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 4e854a2..de708be 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Algusaeg</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Tõsta hiirekursor esile, kui see liigub</translation>
-<translation id="7377169924702866686">Suurtähelukk on sisse lülitatud.</translation>
 <translation id="7377451353532943397">Blokeeri ka edaspidi juurdepääs anduritele</translation>
 <translation id="7378627244592794276">Ei</translation>
 <translation id="73786666777299047">Ava Chrome'i veebipood</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Server ei ole saadaval.</translation>
 <translation id="8391218455464584335">Vinüül</translation>
 <translation id="8391712576156218334">Pilt pole saadaval. Proovige hiljem uuesti.</translation>
-<translation id="8392234662362215700">Klaviatuuripaigutuse vahetamiseks vajutage korraga juhtklahvi, tõstuklahvi ja tühikut.</translation>
 <translation id="8392364544846746346">Küsi, kui sait soovib seadmes olevaid faile või kaustasid muuta</translation>
 <translation id="8392451568018454956">Konto <ph name="USER_EMAIL_ADDRESS" /> valikute menüü</translation>
 <translation id="8393511274964623038">Peata pistikprogramm</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Lisa veel üks Bluetoothi turvavõti</translation>
 <translation id="8656768832129462377">Ära kontrolli</translation>
 <translation id="8658645149275195032">Rakendus <ph name="APP_NAME" /> jagab teie ekraani ja heli vahelehega <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Oodake pisut</translation>
 <translation id="8660174278198826384">Võtke ühendust oma organisatsiooni seadmete administraatoriga</translation>
 <translation id="8661290697478713397">Ava link inko&amp;gnito aknas</translation>
 <translation id="8662671328352114214"><ph name="TYPE" />-võrguga liitumine</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 59c3b57..8c4d0eb 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -4297,7 +4297,6 @@
 <translation id="7371006317849674875">زمان شروع</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">برجسته کردن نشانگر موشواره هنگامی که حرکت می‌کند</translation>
-<translation id="7377169924702866686">‏Caps Lock روشن است.</translation>
 <translation id="7377451353532943397">دسترسی به حسگر همچنان مسدود شود</translation>
 <translation id="7378627244592794276">نه</translation>
 <translation id="73786666777299047">‏باز کردن نت‌بازار Chrome</translation>
@@ -5004,7 +5003,6 @@
 <translation id="8390449457866780408">سرور در دسترس نیست.</translation>
 <translation id="8391218455464584335">صفحه گرامافون</translation>
 <translation id="8391712576156218334">تصویر دردسترس نیست. بعداً دوباره امتحان کنید.</translation>
-<translation id="8392234662362215700">‏برای تغییر طرح کلی صفحه‌کلید، Control-Shift و فاصله را فشار دهید.</translation>
 <translation id="8392364544846746346">وقتی سایتی می‌خواهد فایل‌ها یا پوشه‌های دستگاه را ویرایش کند سؤال شود</translation>
 <translation id="8392451568018454956">منوی گزینه‌ها برای <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">توقف افزایه</translation>
@@ -5175,7 +5173,6 @@
 <translation id="8656619792520327915">افزودن کلید امنیتی بلوتوث دیگر</translation>
 <translation id="8656768832129462377">بررسی نکنید</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> درحال اشتراک‌گذاری صفحه و صوت شما با <ph name="TAB_NAME" /> است.</translation>
-<translation id="8659875081143553823">لحظه‌ای صبر کنید</translation>
 <translation id="8660174278198826384">با سرپرست دستگاه سازمانتان تماس بگیرید</translation>
 <translation id="8661290697478713397">باز کردن پیوند در پنجره حالت &amp;ناشناس</translation>
 <translation id="8662671328352114214">پیوستن به شبکه <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 5725145..8145a6f 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4299,7 +4299,6 @@
 <translation id="7371006317849674875">Aloitusaika</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Korosta hiiren osoitinta, kun se liikkuu</translation>
-<translation id="7377169924702866686">Caps Lock on päällä.</translation>
 <translation id="7377451353532943397">Estä edelleen tunnistimien käyttö</translation>
 <translation id="7378627244592794276">Ei</translation>
 <translation id="73786666777299047">Avaa Chrome Web Store</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">Palvelin ei ole käytettävissä.</translation>
 <translation id="8391218455464584335">Vinyyli</translation>
 <translation id="8391712576156218334">Kuva ei ole saatavilla. Yritä myöhemmin uudelleen.</translation>
-<translation id="8392234662362215700">Vaihda näppäimistöasettelua painamalla Control + Shift + välilyönti.</translation>
 <translation id="8392364544846746346">Pyydä lupaa, kun sivusto haluaa muokata laitteen tiedostoja tai kansioita</translation>
 <translation id="8392451568018454956">Tilin <ph name="USER_EMAIL_ADDRESS" /> vaihtoehtovalikko</translation>
 <translation id="8393511274964623038">Pysäytä laajennus</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">Lisää toinen Bluetooth-suojausavain</translation>
 <translation id="8656768832129462377">Älä tarkista</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> jakaa näyttösi ja äänesi välilehdelle <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Odota hetki</translation>
 <translation id="8660174278198826384">Ota yhteyttä organisaatiosi laitteiden järjestelmänvalvojaan</translation>
 <translation id="8661290697478713397">Avaa linkki inco&amp;gnito-ikkunassa</translation>
 <translation id="8662671328352114214">Liity <ph name="TYPE" />-verkkoon</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 008788f..80c9040 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -479,6 +479,7 @@
 <translation id="1698122934742150150">Kasalukuyang incognito na session lang</translation>
 <translation id="1698650002254827833">Hindi ma-load ang listahan ng mga app. Pakisubukang muli.</translation>
 <translation id="1701062906490865540">Alisin ang taong ito</translation>
+<translation id="1703331064825191675">Huwag nang mag-alala sa iyong mga password</translation>
 <translation id="1706586824377653884">Idinagdag ng iyong administrator</translation>
 <translation id="1706625117072057435">Mga antas ng pag-zoom</translation>
 <translation id="1708338024780164500">(Hindi aktibo)</translation>
@@ -528,6 +529,7 @@
 <translation id="1764226536771329714">beta</translation>
 <translation id="176587472219019965">&amp;Bagong Window</translation>
 <translation id="1766575458646819543">Umalis sa full screen</translation>
+<translation id="1766957085594317166">I-save ang mga password nang secure sa iyong Google Account, at hindi mo na kakailanganin pang i-type muli ang mga ito</translation>
 <translation id="1768278914020124551">Oops!  Nagkaproblema sa pakikipag-ugnayan sa server ng pag-log on. Pakisuri ang iyong koneksyon sa network at ang domain name, pagkatapos ay subukang muli.</translation>
 <translation id="1769104665586091481">Buksan ang Link sa Bagong &amp;Window</translation>
 <translation id="1773212559869067373">Lokal na tinanggihan ang certificate ng pagpapatunay</translation>
@@ -1875,6 +1877,7 @@
 <translation id="3748026146096797577">Hindi Nakakonekta</translation>
 <translation id="3752582316358263300">OK...</translation>
 <translation id="3752673729237782832">Aking mga device</translation>
+<translation id="3753033997400164841">I-store nang isang beses. Gamitin kahit saan</translation>
 <translation id="3755411799582650620">Maaari na rin ngayong i-unlock ng iyong <ph name="PHONE_NAME" /> ang <ph name="DEVICE_TYPE" /> na ito.</translation>
 <translation id="375636864092143889">Ginagamit ng site ang iyong mikropono</translation>
 <translation id="3757733214359997190">Walang nakitang site</translation>
@@ -2207,6 +2210,7 @@
 <translation id="4232375817808480934">I-configure ang Kerberos</translation>
 <translation id="4235200303672858594">Buong screen</translation>
 <translation id="4235965441080806197">Kanselahin ang pag-sign in</translation>
+<translation id="4242145785130247982">Hindi sinusuportahan ang maraming certificate ng client</translation>
 <translation id="4242533952199664413">Buksan ang mga setting</translation>
 <translation id="4242577469625748426">Nabigong i-install ang mga setting ng patakaran sa device: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Maghanap ng higit pang app ng stylus</translation>
@@ -2665,6 +2669,7 @@
 <translation id="4957949153200969297">Ang mga feature lang na nauugnay sa <ph name="IDS_SHORT_PRODUCT_NAME" /> Sync ang ie-enable</translation>
 <translation id="4959262764292427323">Sine-save ang mga password sa iyong Google Account para magamit mo ang mga ito sa anumang device</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation>
+<translation id="496185450405387901">Na-install ang app na ito ng iyong administrator.</translation>
 <translation id="4964455510556214366">Kaayusan</translation>
 <translation id="4964673849688379040">Sinusuri...</translation>
 <translation id="4965808351167763748">Sigurado ka bang gusto mong i-set up ang device na ito upang patakbuhin ang Hangouts Meet?</translation>
@@ -2922,6 +2927,7 @@
 <translation id="5360150013186312835">Ipakita sa Toolbar</translation>
 <translation id="5362741141255528695">Piliin ang file ng private na key.</translation>
 <translation id="5363109466694494651">I-Powerwash at I-revert</translation>
+<translation id="5365716706805792666">Matitingnan ng Google kung bahagi ng paglabag sa data ang iyong mga password. Io-on ito kapag nag-sign in ka gamit ang iyong Gogle Account.</translation>
 <translation id="5365881113273618889">Naglalaman ng mga sensitibong file ang pinili mong folder. Sigurado ka bang gusto mong bigyan ang "<ph name="APP_NAME" />" ng permanenteng access sa pag-write sa folder na ito?</translation>
 <translation id="5367091008316207019">Binabasa ang file..</translation>
 <translation id="5368720394188453070">Naka-lock ang iyong telepono. I-unlock ito upang makapasok.</translation>
@@ -3874,6 +3880,7 @@
 <translation id="6769712124046837540">Idinaragdag ang printer...</translation>
 <translation id="6770664076092644100">I-verify sa pamamagitan ng NFC</translation>
 <translation id="6771503742377376720">Ay isang Certificate Authority</translation>
+<translation id="6775163072363532304">Lalabas dito ang mga available na device.</translation>
 <translation id="6777817260680419853">Na-block ang pag-redirect</translation>
 <translation id="6778737459546443941">Hindi pa ito inaaprubahan ng iyong magulang</translation>
 <translation id="677965093459947883">Napakaliit</translation>
@@ -4293,7 +4300,6 @@
 <translation id="7371006317849674875">Oras ng pagsisimula</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">I-highlight ang cursor ng mouse kapag gumagalaw ito</translation>
-<translation id="7377169924702866686">Naka-on ang Caps Lock.</translation>
 <translation id="7377451353532943397">Patuloy na i-block ang access sa sensor</translation>
 <translation id="7378627244592794276">Hindi</translation>
 <translation id="73786666777299047">Buksan ang Chrome Web Store</translation>
@@ -4334,6 +4340,7 @@
 <translation id="7441830548568730290">Iba pang mga user</translation>
 <translation id="7442465037756169001">Handa nang ma-set up ang iyong Hangouts Meet hardware.</translation>
 <translation id="744341768939279100">Gumawa ng bagong profile</translation>
+<translation id="7443806024147773267">I-access ang iyong mga password kapag naka-sign in ka sa Google Account mo</translation>
 <translation id="7444046173054089907">Naka-block ang site na ito</translation>
 <translation id="7444983668544353857">Huwag paganahin <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Awtomatikong nag-i-install ng mga app</translation>
@@ -4747,6 +4754,7 @@
 <translation id="8014154204619229810">Kasalukuyang tumatakbo ang updater. I-refresh pagkatapos ng isang minuto upang muling suriin.</translation>
 <translation id="8014206674403687691">Hindi ma-revert ang <ph name="IDS_SHORT_PRODUCT_NAME" /> sa dating naka-install na bersyon. Pakisubukang muli upang i-Powerwash ang iyong device.</translation>
 <translation id="8014210335923519270">Pahusayin ang <ph name="IDS_SHORT_PRODUCT_NAME" /> at ang seguridad nito sa pamamagitan ng pagpapadala ng impormasyon at paggamit ng system sa Google</translation>
+<translation id="8015780634880457457">Matitingnan ng Google kung bahagi ng paglabag sa data ang iyong mga password</translation>
 <translation id="8016266267177410919">Pansamantalang storage</translation>
 <translation id="8017335670460187064"><ph name="LABEL" /></translation>
 <translation id="8017679124341497925">Na-edit ang shortcut</translation>
@@ -4865,6 +4873,7 @@
 <translation id="8188389033983459049">Suriin ang mga setting ng iyong device at i-on ito para magpatuloy</translation>
 <translation id="8190193592390505034">Kumukonekta sa <ph name="PROVIDER_NAME" /></translation>
 <translation id="8191230140820435481">Pamahalaan ang iyong apps, mga extension, at tema</translation>
+<translation id="819464600477418284">Hindi puwedeng i-uninstall ang app na ito dahil bahagi ito ng Chrome OS.</translation>
 <translation id="8195027750202970175">Sukat sa disk</translation>
 <translation id="8198323535106903877">Ii-install namin ang <ph name="NUMBER_OF_APPS" /> (na) app iyon para sa iyo</translation>
 <translation id="8199300056570174101">Mga property ng Network (Serbisyo) at Device</translation>
@@ -4925,6 +4934,7 @@
     <ph name="BEGIN_PARAGRAPH2" />Kapag na-off ang feature na ito, hindi maaapektuhan ang kakayahan ng device na ito na ipadala ang impormasyong kinakailangan para sa mahahalagang serbisyo gaya ng mga pag-update ng system at seguridad.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Makokontrol ng may-ari ang feature na ito mula sa Mga Setting &gt; Advanced &gt; Awtomatikong ipadala sa Google ang data ng diagnostic at paggamit.<ph name="END_PARAGRAPH3" />
     <ph name="BEGIN_PARAGRAPH4" />Kung naka-on ang karagdagang Aktibidad sa Web at App para sa iyong anak, maaaring ma-save ang data na ito sa kanyang Google Account. Matuto pa tungkol sa mga setting na ito at kung paano isaayos ang mga ito sa families.google.com.<ph name="END_PARAGRAPH4" /></translation>
+<translation id="826905130698769948">Di-wasto ang certificate ng client</translation>
 <translation id="8270242299912238708">Mga dokumentong PDF</translation>
 <translation id="827097179112817503">Ipakita ang button ng home</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Na-delete ang 1 bookmark}one{Na-delete ang # bookmark}other{Na-delete ang # na bookmark}}</translation>
@@ -4996,7 +5006,6 @@
 <translation id="8390449457866780408">Hindi available ang server.</translation>
 <translation id="8391218455464584335">Vinyl</translation>
 <translation id="8391712576156218334">Hindi available ang larawan. Subukang muli sa ibang pagkakataon.</translation>
-<translation id="8392234662362215700">Pindutin ang Control-Shift-Space upang magpalit ng layout ng keyboard.</translation>
 <translation id="8392364544846746346">Itanong kapag gusto ng site na mag-edit ng mga file o folder sa iyong device</translation>
 <translation id="8392451568018454956">Menu ng mga pagpipilian para sa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ihinto ang plugin</translation>
@@ -5168,7 +5177,6 @@
 <translation id="8656619792520327915">Magdagdag ng isa pang Bluetooth security key</translation>
 <translation id="8656768832129462377">Huwag suriin</translation>
 <translation id="8658645149275195032">Ibinabahagi ng <ph name="APP_NAME" /> ang iyong screen at audio sa <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Sandali lang</translation>
 <translation id="8660174278198826384">Makipag-ugnayan sa admin ng device para sa iyong organisasyon</translation>
 <translation id="8661290697478713397">Buksan ang link sa Inco&amp;gnito Window</translation>
 <translation id="8662671328352114214">Sumali sa <ph name="TYPE" /> network</translation>
@@ -5340,6 +5348,7 @@
 <translation id="8874184842967597500">Hindi nakakonekta</translation>
 <translation id="8876307312329369159">Hindi mababago ang setting na ito sa demo session.</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
+<translation id="8879220587046205278">Puwedeng mangailangan ang mga app mula sa Google Play ng kumpletong access sa system ng file para mag-read at mag-write ng mga file sa mga external na storage device. Nakikita ng sinumang gumagamit ng external na device ang mga file at folder na ginawa sa device.</translation>
 <translation id="8879284080359814990">&amp;Ipakita Bilang Tab</translation>
 <translation id="8879921471468674457">Tandaan ang impormasyon sa pag-sign in</translation>
 <translation id="8881020143150461183">Pakisubukan ulit. Para sa technical support, makipag-ugnayan sa <ph name="CARRIER_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index ab45324a..7fef62c 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Heure de début</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Mettre en surbrillance le curseur de la souris lorsqu'il se déplace</translation>
-<translation id="7377169924702866686">La touche de verrouillage des majuscules est activée</translation>
 <translation id="7377451353532943397">Continuer de bloquer l'accès aux capteurs</translation>
 <translation id="7378627244592794276">Non</translation>
 <translation id="73786666777299047">Ouvrir le Chrome Web Store</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">Serveur indisponible.</translation>
 <translation id="8391218455464584335">Vinyle</translation>
 <translation id="8391712576156218334">L'image n'est pas disponible. Réessayez plus tard.</translation>
-<translation id="8392234662362215700">Appuyez sur Ctrl+Maj+Espace pour changer la disposition du clavier.</translation>
 <translation id="8392364544846746346">Vous demander lorsqu'un site souhaite modifier des fichiers ou des dossiers sur votre appareil</translation>
 <translation id="8392451568018454956">Menu "Options" de l'adresse e-mail <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Arrêter le plug-in</translation>
@@ -5179,7 +5177,6 @@
 <translation id="8656619792520327915">Ajouter une clé de sécurité Bluetooth</translation>
 <translation id="8656768832129462377">Ne pas vérifier</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> partage votre écran et un contenu audio avec <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Une petite seconde…</translation>
 <translation id="8660174278198826384">Contactez l'administrateur de l'appareil au sein de votre organisation</translation>
 <translation id="8661290697478713397">Ouvrir le lien dans la fenêtre de navi&amp;gation privée</translation>
 <translation id="8662671328352114214">Rejoindre le réseau <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 9c58480..e7c6f8a 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -4298,7 +4298,6 @@
 <translation id="7371006317849674875">પ્રારંભ સમય</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">માઉસ કર્સર જ્યારે ગતિમાન હોય ત્યારે તેને હાઇલાઇટ કરો</translation>
-<translation id="7377169924702866686">Caps Lock ચાલુ છે.</translation>
 <translation id="7377451353532943397">સેન્સર ઍક્સેસ બ્લૉક કરવાનું ચાલુ રાખો</translation>
 <translation id="7378627244592794276">ના</translation>
 <translation id="73786666777299047">Chrome વેબ દુકાન ખોલો</translation>
@@ -4999,7 +4998,6 @@
 <translation id="8390449457866780408">સર્વર અનુપલબ્ધ.</translation>
 <translation id="8391218455464584335">વિનાઇલ</translation>
 <translation id="8391712576156218334">છબી અનુપલબ્ધ. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation>
-<translation id="8392234662362215700">કીબોર્ડ લેઆઉટ સ્વિચ કરવા માટે Control-Shift-Space દબાવો</translation>
 <translation id="8392364544846746346">કોઈ સાઇટ તમારા ડિવાઇસમાંની ફાઇલો કે ફોલ્ડરોમાં ફેરફાર કરવા માગે ત્યારે પૂછવામાં આવે</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> માટે વિકલ્પો મેનૂ</translation>
 <translation id="8393511274964623038">પ્લગિન રોકો</translation>
@@ -5170,7 +5168,6 @@
 <translation id="8656619792520327915">બ્લૂટૂથનો બીજો સુરક્ષા કોડ ઉમેરો</translation>
 <translation id="8656768832129462377">તપાસ કરશો નહીં</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> સાથે તમારી સ્ક્રીન અને ઑડિઓને શેર કરી રહી છે.</translation>
-<translation id="8659875081143553823">બસ એક જ સેકંડ</translation>
 <translation id="8660174278198826384">તમારી સંસ્થાનાં ડિવાઇસ વ્યવસ્થાપકનો સંપર્ક કરો</translation>
 <translation id="8661290697478713397">છુ&amp;પી વિંડોમાં લિંક ખોલો</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> નેટવર્કમાં જોડાઓ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index d93fa0938..ae359447 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -479,6 +479,7 @@
 <translation id="1698122934742150150">केवल वर्तमान गुप्त सत्र</translation>
 <translation id="1698650002254827833">ऐप्लिकेशन की सूची लोड नहीं हो सकी. कृपया फिर से कोशिश करें.</translation>
 <translation id="1701062906490865540">इस व्यक्ति को निकालें</translation>
+<translation id="1703331064825191675">अपने पासवर्ड की फ़िक्र छोड़ दें</translation>
 <translation id="1706586824377653884">आपके व्यवस्थापक ने जोड़ा</translation>
 <translation id="1706625117072057435">ज़ूम स्तर</translation>
 <translation id="1708338024780164500">(प्रयोग में नहीं)</translation>
@@ -528,6 +529,7 @@
 <translation id="1764226536771329714">बीटा</translation>
 <translation id="176587472219019965">&amp;नई विंडो</translation>
 <translation id="1766575458646819543">फ़ुल-स्क्रीन से बाहर निकलें</translation>
+<translation id="1766957085594317166">पासवर्ड को अपने Google खाते में सुरक्षित रूप से सेव करें. इसके बाद आपको कभी उन्हें दोबारा टाइप नहीं करना होगा</translation>
 <translation id="1768278914020124551">ओह!  लॉगऑन सर्वर से संपर्क करने में समस्या हुई. कृपया अपना नेटवर्क कनेक्शन और डोमेन नाम जाँचें, और दोबारा कोशिश करें.</translation>
 <translation id="1769104665586091481">नई &amp;विंडो में लिंक खोलें</translation>
 <translation id="1773212559869067373">प्रमाणीकरण प्रमाणपत्र को स्थानीय रूप से अस्वीकार कर दिया गया</translation>
@@ -1875,6 +1877,7 @@
 <translation id="3748026146096797577">कनेक्ट नहीं है</translation>
 <translation id="3752582316358263300">ठीक है...</translation>
 <translation id="3752673729237782832">मेरे डिवाइस</translation>
+<translation id="3753033997400164841">एक बार सेव करें. हर जगह इस्तेमाल करें</translation>
 <translation id="3755411799582650620">आपका <ph name="PHONE_NAME" /> अब इस <ph name="DEVICE_TYPE" /> को भी अनलॉक कर सकता है.</translation>
 <translation id="375636864092143889">साइट आपका माइक्रोफ़ोन इस्तेमाल कर रही है</translation>
 <translation id="3757733214359997190">कोई साइट नहीं मिली</translation>
@@ -2206,6 +2209,7 @@
 <translation id="4232375817808480934">Kerberos कॉन्फ़िगर करें</translation>
 <translation id="4235200303672858594">संपूर्ण स्क्रीन</translation>
 <translation id="4235965441080806197">साइन इन रद्द करें</translation>
+<translation id="4242145785130247982">एक से ज़्यादा क्लाइंट प्रमाणपत्र काम नहीं करते</translation>
 <translation id="4242533952199664413">सेटिंग खोलें</translation>
 <translation id="4242577469625748426">डिवाइस पर नीति सेटिंग इंस्टॉल करने में विफल रहा: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">और ज़्यादा स्टाइलस ऐप ढूंढें</translation>
@@ -2664,6 +2668,7 @@
 <translation id="4957949153200969297">सिर्फ़ उन्हीं सुविधाओं को चालू करें जो <ph name="IDS_SHORT_PRODUCT_NAME" /> सिंक से जुड़ी हैं</translation>
 <translation id="4959262764292427323">पासवर्ड आपके Google खाते में सेव किए जाते हैं ताकि आप किसी भी डिवाइस पर उनका इस्तेमाल कर सकें</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation>
+<translation id="496185450405387901">इस ऐप्लिकेशन को आपके एडमिन ने इंस्टॉल किया है.</translation>
 <translation id="4964455510556214366">व्यवस्था</translation>
 <translation id="4964673849688379040">जाँच कर रहा है...</translation>
 <translation id="4965808351167763748">क्या आप वाकई Hangouts Meet चलाने के लिए इस डिवाइस को सेट अप करना चाहते हैं?</translation>
@@ -2921,6 +2926,7 @@
 <translation id="5360150013186312835">टूलबार में दिखाएं</translation>
 <translation id="5362741141255528695">निजी कुंजी फ़ाइल को चुनें.</translation>
 <translation id="5363109466694494651">पावरवॉश करें और वापस लाएं</translation>
+<translation id="5365716706805792666">Google यह जांच कर सकता है कि आपके पासवर्ड डेटा का उल्लंघन कर रहे थे या नहीं. जब आप अपने Google खाते से साइन इन करेंगे, तब इसे चालू कर दिया जाएगा.</translation>
 <translation id="5365881113273618889">आपने जो फ़ोल्डर चुना है उसमें संवेदनशील फ़ाइलें हैं. क्या आप वाकई "<ph name="APP_NAME" />" को इस फ़ोल्डर में लिखने का ऐक्सेस हमेशा के लिए देना चाहते हैं?</translation>
 <translation id="5367091008316207019">फ़ाइल पढ़ी जा रही है..</translation>
 <translation id="5368720394188453070">आपका फ़ोन लॉक हो गया है. प्रवेश करने के लिए उसे अनलॉक करें.</translation>
@@ -3873,6 +3879,7 @@
 <translation id="6769712124046837540">प्रिंटर जोड़ा जा रहा है...</translation>
 <translation id="6770664076092644100">NFC के ज़रिए पुष्टि करें</translation>
 <translation id="6771503742377376720">एक प्रमाणन प्राधिकरण है</translation>
+<translation id="6775163072363532304">उपलब्ध डिवाइस यहां दिखाई देंगे.</translation>
 <translation id="6777817260680419853">रीडायरेक्ट ब्लॉक किया गया</translation>
 <translation id="6778737459546443941">आपके अभिभावक ने अभी तक इसकी अनुमति नहीं दी है</translation>
 <translation id="677965093459947883">बहुत छोटा</translation>
@@ -4292,7 +4299,6 @@
 <translation id="7371006317849674875">शुरू करने का समय</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">माउस कर्सर के हिलने पर उसे हाइलाइट करें</translation>
-<translation id="7377169924702866686">Caps Lock चालू है.</translation>
 <translation id="7377451353532943397">सेंसर का ऐक्सेस ब्लॉक करते रहें</translation>
 <translation id="7378627244592794276">नहीं</translation>
 <translation id="73786666777299047">Chrome वेब स्टोर खोलें</translation>
@@ -4333,6 +4339,7 @@
 <translation id="7441830548568730290">अन्य उपयोगकर्ता</translation>
 <translation id="7442465037756169001">आपका Hangouts Meet hardware सेट अप किए जाने के लिए तैयार है.</translation>
 <translation id="744341768939279100">नई प्रोफ़ाइल बनाएं</translation>
+<translation id="7443806024147773267">अपने Google खाते में साइन इन करके जब चाहें अपने पासवर्ड को ऐक्सेस करें</translation>
 <translation id="7444046173054089907">यह साइट अवरोधित है</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> बंद करें</translation>
 <translation id="7448430327655618736">ऐप्लिकेशन को अपने आप इंस्टॉल करें</translation>
@@ -4745,6 +4752,7 @@
 <translation id="8014154204619229810">अपडेटर वर्तमान में चल रहा है. फिर से देखने के लिए एक मिनट में रीफ्रेश करें.</translation>
 <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> पूर्व में इंस्‍टॉल किए गए संस्‍करण को वापस लाने में समर्थ नहीं है. कृपया फिर से अपने डिवाइस को पावरवॉश करके देखें.</translation>
 <translation id="8014210335923519270">Google को सिस्टम जानकारी और इस्तेमाल का डेटा भेजकर <ph name="IDS_SHORT_PRODUCT_NAME" /> और उसकी सुरक्षा को बेहतर बनाएं</translation>
+<translation id="8015780634880457457">Google यह जांच कर सकता है कि आपके पासवर्ड डेटा का उल्लंघन कर रहे थे या नहीं</translation>
 <translation id="8016266267177410919">अस्थायी जगह</translation>
 <translation id="8017335670460187064"><ph name="LABEL" /></translation>
 <translation id="8017679124341497925">शॉर्टकट में बदलाव किया गया</translation>
@@ -4863,6 +4871,7 @@
 <translation id="8188389033983459049">अपनी डिवाइस सेटिंग जांचें और जारी रखने के लिए उसे चालू करें</translation>
 <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> से कनेक्‍ट हो रहा है</translation>
 <translation id="8191230140820435481">अपने ऐप्स , एक्सटेंशन, और थीम प्रबंधित करें</translation>
+<translation id="819464600477418284">इस ऐप्लिकेशन को अनइंस्टॉल नहीं किया जा सकता, क्योंकि यह Chrome OS का हिस्सा है.</translation>
 <translation id="8195027750202970175">डिस्क पर आकार</translation>
 <translation id="8198323535106903877">हम आपके लिए वे <ph name="NUMBER_OF_APPS" /> ऐप्लिकेशन इंस्टॉल करेंगे</translation>
 <translation id="8199300056570174101">नेटवर्क (सेवा) और डिवाइस प्रॉपर्टी</translation>
@@ -4923,6 +4932,7 @@
     <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>
+<translation id="826905130698769948">अमान्य क्लाइंट प्रमाणपत्र</translation>
 <translation id="8270242299912238708">PDF दस्तावेज़</translation>
 <translation id="827097179112817503">होम बटन दिखाएं</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 बुकमार्क हटाया गया}one{# बुकमार्क हटाए गए}other{# बुकमार्क हटाए गए}}</translation>
@@ -4994,7 +5004,6 @@
 <translation id="8390449457866780408">सर्वर अनुपलब्‍ध है.</translation>
 <translation id="8391218455464584335">विनाइल</translation>
 <translation id="8391712576156218334">इमेज उपलब्ध नहीं है. बाद में फिर से कोशिश करें.</translation>
-<translation id="8392234662362215700">कीबोर्ड लेआउट बदलने के लिए Control-Shift-Space दबाएं.</translation>
 <translation id="8392364544846746346">जब कोई वेबसाइट आपके डिवाइस की किसी फ़ाइल या फ़ोल्डर में बदलाव करना चाहे, तो इसके लिए पूछें</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> के लिए विकल्प मेन्यू</translation>
 <translation id="8393511274964623038">प्लग-इन रोकें</translation>
@@ -5165,7 +5174,6 @@
 <translation id="8656619792520327915">एक और ब्लूटूथ 'सुरक्षा चाबी' जोड़ें</translation>
 <translation id="8656768832129462377">जाँच न करें</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ आपकी स्क्रीन और ऑडियो को शेयर कर रहा है.</translation>
-<translation id="8659875081143553823">बस एक सेकंड</translation>
 <translation id="8660174278198826384">अपने संगठन के डिवाइस एडमिन से संपर्क करें</translation>
 <translation id="8661290697478713397">लिंक को गुप्त&amp; विंडो में खोलें</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> नेटवर्क में शामिल हों</translation>
@@ -5336,6 +5344,7 @@
 <translation id="8874184842967597500">कनेक्ट नहीं है</translation>
 <translation id="8876307312329369159">यह सेटिंग किसी डेमो सत्र में बदली नहीं जा सकती है.</translation>
 <translation id="8877448029301136595">[मूल निर्देशिका]</translation>
+<translation id="8879220587046205278">Google Play के ऐप्लिकेशन को फ़ाइल सिस्टम के ऐक्सेस की ज़रूरत पड़ सकती है, ताकि वे बाहरी स्टोरेज वाले डिवाइस पर मौजूद फ़ाइलों पर लिख पाएं और उन्हें पढ़ पाएं. डिवाइस पर बनाई गई फ़ाइलों और फ़ोल्डर को बाहरी डिस्क का इस्तेमाल करने वाला कोई भी व्यक्ति देख सकता है.</translation>
 <translation id="8879284080359814990">टैब के रूप में &amp;दिखाएं</translation>
 <translation id="8879921471468674457">साइन इन की जानकारी याद रखें</translation>
 <translation id="8881020143150461183">कृपया फिर से कोशिश करें. तकनीकी सहायता के लिए <ph name="CARRIER_NAME" /> से संपर्क करें.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index cec53c9..07b1af2 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Vrijeme početka</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Istakni pokazivač miša kada se kreće</translation>
-<translation id="7377169924702866686">Uključena je opcija Caps Lock.</translation>
 <translation id="7377451353532943397">Nastavi blokirati pristup senzorima</translation>
 <translation id="7378627244592794276">Ne</translation>
 <translation id="73786666777299047">Otvori Chrome web-trgovinu</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Poslužitelj nije dostupan.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">Slika nije dostupna. Pokušajte ponovo kasnije.</translation>
-<translation id="8392234662362215700">Pritisnite Control, Shift i razmaknicu za promjenu rasporeda tipkovnice.</translation>
 <translation id="8392364544846746346">Prikaži upit kada web-lokacija želi urediti datoteke ili mape na uređaju</translation>
 <translation id="8392451568018454956">Izbornik opcija za korisnika <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Zaustavi dodatak</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Dodajte neki drugi Bluetooth sigurnosni ključ</translation>
 <translation id="8656768832129462377">Nemoj provjeravati</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> dijeli zaslon i zvuk s karticom <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Samo tren</translation>
 <translation id="8660174278198826384">Obratite se administratoru uređaja vaše organizacije</translation>
 <translation id="8661290697478713397">Otvori vezu u anoni&amp;mnom prozoru</translation>
 <translation id="8662671328352114214">Pridruži se mreži <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 4cf2dc7..7bc14c97 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Kezdés ideje</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Az egérmutató kiemelése mozgás közben</translation>
-<translation id="7377169924702866686">A Caps Lock be van kapcsolva.</translation>
 <translation id="7377451353532943397">Érzékelő-hozzáférés tiltásának fenntartása</translation>
 <translation id="7378627244592794276">Nem</translation>
 <translation id="73786666777299047">A Chrome Internetes áruház megnyitása</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">A szerver nem érhető el.</translation>
 <translation id="8391218455464584335">Bakelitlemez</translation>
 <translation id="8391712576156218334">A kép nem hozzáférhető. Próbálja újra később.</translation>
-<translation id="8392234662362215700">A Control + Shift + szóköz billentyűk megnyomásával válthat a billentyűzetkiosztások között.</translation>
 <translation id="8392364544846746346">Kérdezzen rá, ha valamelyik webhely módosítani szeretné az eszközén található fájlokat vagy mappákat</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> beállításainak menüje</translation>
 <translation id="8393511274964623038">Beépülő modul leállítása</translation>
@@ -5179,7 +5177,6 @@
 <translation id="8656619792520327915">Másik bluetooth-os biztonsági hardverkulcs hozzáadása</translation>
 <translation id="8656768832129462377">Ne ellenőrizze</translation>
 <translation id="8658645149275195032">A(z) <ph name="APP_NAME" /> megosztja a képernyőt és a hangot a következővel: <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Egy pillanat…</translation>
 <translation id="8660174278198826384">Forduljon szervezete eszközrendszergazdájához</translation>
 <translation id="8661290697478713397">Link megnyitása inko&amp;gnitóablakban</translation>
 <translation id="8662671328352114214">Csatlakozás <ph name="TYPE" />-hálózatra</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index f59434e..222ba0b 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4298,7 +4298,6 @@
 <translation id="7371006317849674875">Waktu mulai</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Sorot kursor mouse saat kursor berpindah</translation>
-<translation id="7377169924702866686">Caps Lock aktif.</translation>
 <translation id="7377451353532943397">Terus blokir akses sensor</translation>
 <translation id="7378627244592794276">Tidak</translation>
 <translation id="73786666777299047">Buka Chrome Webstore</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">Server tidak tersedia.</translation>
 <translation id="8391218455464584335">Piringan hitam</translation>
 <translation id="8391712576156218334">Gambar tidak tersedia. Coba lagi nanti.</translation>
-<translation id="8392234662362215700">Tekan Control-Shift-Space untuk mengubah tata letak keyboard.</translation>
 <translation id="8392364544846746346">Tanyakan saat situs ingin mengedit file atau folder di perangkat Anda</translation>
 <translation id="8392451568018454956">Menu opsi untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Hentikan plugin</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">Tambahkan kunci keamanan Bluetooth lainnya</translation>
 <translation id="8656768832129462377">Jangan periksa</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> membagikan layar dan audio Anda dengan <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Tunggu sebentar</translation>
 <translation id="8660174278198826384">Hubungi admin perangkat untuk organisasi Anda</translation>
 <translation id="8661290697478713397">Buka Tautan di Jendela Penya&amp;maran</translation>
 <translation id="8662671328352114214">Bergabung dengan jaringan <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 3decd529..1c4be82 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -4299,7 +4299,6 @@
 <translation id="7371006317849674875">Ora di inizio</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Evidenzia il puntatore del mouse durante lo spostamento</translation>
-<translation id="7377169924702866686">La funzione Bloc maiusc è attiva.</translation>
 <translation id="7377451353532943397">Continua a impedire l'accesso ai sensori</translation>
 <translation id="7378627244592794276">No</translation>
 <translation id="73786666777299047">Apri Chrome Web Store</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">Server non disponibile.</translation>
 <translation id="8391218455464584335">Vinile</translation>
 <translation id="8391712576156218334">Immagine non disponibile. Riprova più tardi.</translation>
-<translation id="8392234662362215700">Premi CTRL + MAIUSC + barra spaziatrice per cambiare il layout della tastiera.</translation>
 <translation id="8392364544846746346">Chiedi conferma quando un sito vuole modificare file o cartelle sul dispositivo</translation>
 <translation id="8392451568018454956">Menu Opzioni per <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Interrompi plug-in</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">Aggiungi un altro token di sicurezza Bluetooth</translation>
 <translation id="8656768832129462377">Non verificare</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> condivide l'audio e il tuo schermo con <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Attendi un secondo</translation>
 <translation id="8660174278198826384">Contatta l'amministratore dei dispositivi della tua organizzazione</translation>
 <translation id="8661290697478713397">Apri link in finestra di navigazione in inco&amp;gnito</translation>
 <translation id="8662671328352114214">Aggiungi la rete <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 916bbf2..22140ca 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4297,7 +4297,6 @@
 <translation id="7371006317849674875">שעת התחלה</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">הדגש את סמן העכבר כשהסמן בתנועה</translation>
-<translation id="7377169924702866686">‏Caps Lock מופעל.</translation>
 <translation id="7377451353532943397">המשך חסימת הגישה לחיישנים</translation>
 <translation id="7378627244592794276">לא</translation>
 <translation id="73786666777299047">‏פתח את חנות האינטרנט של Chrome</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">השרת אינו זמין.</translation>
 <translation id="8391218455464584335">וייניל</translation>
 <translation id="8391712576156218334">התמונה לא זמינה. צריך לנסות שוב מאוחר יותר.</translation>
-<translation id="8392234662362215700">‏כדי להחליף את פריסת המקלדת, הקש על Control‏-Shift-מקש הרווח.</translation>
 <translation id="8392364544846746346">תוצג שאלה כשאתר ירצה לערוך קבצים או תיקיות במכשיר שלך</translation>
 <translation id="8392451568018454956">תפריט אפשרויות עבור <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">הפסק את הפלאגין</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">‏הוספה של מפתח אבטחה אחר בחיבור Bluetooth</translation>
 <translation id="8656768832129462377">אל תבדוק</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> משתף את המסך והאודיו שלך עם <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">רק רגע</translation>
 <translation id="8660174278198826384">יש לפנות אל מנהל המכשירים בארגון</translation>
 <translation id="8661290697478713397">פתח קישור בחלון &amp;נסתר</translation>
 <translation id="8662671328352114214">התחברות לרשת <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 8cbd490..39d1c4b 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -4300,8 +4300,6 @@
 <translation id="7371006317849674875">開始時間</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">移動時にマウスカーソルを強調表示する</translation>
-<translation id="7377169924702866686">CapsLock 
-がオンになっています。</translation>
 <translation id="7377451353532943397">センサーへのアクセスを引き続きブロックする</translation>
 <translation id="7378627244592794276">いいえ</translation>
 <translation id="73786666777299047">Chrome ウェブストアを開きます</translation>
@@ -5008,7 +5006,6 @@
 <translation id="8390449457866780408">サーバーを使用できません。</translation>
 <translation id="8391218455464584335">レコード</translation>
 <translation id="8391712576156218334">画像を利用できません。しばらくしてからもう一度お試しください。</translation>
-<translation id="8392234662362215700">キーボードのレイアウトを切り替えるには Ctrl+Shift+Space を押してください。</translation>
 <translation id="8392364544846746346">サイトがデバイスのファイルやフォルダを編集しようとしたときに確認する</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> のオプション メニュー</translation>
 <translation id="8393511274964623038">プラグインを停止</translation>
@@ -5179,7 +5176,6 @@
 <translation id="8656619792520327915">別の Bluetooth セキュリティ キーを追加</translation>
 <translation id="8656768832129462377">確認しない</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> が <ph name="TAB_NAME" /> の画面と音声を共有しています。</translation>
-<translation id="8659875081143553823">少々お待ちください</translation>
 <translation id="8660174278198826384">あなたの組織のデバイスの管理者にお問い合わせください</translation>
 <translation id="8661290697478713397">シークレット ウインドウでリンクを開く(&amp;G)</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> ネットワークへの接続</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 3c1ca3b..d6a2189 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -4304,7 +4304,6 @@
 <translation id="7371006317849674875">ಪ್ರಾರಂಭ ಸಮಯ</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">ಮೌಸ್ ಕರ್ಸರ್ ಅನ್ನು ಸರಿಸುವಾಗ ಹೈಲೈಟ್ ಮಾಡಿ</translation>
-<translation id="7377169924702866686">CAPS LOCK ಆನ್ ಆಗಿದೆ.</translation>
 <translation id="7377451353532943397">ಸೆನ್ಸರ್‌ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
 <translation id="7378627244592794276">ಬೇಡ</translation>
 <translation id="73786666777299047">Chrome ವೆಬ್‌ ಸ್ಟೋರ್ ತೆರೆಯಿರಿ</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">ಸರ್ವರ್ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="8391218455464584335">ವಿನೈಲ್</translation>
 <translation id="8391712576156218334">ಚಿತ್ರ ಲಭ್ಯವಿಲ್ಲ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="8392234662362215700">ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಬದಲಾಯಿಸಲು Control-Shift-Space ಒತ್ತಿರಿ.</translation>
 <translation id="8392364544846746346">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿನ ಫೈಲ್‌ಗಳು ಅಥವಾ ಫೋಲ್ಡರ್‌ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಲು ಸೈಟ್ ಬಯಸಿದಾಗ ಕೇಳಿ</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> ಅವರಿಗಾಗಿ ಆಯ್ಕೆಗಳ ಮೆನು</translation>
 <translation id="8393511274964623038">ಪ್ಲಗ್-ಇನ್ ನಿಲ್ಲಿಸಿ</translation>
@@ -5181,7 +5179,6 @@
 <translation id="8656619792520327915">ಮತ್ತೊಂದು ಬ್ಲೂಟೂತ್ ಸುರಕ್ಷತಾ ಕೀಯನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="8656768832129462377">ಪರಿಶೀಲಿಸಬೇಡ</translation>
 <translation id="8658645149275195032"><ph name="TAB_NAME" /> ಜೊತೆಗೆ ನಿಮ್ಮ ಪರದೆ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
-<translation id="8659875081143553823">ಕೇವಲ ಒಂದು ಸೆಕೆಂಡು</translation>
 <translation id="8660174278198826384">ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ಸಾಧನ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ</translation>
 <translation id="8661290697478713397">ಅಜ್ಞಾ&amp;ತ ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸೇರಿಕೊಳ್ಳಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 37bef58..baba29a 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -479,6 +479,7 @@
 <translation id="1698122934742150150">현재 시크릿 세션에만</translation>
 <translation id="1698650002254827833">앱 목록을 로드할 수 없습니다. 다시 시도해 주세요.</translation>
 <translation id="1701062906490865540">이 사용자 삭제</translation>
+<translation id="1703331064825191675">비밀번호 안심 관리</translation>
 <translation id="1706586824377653884">관리자가 추가함</translation>
 <translation id="1706625117072057435">확대/축소 수준</translation>
 <translation id="1708338024780164500">(비활성)</translation>
@@ -528,6 +529,7 @@
 <translation id="1764226536771329714">베타</translation>
 <translation id="176587472219019965">새 창(&amp;N)</translation>
 <translation id="1766575458646819543">전체 화면 종료됨</translation>
+<translation id="1766957085594317166">다시 입력할 필요가 없도록 비밀번호를 Google 계정에 안전하게 저장하세요.</translation>
 <translation id="1768278914020124551">로그온 서버에 연결하는 중에 문제가 발생했습니다. 네트워크 연결 및 도메인 이름을 확인한 다음 다시 시도하세요.</translation>
 <translation id="1769104665586091481">새 창에서 링크 열기(&amp;W)</translation>
 <translation id="1773212559869067373">인증서가 로컬로 거부됨</translation>
@@ -1875,6 +1877,7 @@
 <translation id="3748026146096797577">연결되어 있지 않음</translation>
 <translation id="3752582316358263300">확인...</translation>
 <translation id="3752673729237782832">내 기기</translation>
+<translation id="3753033997400164841">한 번만 저장하고 어디서나 사용하세요</translation>
 <translation id="3755411799582650620">이제 <ph name="PHONE_NAME" />에서도 이 <ph name="DEVICE_TYPE" />을(를) 잠금 해제할 수 있습니다.</translation>
 <translation id="375636864092143889">사이트에서 마이크를 사용하고 있습니다.</translation>
 <translation id="3757733214359997190">사이트를 찾을 수 없습니다.</translation>
@@ -2205,6 +2208,7 @@
 <translation id="4232375817808480934">Kerberos 설정</translation>
 <translation id="4235200303672858594">전체 화면</translation>
 <translation id="4235965441080806197">로그인 취소</translation>
+<translation id="4242145785130247982">여러 개의 클라이언트 인증서는 지원되지 않습니다.</translation>
 <translation id="4242533952199664413">설정 열기</translation>
 <translation id="4242577469625748426">기기에 정책 설정을 설치하지 못함: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">스타일러스 앱 더보기</translation>
@@ -2663,6 +2667,7 @@
 <translation id="4957949153200969297"><ph name="IDS_SHORT_PRODUCT_NAME" /> 동기화 관련 기능만 사용 설정</translation>
 <translation id="4959262764292427323">어느 기기에서나 사용할 수 있도록 비밀번호가 Google 계정에 저장됩니다.</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation>
+<translation id="496185450405387901">이 앱은 관리자가 설치했습니다.</translation>
 <translation id="4964455510556214366">배열</translation>
 <translation id="4964673849688379040">확인 중...</translation>
 <translation id="4965808351167763748">이 기기를 설정하여 행아웃 Meet를 실행하시겠습니까?</translation>
@@ -2920,6 +2925,7 @@
 <translation id="5360150013186312835">툴바에서 보기</translation>
 <translation id="5362741141255528695">비공개 키 파일을 선택합니다.</translation>
 <translation id="5363109466694494651">Powerwash 및 되돌리기</translation>
+<translation id="5365716706805792666">비밀번호가 정보 유출에 포함되었는지 Google에서 확인할 수 있습니다. Google 계정으로 로그인하면 이 기능이 사용 설정됩니다.</translation>
 <translation id="5365881113273618889">선택한 폴더에 민감한 파일이 포함되어 있습니다. 이 폴더에 '<ph name="APP_NAME" />' 영구 쓰기 액세스 권한을 부여하시겠습니까?</translation>
 <translation id="5367091008316207019">파일 읽는 중..</translation>
 <translation id="5368720394188453070">휴대전화가 잠겨있습니다. 이용하려면 기기를 잠금 해제하세요.</translation>
@@ -3872,6 +3878,7 @@
 <translation id="6769712124046837540">프린터 추가 중...</translation>
 <translation id="6770664076092644100">NFC를 통해 인증</translation>
 <translation id="6771503742377376720">인증 기관임</translation>
+<translation id="6775163072363532304">사용 가능한 기기가 여기에 표시됩니다.</translation>
 <translation id="6777817260680419853">리디렉션이 차단됨</translation>
 <translation id="6778737459546443941">부모님이 아직 승인하지 않았습니다.</translation>
 <translation id="677965093459947883">아주 작게</translation>
@@ -4291,7 +4298,6 @@
 <translation id="7371006317849674875">시작 시간</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">이동 시 마우스 커서 강조표시</translation>
-<translation id="7377169924702866686">Caps Lock이 켜져 있습니다.</translation>
 <translation id="7377451353532943397">계속해서 센서 액세스 차단</translation>
 <translation id="7378627244592794276">안함</translation>
 <translation id="73786666777299047">Chrome 웹 스토어 열기</translation>
@@ -4332,6 +4338,7 @@
 <translation id="7441830548568730290">다른 사용자</translation>
 <translation id="7442465037756169001">행아웃 미팅 하드웨어 설정 준비가 완료되었습니다.</translation>
 <translation id="744341768939279100">새 프로필 만들기</translation>
+<translation id="7443806024147773267">Google 계정에 로그인되어 있으면 어디서나 비밀번호에 액세스할 수 있습니다.</translation>
 <translation id="7444046173054089907">차단된 사이트</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> 사용 중지</translation>
 <translation id="7448430327655618736">앱 자동 설치</translation>
@@ -4745,6 +4752,7 @@
 <translation id="8014154204619229810">업데이터가 현재 실행 중입니다. 잠시 후에 새로고침하여 다시 확인해 주세요.</translation>
 <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" />을(를) 이전에 설치한 버전으로 되돌릴 수 없습니다. 대신 기기를 Powerwash해 보세요.</translation>
 <translation id="8014210335923519270">시스템 정보와 사용 기록을 Google에 전송하여 <ph name="IDS_SHORT_PRODUCT_NAME" /> 및 보안 개선</translation>
+<translation id="8015780634880457457">비밀번호가 정보 유출에 포함되었는지 Google에서 확인할 수 있습니다.</translation>
 <translation id="8016266267177410919">임시 저장소</translation>
 <translation id="8017335670460187064"><ph name="LABEL" /></translation>
 <translation id="8017679124341497925">바로가기 수정됨</translation>
@@ -4863,6 +4871,7 @@
 <translation id="8188389033983459049">계속하려면 기기 설정을 확인하고 사용 설정하세요.</translation>
 <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />에 연결 중</translation>
 <translation id="8191230140820435481">앱, 확장 프로그램 및 테마 관리</translation>
+<translation id="819464600477418284">이 앱은 Chrome OS의 일부이므로 제거할 수 없습니다.</translation>
 <translation id="8195027750202970175">디스크 크기</translation>
 <translation id="8198323535106903877">앱 <ph name="NUMBER_OF_APPS" />개는 자동으로 설치됩니다</translation>
 <translation id="8199300056570174101">네트워크(서비스) 및 기기 속성</translation>
@@ -4923,6 +4932,7 @@
     <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>
+<translation id="826905130698769948">잘못된 클라이언트 인증서</translation>
 <translation id="8270242299912238708">PDF 문서</translation>
 <translation id="827097179112817503">홈 버튼 표시</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{북마크 1개가 삭제됨}other{북마크 #개가 삭제됨}}</translation>
@@ -4994,7 +5004,6 @@
 <translation id="8390449457866780408">서버를 사용할 수 없습니다.</translation>
 <translation id="8391218455464584335">레코드판</translation>
 <translation id="8391712576156218334">이미지를 사용할 수 없습니다. 나중에 다시 시도하세요.</translation>
-<translation id="8392234662362215700">키보드 레이아웃을 전환하려면 Control-Shift-Space 키를 누르세요.</translation>
 <translation id="8392364544846746346">사이트에서 기기의 파일 또는 폴더를 수정하려는 경우 확인 메시지 표시</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" />의 옵션 메뉴</translation>
 <translation id="8393511274964623038">플러그인 중지</translation>
@@ -5165,7 +5174,6 @@
 <translation id="8656619792520327915">다른 블루투스 보안 키 추가</translation>
 <translation id="8656768832129462377">확인 안 함</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) 내 화면 및 오디오를 공유 중입니다.</translation>
-<translation id="8659875081143553823">잠시 기다려 주세요.</translation>
 <translation id="8660174278198826384">조직의 기기 관리자에게 문의하세요.</translation>
 <translation id="8661290697478713397">시크릿 창에서 링크 열기(&amp;G)</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> 네트워크에 연결</translation>
@@ -5336,6 +5344,7 @@
 <translation id="8874184842967597500">연결되지 않음</translation>
 <translation id="8876307312329369159">데모 세션에서는 이 설정을 변경할 수 없습니다.</translation>
 <translation id="8877448029301136595">[상위 디렉터리]</translation>
+<translation id="8879220587046205278">Google Play의 앱이 외부 저장장치에 있는 파일을 읽고 쓰기 위해 전체 파일 시스템 액세스 권한을 요구할 수도 있습니다. 이 기기에서 생성된 파일 및 폴더는 외장 드라이브를 사용하는 모든 사람이 볼 수 있습니다.</translation>
 <translation id="8879284080359814990">탭으로 표시(&amp;S)</translation>
 <translation id="8879921471468674457">로그인 정보 저장</translation>
 <translation id="8881020143150461183">다시 시도해 주세요. 기술 지원이 필요하면 <ph name="CARRIER_NAME" />에 문의하세요.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 75e8d1df..bde4985 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Pradžios laikas</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Paryškinti pelės žymeklį, kai jis juda</translation>
-<translation id="7377169924702866686">Įjungtas didžiųjų raidžių klavišas.</translation>
 <translation id="7377451353532943397">Toliau blokuoti prieigą prie jutiklio</translation>
 <translation id="7378627244592794276">Ne</translation>
 <translation id="73786666777299047">Atidarykite „Chrome“ internetinę parduotuvę</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">Serveris nepasiekiamas.</translation>
 <translation id="8391218455464584335">Plokštelė</translation>
 <translation id="8391712576156218334">Vaizdas nepasiekiamas. Vėliau bandykite dar kartą.</translation>
-<translation id="8392234662362215700">Paspauskite „Control“–„Shift“–tarpo klavišą, kad perjungtumėte klaviatūros išdėstymą.</translation>
 <translation id="8392364544846746346">Klausti, kai svetainė nori redaguoti įrenginyje esančius failus ar aplankus</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> skirtų parinkčių meniu</translation>
 <translation id="8393511274964623038">Stabdyti papildinį</translation>
@@ -5179,7 +5177,6 @@
 <translation id="8656619792520327915">Pridėti kitą „Bluetooth“ saugos raktą</translation>
 <translation id="8656768832129462377">Netikrinti</translation>
 <translation id="8658645149275195032">„<ph name="APP_NAME" />“ bendrina jūsų ekraną ir garsą su <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Šiek tiek palaukite</translation>
 <translation id="8660174278198826384">Kreipkitės į organizacijos įrenginio administratorių</translation>
 <translation id="8661290697478713397">Atidaryti nuorodą inko&amp;gnito lange</translation>
 <translation id="8662671328352114214">Prisijungimas prie „<ph name="TYPE" />“ tinklo</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 7fcf23b..2735791 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Sākuma laiks</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Izcelt peles kursoru, kad tas tiek kustināts</translation>
-<translation id="7377169924702866686">Funkcija Caps Lock ir ieslēgta.</translation>
 <translation id="7377451353532943397">Turpināt bloķēt piekļuvi sensoriem</translation>
 <translation id="7378627244592794276">Nē</translation>
 <translation id="73786666777299047">Atveriet Chrome interneta veikalu</translation>
@@ -5006,7 +5005,6 @@
 <translation id="8390449457866780408">Serveris nav pieejams.</translation>
 <translation id="8391218455464584335">Vinils</translation>
 <translation id="8391712576156218334">Attēls nav pieejams. Vēlāk mēģiniet vēlreiz.</translation>
-<translation id="8392234662362215700">Lai pārslēgtu tastatūras izkārtojumu, nospiediet taustiņus Control-Shift-Space.</translation>
 <translation id="8392364544846746346">Vaicāt, ja vietne vēlas rediģēt ierīces failus vai mapes</translation>
 <translation id="8392451568018454956">Opciju izvēlne kontam <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Apturēt spraudņa darbību</translation>
@@ -5177,7 +5175,6 @@
 <translation id="8656619792520327915">Pievienot citu Bluetooth drošības atslēgu</translation>
 <translation id="8656768832129462377">Nepārbaudīt</translation>
 <translation id="8658645149275195032">Lietotne <ph name="APP_NAME" /> koplieto jūsu ekrānu un audio ar cilni <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Uzgaidiet!</translation>
 <translation id="8660174278198826384">Sazinieties ar organizācijas ierīces administratoru</translation>
 <translation id="8661290697478713397">Atvērt saiti inko&amp;gnito režīma logā</translation>
 <translation id="8662671328352114214">Pievienošanās <ph name="TYPE" /> tīklam</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index ffa9cd2..b1c39e8 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -4271,7 +4271,6 @@
 <translation id="7371006317849674875">ആരംഭിക്കുന്ന സമയം</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">മൗസ് കഴ്‌സർ നീക്കുമ്പോൾ അത് ഹൈലൈറ്റ് ചെയ്യുക</translation>
-<translation id="7377169924702866686">Caps Lock ഓൺ ആണ്.</translation>
 <translation id="7377451353532943397">സെൻസർ ആക്‌സസ് ബ്ലോക്ക് ചെയ്യുന്നത് തുടരുക</translation>
 <translation id="7378627244592794276">വേണ്ട</translation>
 <translation id="73786666777299047">Chrome വെബ് സ്‌റ്റോർ തുറക്കുക</translation>
@@ -4974,7 +4973,6 @@
 <translation id="8390449457866780408">സെര്‍വര്‍ ലഭ്യമല്ല.</translation>
 <translation id="8391218455464584335">വിനൈൽ</translation>
 <translation id="8391712576156218334">ചിത്രം ലഭ്യമല്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="8392234662362215700">കീബോർഡ് ലേഔട്ട് മാറ്റുന്നതിന് Control-Shift-Space അമർത്തുക.</translation>
 <translation id="8392364544846746346">ഏതെങ്കിലും സൈറ്റിന് നിങ്ങളുടെ ഉപകരണത്തിലെ ഫയലുകളോ ഫോൾഡറുകളോ എഡിറ്റ് ചെയ്യണമെങ്കിൽ നിങ്ങളോട് അനുമതി ചോദിക്കുക</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> എന്നതിനുള്ള ഓപ്‌ഷൻ മെനു</translation>
 <translation id="8393511274964623038">പ്ലഗ്-ഇൻ നിർത്തുക</translation>
@@ -5144,7 +5142,6 @@
 <translation id="8656619792520327915">മറ്റൊരു Bluetooth സുരക്ഷാ കീ ചേർക്കുക</translation>
 <translation id="8656768832129462377">പരിശോധിക്കരുത്</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> എന്നതുമായി നിങ്ങളുടെ സ്‌ക്രീനും ഓഡിയോയും പങ്കിടുന്നു.</translation>
-<translation id="8659875081143553823">ഒരു നിമിഷം മാത്രം</translation>
 <translation id="8660174278198826384">നിങ്ങളുടെ ഓർഗനൈസേഷൻ്റെ ഉപകരണ അഡ്‌മിനെ ബന്ധപ്പെടുക</translation>
 <translation id="8661290697478713397">ലിങ്ക് അദൃശ്യ വിൻഡോയിൽ തുറക്കുക</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> നെറ്റ്‌വർക്കിൽ ചേരുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index edb3e2dc..614120f 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -59,7 +59,7 @@
 <translation id="1076698951459398590">थीम सुरू करा</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1079766198702302550">कॅमेरा अॅक्सेस नेहमी ब्लॉक करा</translation>
-<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> तुमच्याChrome सेटिंग्ज त्यांच्या मूळ डीफॉल्टवर रिस्टोअर करू इच्छित आहे. हे तुमचे होम, नवीन टॅब पेज आणि शोध इंजिन रीसेट करेल, तुमचे एक्स्टेंशन बंद करेल आणि सर्व टॅब अनपिन करेल. ते कुकीज, सामग्री आणि साइट डेटासारखा इतर तात्पुरता आणि कॅश केलेला डेटा देखील साफ करेल.</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> तुमच्या Chrome सेटिंग्ज त्यांच्या मूळ डीफॉल्टवर रिस्टोअर करू इच्छित आहे. हे तुमचे मुख्यपेज, नवीन टॅब पेज आणि शोध इंजिन रीसेट करेल, तुमच्या एक्स्टेंशनांना अक्षम करेल आणि सर्व टॅबना अनपिन करेल. ते कुकीज, सामग्री आणि साइट डेटासारखा इतर तात्पुरता आणि कॅश केलेला डेटा देखील साफ करेल.</translation>
 <translation id="1082725763867769612">ऑफलाइन फायली</translation>
 <translation id="1084824384139382525">लिंक पत्ता कॉपी करा</translation>
 <translation id="1085697365578766383">व्हर्च्युअल मशीन सुरू करताना एरर आली. कृपया पुन्हा प्रयत्न करा.</translation>
@@ -292,7 +292,7 @@
 <translation id="1431188203598586230">अंतिम सॉफ्टवेअर अपडेट</translation>
 <translation id="1432581352905426595">शोध इंजिन व्यवस्थापित करा</translation>
 <translation id="1433811987160647649">प्रवेश करण्यापूर्वी विचारा</translation>
-<translation id="1434696352799406980">हे तुमचे सुरू पेज, नवीन टॅब पेज, शोध इंजिन आणि पिन केलेले टॅब रीसेट करेल. हे सर्व एक्स्टेंशन अक्षम करेल आणि कुकीज सारखा तात्पुरता डेटा साफ करेल. तुमचे बुकमार्क, इतिहास आणि सेव्ह केलेले पासवर्ड साफ केले जाणार नाहीत.</translation>
+<translation id="1434696352799406980">हे तुमचे स्टार्टअप पेज, नवीन टॅब पेज, शोध इंजिन आणि पिन केलेले टॅब रीसेट करेल. हे सर्व एक्स्टेंशन अक्षम करेल आणि कुकीज सारखा तात्पुरता डेटा साफ करेल. तुमचे बुकमार्क, इतिहास आणि सेव्ह केलेले पासवर्ड साफ केले जाणार नाहीत.</translation>
 <translation id="1434886155212424586">होमपेज हे नवीन टॅब पेज आहे</translation>
 <translation id="1436390408194692385"><ph name="TICKET_TIME_LEFT" /> पर्यंत वैध आहे</translation>
 <translation id="1436671784520050284">सेटअप सुरू ठेवा</translation>
@@ -302,6 +302,7 @@
 <translation id="1444628761356461360">ही सेटिंग डिव्हाइस मालक, <ph name="OWNER_EMAIL" /> द्वारे व्यवस्थापित केली आहे.</translation>
 <translation id="144518587530125858">थीमसाठी '<ph name="IMAGE_PATH" />' लोड करणे शक्य नाही.</translation>
 <translation id="1445693676523799095">यासाठी थोडा वेळ लागू शकतो</translation>
+<translation id="1450011005989029586">तुम्ही वापरता त्या साइट किंवा अॅपवरील डेटा भंगामुळे तुमचा पासवर्ड उघड झाला आहे. Chrome शिफारशी <ph name="BOLD" /> आता <ph name="ORIGIN" /> वर आहेत.</translation>
 <translation id="1451375123200651445">वेबपेज, एकल फाइल</translation>
 <translation id="1451917004835509682">पर्यवेक्षी व्यक्ती जोडा</translation>
 <translation id="1454223536435069390">स्क्रीनशॉट घ्या</translation>
@@ -411,6 +412,7 @@
 <translation id="1604432177629086300">प्रिंट करू शकलो नाही. प्रिंटर तपासा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="1607139524282324606">प्रवेश साफ करा</translation>
 <translation id="1608626060424371292">हा वापरकर्ता काढून टाका</translation>
+<translation id="1608668830839595724">निवडलेल्या आयटमसाठी अधिक क्रिया</translation>
 <translation id="1609170755653088773">तुमच्या iPhone वर हा पासवर्ड सिंक करा</translation>
 <translation id="161042844686301425">निळसर</translation>
 <translation id="1611584202130317952">तरतूद प्रवाहात व्यत्यय आला होता. कृपया पुन्हा प्रयत्न करा किंवा तुमच्या डिव्हाइसच्या मालकाशी किंवा अ‍ॅडमिनिस्ट्रेटरशी संपर्क साधा.</translation>
@@ -645,7 +647,7 @@
 <translation id="1931152874660185993">कोणतेही घटक इंस्टॉल केले नाहीत.</translation>
 <translation id="1932026958134051332">अॅक्सेस पर्याय स्विच करा</translation>
 <translation id="1932098463447129402">पूर्वी नाही</translation>
-<translation id="1933809209549026293">कृपया एक माउस किंवा एक कीबोर्ड कनेक्ट करा. तुम्ही ब्लूटूथ डिव्हाइस वापरत असल्यास, पेअरिंगसाठी ते तयार असल्याचे निश्चित करा.</translation>
+<translation id="1933809209549026293">कृपया एक माउस किंवा एक कीबोर्ड कनेक्ट करा. तुम्ही ब्लूटूथ डिव्हाइस वापरत असल्यास, पेअरिंगसाठी ते तयार असल्याचे खात्री करा.</translation>
 <translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> असलेल्या या डिव्हाइस सह <ph name="ARCHITECTURE_CONTAINER" /> प्रकारचे आर्किटेक्चर कंटेनर इंपोर्ट करू शकत नाही. तुम्ही हा कंटेनर वेगळ्या डिव्हाइसमध्ये रिस्टोअर करण्याचा प्रयत्न करू शकता किंवा तुम्ही या कंटेनर प्रतिमेच्या फायली Files अॅपमध्ये उघडून अॅक्सेस करू शकता.</translation>
 <translation id="1938351510777341717">बाह्य कमांड</translation>
 <translation id="1940546824932169984">कनेक्‍ट केलेले डिव्हाइस</translation>
@@ -733,6 +735,7 @@
 <translation id="2090165459409185032">तुमची खाते माहिती पुनर्प्राप्त करण्यासाठी, यावर जा: google.com/accounts/recovery</translation>
 <translation id="2090876986345970080">सिस्टम सुरक्षा सेटिंग्ज</translation>
 <translation id="2091887806945687916">ध्वनी</translation>
+<translation id="2096715839409389970">तृतीय पक्ष कुकी साफ करा</translation>
 <translation id="2097372108957554726">नवीन डिव्हाइसेसची नोंदणी करण्यासाठी तुम्हाला Chrome वर साइन इन करणे आवश्यक आहे</translation>
 <translation id="2099172618127234427">तुम्ही Chrome OS डीबगिंग वैशिष्ट्ये सुरू करत आहात जी ssh केलेल्या daemon सेट आणि USB ड्राइव्हवरून बूट करणे सुरू करतील.</translation>
 <translation id="2099686503067610784">सर्व्हर सर्टिफिकेट "<ph name="CERTIFICATE_NAME" />" हटवायचे?</translation>
@@ -754,7 +757,7 @@
 <translation id="2127372758936585790">निम्न-उर्जेचे चार्जर</translation>
 <translation id="212862741129535676">फ्रिक्वेन्सी स्थिती कब्जा टक्केवारी</translation>
 <translation id="212876957201860463">तुमचे मोबाइल डिव्हाइस सेट करण्यास तयार करत आहे…</translation>
-<translation id="2129825002735785149">प्लग-इन अपडेट करा</translation>
+<translation id="2129825002735785149">प्लगिन अपडेट करा</translation>
 <translation id="2131077480075264">"<ph name="IMPORT_NAME" />" द्वारे "<ph name="APP_NAME" />" ला अनुमती नसल्‍याने तो स्‍थापित करण्‍यात अक्षम</translation>
 <translation id="21354425047973905">पिन लपवा</translation>
 <translation id="2135456203358955318">डॉक केलेले भिंग</translation>
@@ -778,6 +781,7 @@
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> सारखे दिसते</translation>
 <translation id="2156283799932971644">सुरक्षित ब्राउझिंगमध्ये सुधारणा करण्यासाठी तुम्ही Google ला काही सिस्टम माहिती आणि पेज आशय पाठवून मदत करू शकता.</translation>
 <translation id="2156294658807918600">सेवा कर्मचारी: <ph name="SCRIPT_URL" /></translation>
+<translation id="2157474325782140681">अतिरिक्त वैशिष्‍ट्ये मिळवण्यासाठी, या Chromebook सोबत काम करणारे Dell डॉक स्टेशन वापरा.</translation>
 <translation id="215753907730220065">पूर्ण स्क्रीनमधून निर्गमन करा</translation>
 <translation id="2157875535253991059">हे पृष्ठ आता फुल स्‍क्रीन असेल.</translation>
 <translation id="216169395504480358">वाय-फाय जोडा...</translation>
@@ -795,6 +799,7 @@
 <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_DOMAIN" /> वरील <ph name="PEPPER_PLUGIN_NAME" /> ला तुमचा काँप्युटर अ‍ॅक्सेस करायचा आहे</translation>
 <translation id="2178614541317717477">CA तडजोड</translation>
 <translation id="218070003709087997">किती प्रती प्रिंट करायच्या ते सूचित करण्यासाठी संख्या वापरा (1 ते 999).</translation>
+<translation id="2182058453334755893">तुमच्या क्लिपबोर्डवर कॉपी केले</translation>
 <translation id="2184515124301515068">जेव्हा साइट आवाज प्ले करेल तेव्हा Chrome ला निवड करू दे (शिफारस केलेले)</translation>
 <translation id="2187895286714876935">सर्व्हर सर्टिफिकेट आयात एरर</translation>
 <translation id="2187906491731510095">विस्तार अपडेट केले</translation>
@@ -867,6 +872,7 @@
 <translation id="2270450558902169558"><ph name="DOMAIN" /> डोमेनमध्ये कोणत्याही डिव्हाइससह डेटा अदलाबदल करा</translation>
 <translation id="2270627217422354837">डोमेनमध्ये कोणत्याही डिव्हाइससह डेटा अदलाबदल करा: <ph name="DOMAINS" /></translation>
 <translation id="2272570998639520080">मार्टिनी ग्लास</translation>
+<translation id="2273119997271134996">व्हिडिओ-पोर्ट समस्या डॉक करा</translation>
 <translation id="2276503375879033601">अधिक ॲप्लिकेशन जोडा</translation>
 <translation id="2277255602909579701">सर्व कुकीज आणि साइट डेटा</translation>
 <translation id="2277769717710009150">{COUNT,plural, =1{1 आयटम कॉपी केला}other{# आयटम कॉपी केले}}</translation>
@@ -878,7 +884,7 @@
 <translation id="2288181517385084064">व्हिडिओ रेकॉर्डरवर स्विच करा</translation>
 <translation id="2288735659267887385">अॅक्सेसिबिलिटी सेटिंग्ज</translation>
 <translation id="2289270750774289114">साइटला केव्हा जवळपासचे ब्लूटूथ डिव्हाइस शोधायचे आहे हे विचारा (शिफारस केलेले)</translation>
-<translation id="2292848386125228270">कृपया <ph name="PRODUCT_NAME" /> चा सामान्य वापरकर्ता म्हणून सुरुवात करा. तुम्हाला विकासासाठी रूट म्हणून रन करणे आवश्यक असल्यास, सॅन्डबॉक्स फ्लॅगिंग नाही -- सह पुन्हा चालवा.</translation>
+<translation id="2292848386125228270">कृपया <ph name="PRODUCT_NAME" /> चा सामान्य वापरकर्ता म्हणून सुरू करा. तुम्हाला विकासासाठी मूळ म्हणून चालविणे आवश्यक असल्यास, सॅन्डबॉक्स ध्वजांकन नाही -- सह पुन्हा चालवा.</translation>
 <translation id="2294358108254308676">तुम्ही <ph name="PRODUCT_NAME" /> स्‍थापित करू इच्छिता?</translation>
 <translation id="2297705863329999812">प्रिंटर शोधा</translation>
 <translation id="2300383962156589922"><ph name="APP_NAME" /> ला कस्टमाइझ आणि नियंत्रित करा</translation>
@@ -960,6 +966,7 @@
 <translation id="2423578206845792524">म्हणून इमेज ज&amp;तन करा...</translation>
 <translation id="2428510569851653187">टॅब क्रॅश झाला तेव्हा तुम्ही नेमके काय करत होता ते सांगा</translation>
 <translation id="2431027948063157455">Google Assistant लोड होऊ शकले नाही, कृपया तुमचे नेटवर्क कनेक्शन तपासा आणि पुन्हा प्रयत्न करा.</translation>
+<translation id="243242775089461296">या साइटसाठी तृतीय पक्ष कुकी ब्लॉक करणे बंद केलेले आहे</translation>
 <translation id="2432753757290432042">Linux (बीटा) अपडेट आवश्यक आहे</translation>
 <translation id="2433452467737464329">पृष्ठ स्वयं-रिफ्रेश करण्यासाठी URL मध्ये क्वेरी परम जोडा: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">स्वरूप</translation>
@@ -1050,6 +1057,7 @@
 <translation id="2534460670861217804">सुरक्षित HTTP प्रॉक्सी</translation>
 <translation id="253557089021624350">Keepalive गणना</translation>
 <translation id="2535799430745250929">कोणतेही सेल्युलर नेटवर्क उपलब्ध नाही</translation>
+<translation id="2536052711541161459">पॉइंटर अॅक्सिलरेशन</translation>
 <translation id="2537395079978992874"><ph name="ORIGIN" /> खालील फाइल आणि फोल्डर पाहू आणि संपादित करू शकते</translation>
 <translation id="2538361623464451692">सिंक बंद केले आहे</translation>
 <translation id="2540449034743108469">एक्स्टेंशन अ‍ॅक्टिव्हिटी ऐकण्यासाठी "सुरू करा" दाबा</translation>
@@ -1270,6 +1278,7 @@
 <translation id="2849936225196189499">गंभीर</translation>
 <translation id="2850541429955027218">थीम जोडा</translation>
 <translation id="2851634818064021665">या साइटला भेट देण्यासाठी तुम्हाला परवानगीची गरज आहे</translation>
+<translation id="2854896010770911740">तृतीय पक्ष कुकी काढून टाका</translation>
 <translation id="2858138569776157458">टॉप साइट</translation>
 <translation id="2859806420264540918">ही साइट अनाहूत किंवा दिशाभूल करणाऱ्या जाहिराती दाखवते.</translation>
 <translation id="2861301611394761800">सिस्टम अपडेट पूर्ण. कृपया सिस्टम रीस्टार्ट करा.</translation>
@@ -1342,7 +1351,7 @@
 <translation id="296026337010986570">पूर्ण झाले! धोकादायक सॉफ्टवेअर काढून टाकले. एक्स्टेंशन पुन्हा सुरू करण्यासाठी &lt;a href="chrome://extensions"&gt;Extensions&lt;/a&gt; ला भेट द्या.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (एक्स्टेंशन प्रदान केले)</translation>
 <translation id="2961695502793809356">पुढे जाण्यासाठी क्लिक करा, इतिहास पहाण्यासाठी होल्ड करा</translation>
-<translation id="2963151496262057773">खालील प्लग-इन रेस्पॉन्सिव्ह नाही: <ph name="PLUGIN_NAME" />तुम्ही हे थांबवू इच्छिता?</translation>
+<translation id="2963151496262057773">खालील प्लगिन असंवादी आहे: <ph name="PLUGIN_NAME" />तुम्ही हे थांबवू इच्छिता?</translation>
 <translation id="2966937470348689686">Android प्राधान्ये व्यवस्थापित करा</translation>
 <translation id="2972557485845626008">फर्मवेयर</translation>
 <translation id="2972581237482394796">&amp;पुन्हा करा</translation>
@@ -1431,6 +1440,7 @@
 <translation id="310671807099593501">साइट ब्लूटूथ वापरत आहे</translation>
 <translation id="3115147772012638511">कॅशेसाठी प्रतीक्षा करत आहे...</translation>
 <translation id="3115580024857770654">सर्व कोलॅप्‍स करा</translation>
+<translation id="3117362587799608430">डॉक पूर्ण कंपॅटिबल नाहीये</translation>
 <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> मदत</translation>
 <translation id="3120430004221004537">दिलेल्या ऑपरेशनसाठी यावर अपुरे एंक्रिप्शन आहे: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="3121793941267913344">हा <ph name="IDS_SHORT_PRODUCT_NAME" /> डिव्हाइस रीसेट करा</translation>
@@ -1439,6 +1449,7 @@
 <translation id="3124111068741548686">वापरकर्ता हँडल</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3127156390846601284">दर्शविलेल्या सर्व साइटसाठी आपल्या डिव्हाइसवर संचयित केलेल्या कोणत्याही डेटास हे हटवेल. तुम्ही सुरु ठेवू इच्छिता?</translation>
+<translation id="3127860049873093642">चार्जिंग आणि परफॉर्मन्स समस्या टाळण्यासाठी, Dell किंवा USB केबल पॉवर अडॅप्टर वापरा.</translation>
 <translation id="3129173833825111527">डावा समास</translation>
 <translation id="3130528281680948470">तुमचे डिव्हाइस रीसेट केले जाईल आणि सर्व वापरकर्ता खाती आणि स्थानिक डेटा काढला जाईल. हे पूर्ववत केले जाऊ शकत नाही.</translation>
 <translation id="313205617302240621">पासवर्ड विसरलात?</translation>
@@ -1505,7 +1516,7 @@
 <translation id="3232318083971127729">मूल्य:</translation>
 <translation id="3233271424239923319">Linux अ‍ॅप्स आणि फायलींचा बॅकअप घ्या</translation>
 <translation id="323803881985677942">एक्स्टेंशन पर्याय उघडा</translation>
-<translation id="3241680850019875542">पॅक करण्यासाठी एक्स्टेंशनची मूळ डिरेक्टरी निवडा. एक एक्स्टेंशन अपडेट करण्याकरिता, पुनर्वापरासाठी खाजगी की फाइल देखील निवडा.</translation>
+<translation id="3241680850019875542">पॅक करण्यासाठी एक्स्टेंशनची मूळ डिरेक्टरी निवडा. एक एक्स्टेंशन अपडेट करण्याकरिता, पुनर्वापरासाठी खाजगी की, फाइल देखील निवडा.</translation>
 <translation id="3244294424315804309">आवाज म्यूट करणे सुरू ठेवा</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - नेटवर्क एरर</translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1536,8 +1547,9 @@
 <translation id="3281892622610078515">क्वारंटाइन करण्यासाठी फाइल आणि प्रोग्राम:</translation>
 <translation id="3282568296779691940">Chrome वर साइन इन करा</translation>
 <translation id="3285322247471302225">नवीन &amp;टॅब</translation>
+<translation id="328571385944182268">तुमचे पासवर्ड सेव्ह करायचे आहेत का?</translation>
 <translation id="3286737518123001369">तुमच्या सिक्युरिटी कीवर स्टोअर केलेला साइन इन डेटा पाहा आणि हटवा</translation>
-<translation id="3288047731229977326">डेव्हलपर मोडमध्‍ये चालणारी एक्स्टेंशन आपल्‍या कॉंप्युटरला हानी पोहचवू शकतात. तुम्ही डेव्हलपर नसल्‍यास, सुरक्षित राहाण्‍यासाठी डेव्हलपर मोडमध्‍ये चालणारे हे एक्स्टेंशन तुम्ही अक्षम करावे.</translation>
+<translation id="3288047731229977326">डेव्हलपर मोडमध्‍ये चालणारे विस्‍तार तुमच्या कॉंप्युटरास हानी पोहचवू शकतात. तुम्ही डेव्हलपर नसल्‍यास, सुरक्षित राहाण्‍यासाठी डेव्हलपर मोडमध्‍ये चालणारे हे विस्‍तार तुम्ही अक्षम करावे.</translation>
 <translation id="3289856944988573801">अपडेट तपासण्यासाठी, कृपया इथरनेट किंवा वाय-फाय वापरा.</translation>
 <translation id="3293644607209440645">हे पेज पाठवा</translation>
 <translation id="32939749466444286">Linux कंटेनर सुरू झाले नाही. कृपया पुन्हा प्रयत्न करा.</translation>
@@ -1655,6 +1667,7 @@
 <translation id="346431825526753">हे मुलांसाठी असलेले खाते <ph name="CUSTODIAN_EMAIL" /> द्वारे व्‍यवस्‍थापित केले.</translation>
 <translation id="3468999815377931311">Android फोन</translation>
 <translation id="3470442499439619530">हा वापरकर्ता काढून टाका</translation>
+<translation id="3471876058939596279">व्हिडिओसाठी HDMI आणि USB केबल एकाच वेळी वापरता येत नाहीत. वेगळी व्हिडिओ पोर्ट वापरा.</translation>
 <translation id="3473479545200714844">स्क्रीन भिंग</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>
@@ -1752,6 +1765,7 @@
 <translation id="3603622770190368340">नेटवर्क सर्टिफिकेट प्राप्त करा</translation>
 <translation id="3605780360466892872">बटनडाउन</translation>
 <translation id="3608576286259426129">वापरकर्ता इमेज पूर्वावलोकन</translation>
+<translation id="3610369246614755442">डॉक फॅनला सेवा हव्या आहेत</translation>
 <translation id="361106536627977100">फ्लॅश डेटा</translation>
 <translation id="3612673635130633812">&lt;a href="<ph name="URL" />"&gt;<ph name="EXTENSION" />&lt;/a&gt; द्वारे डाउनलोड केले</translation>
 <translation id="3613134908380545408"><ph name="FOLDER_NAME" /> दर्शवा</translation>
@@ -1763,6 +1777,7 @@
 <translation id="3624567683873126087">डिव्हाइस अनलॉक करा आणि Google खात्यामध्ये साइन इन करा</translation>
 <translation id="3625258641415618104">स्क्रीनशॉट अक्षम केले</translation>
 <translation id="3625481642044239431">चुकीची फाइल निवडली. पुन्हा प्रयत्न करा.</translation>
+<translation id="3626296069957678981">ही Chromebook चार्ज करण्यासाठी, कंपॅटिबल Dell बॅटरी वापरा.</translation>
 <translation id="3627320433825461852">1 मिनिटापेक्षा कमी बाकी</translation>
 <translation id="3627588569887975815">लिंक गुप्त विंडो मध्ये उघडा</translation>
 <translation id="3627671146180677314">Netscape सर्टिफिकेट रिन्यूअल वेळ</translation>
@@ -1897,7 +1912,7 @@
 <translation id="3798449238516105146">आवृत्ती</translation>
 <translation id="3799201711591988491">{COUNT,plural, =0{आणि सर्व उघडा}=1{आणि बुकमार्क उघडा}other{आणि सर्व (#) उघडा}}</translation>
 <translation id="3800806661949714323">सर्व दर्शवा (शिफारस केलेले)</translation>
-<translation id="380408572480438692">कार्यडिस्प्ले डेटाचे संकलन सक्षम केल्याने वेळोवेळी सिस्टम सुधारण्यात Google ला मदत होईल. तुम्ही एक अभिप्राय अहवाल दाखल करेपर्यंत (Alt-शिफ्ट-I) आणि कार्यडिस्प्ले डेटा समाविष्ट करेपर्यंत कोणताही डेटा पाठविला जात नाही. तुम्ही संकलन बंद करण्यासाठी या स्क्रीनवर कधीही परत येऊ शकता.</translation>
+<translation id="380408572480438692">कार्यडिस्प्ले डेटाचे संकलन सक्षम केल्याने वेळोवेळी सिस्टम सुधारण्यात Google ला मदत होईल. तुम्ही एक फीडबॅक अहवाल दाखल करेपर्यंत (Alt-Shift-I) आणि कार्यडिस्प्ले डेटा समाविष्ट करेपर्यंत कोणताही डेटा पाठविला जात नाही. तुम्ही संकलन अक्षम करण्यासाठी या स्क्रीनवर कधीही परत येऊ शकता.</translation>
 <translation id="3807249107536149332"><ph name="EXTENSION_NAME" /> लॉगिन स्क्रीनवर (एक्स्टेंशन ID "<ph name="EXTENSION_ID" />") ची अनुमती नाही.</translation>
 <translation id="3807747707162121253">&amp;रद्द करा</translation>
 <translation id="38089336910894858">⌘Q द्वारे बाहेर पडण्यापूर्वी चेतावणी दाखवा</translation>
@@ -2001,10 +2016,10 @@
 <translation id="3937734102568271121">नेहमी <ph name="LANGUAGE" /> मध्‍ये भाषांतर करा</translation>
 <translation id="3938128855950761626">विक्रेता <ph name="VENDOR_ID" /> कडील डिव्हाइस</translation>
 <translation id="3940233957883229251">अॉटो-रिपीट सुरू करा</translation>
-<translation id="3941565636838060942">या प्रोग्रामवरील अॅक्सेस लपवण्यासाठी, तुम्हाला नियंत्रण पॅनेलमधील
-  <ph name="CONTROL_PANEL_APPLET_NAME" /> वापरून तो अनइंस्टॉल करण्याची आवश्यकता आहे.
+<translation id="3941565636838060942">या प्रोग्रामवरील अॅक्सेस लपवण्यासाठी, तुम्ही नियंत्रण पॅनेलमधील
+  <ph name="CONTROL_PANEL_APPLET_NAME" /> वापरून तो अनइंस्टॉल करणे अावश्यक आहे.
 
-  तुम्ही <ph name="CONTROL_PANEL_APPLET_NAME" /> सुरुवात करू इच्छिता?</translation>
+  तुम्ही <ph name="CONTROL_PANEL_APPLET_NAME" /> सुरू करू इच्छिता?</translation>
 <translation id="394183848452296464">शॉर्टकट तयार करू शकत नाही</translation>
 <translation id="3943582379552582368">&amp;मागील</translation>
 <translation id="3943857333388298514">पेस्ट करा</translation>
@@ -2212,6 +2227,7 @@
 <translation id="4267953847983678297">मोबाइल नेटवर्कशी आपोआप कनेक्ट करा</translation>
 <translation id="4268025649754414643">की एनसिफरमेन्ट</translation>
 <translation id="4270393598798225102">आवृत्ती <ph name="NUMBER" /></translation>
+<translation id="4270615291506829403">तुमचा पासवर्ड बदलत आहे</translation>
 <translation id="4275663329226226506">माध्यम</translation>
 <translation id="4275830172053184480">तुमचा डिव्हाइस रीस्टार्ट करा</translation>
 <translation id="4278101229438943600">तुमचा असिस्टंट तयार आहे</translation>
@@ -2349,6 +2365,7 @@
 <translation id="451407183922382411"><ph name="COMPANY_NAME" />ने समर्थित करा</translation>
 <translation id="4514610446763173167">प्ले करण्यासाठी किंवा थांबवण्यासाठी व्हिडिओ टॉगल करा</translation>
 <translation id="451515744433878153">काढून टाका</translation>
+<translation id="4515872537870654449">सेवेसाठी Dell शी संपर्क साधा. फॅन काम करत नसल्यास डॉक बंद होईल.</translation>
 <translation id="4519935350946509010">कनेक्शन एरर.</translation>
 <translation id="4520385623207007473">वापरात असलेल्या कुकीज</translation>
 <translation id="452039078290142656"><ph name="VENDOR_NAME" /> कडील अज्ञात डिव्हाइस</translation>
@@ -2631,6 +2648,7 @@
 <translation id="4932733599132424254">तारीख</translation>
 <translation id="4933484234309072027"><ph name="URL" /> वर एम्बेड केलेले</translation>
 <translation id="493571969993549666">पर्यवेक्षित वापरकर्ता जोडा</translation>
+<translation id="4939805055470675027"><ph name="CARRIER_NAME" /> शी कनेक्ट करू शकलो नाही</translation>
 <translation id="4941246025622441835">एंटरप्राइज व्यवस्थापनासाठी डिव्हाइसची नोंदणी करताना ही डिव्हाइस मागणी वापरा:</translation>
 <translation id="4941627891654116707">फॉन्ट आकार</translation>
 <translation id="494286511941020793">प्रॉक्सी कॉन्फिगरेशन मदत</translation>
@@ -2655,6 +2673,7 @@
 <translation id="4973307593867026061">प्रिंटर जोडा</translation>
 <translation id="4973325300212422370">{NUM_TABS,plural, =1{साइट म्यूट करा}other{साइट म्यूट करा}}</translation>
 <translation id="4974733135013075877">बाहेर पडा आणि चाइल्डलॉक करा</translation>
+<translation id="4976009197147810135">उभे विभाजित करा</translation>
 <translation id="4976795213394241669">{0,plural, =0{आता अपडेट करा}=1{एका सेकंदामध्ये अपडेट करा}other{# सेकंदांमध्ये अपडेट करा}}</translation>
 <translation id="4977942889532008999">अॅक्सेस निश्चित करा</translation>
 <translation id="4980805016576257426">या एक्स्टेंशनमध्ये मालवेअर आहे.</translation>
@@ -2764,7 +2783,9 @@
 <translation id="5142961317498132443">ऑथेंटिकेशन</translation>
 <translation id="5143374789336132547">The extension "<ph name="EXTENSION_NAME" />" has changed what page is shown when you click the Home button.</translation>
 <translation id="5143712164865402236">पूर्ण स्क्रीनमध्ये जा</translation>
+<translation id="5145461783043820456">तृतीय पक्ष कुकी ब्लॉक करणे सुरू आहे</translation>
 <translation id="514575469079499857">स्थान निर्धारित करण्यासाठी तुमचा आयपी अॅड्रेस वापरा (डीफॉल्ट)</translation>
+<translation id="5146995429444047494"><ph name="ORIGIN" />साठीच्या सूचना ब्लॉक केलेल्या आहेत</translation>
 <translation id="5150254825601720210">Netscape सर्टिफिकेट SSL सर्व्हर नाव</translation>
 <translation id="5151354047782775295">डिस्क स्थान मोकळे करा किंवा निवडलेला डेटा स्वयंचलितपणे हटवला जाऊ शकतो</translation>
 <translation id="5153234146675181447">फोन विसरा</translation>
@@ -3031,9 +3052,11 @@
 <translation id="5541694225089836610">तुमच्या ॲडमिनिस्ट्रेटरने क्रिया बंद केली आहे</translation>
 <translation id="5542132724887566711">प्रोफाइल</translation>
 <translation id="5542750926112347543"><ph name="DOMAIN" /> वरील कुकीज ब्‍लॉक केल्‍या आहेत</translation>
+<translation id="5542949973455282971"><ph name="CARRIER_NAME" /> शी कनेक्ट करत आहे</translation>
 <translation id="5543983818738093899">स्थिती तपासत आहे...</translation>
 <translation id="554517032089923082">GTC</translation>
 <translation id="5546865291508181392">शोधा</translation>
+<translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" आणि इतर एक टॅब}other{"<ph name="TAB_TITLE" />" आणि इतर # टॅब}}</translation>
 <translation id="5551573675707792127">कीबोर्ड आणि मजकूर इनपुट</translation>
 <translation id="5553089923092577885">सर्टिफिकेट धोरण मॅपिंग</translation>
 <translation id="5554489410841842733">जेव्हा एक्स्टेंशन वर्तमान पेजवर कार्य करेल तेव्हा हे प्रतीक दृश्यमान होईल.</translation>
@@ -3602,6 +3625,7 @@
 <translation id="6384275966486438344">आपल्या शोध सेटिंग्ज यावर बदला: <ph name="SEARCH_HOST" /></translation>
 <translation id="6385543213911723544">साइट कुकी डेटा सेव्ह करू आणि वाचू शकतात</translation>
 <translation id="6386099547750337629">हे अनपेक्षित असल्यास कृपया सपोर्टशी संपर्क करा.</translation>
+<translation id="6387674443318562538">उभे विभाजित करा</translation>
 <translation id="6388429472088318283">भाषा शोधा</translation>
 <translation id="6390799748543157332">या विंडोमध्ये तुम्ही पाहत असलेली पेज ब्राउझर इतिहासात दिसणार नाहीत आणि तुम्ही सर्व उघड्या अतिथी विंडो बंद केल्यानंतर कॉंप्युटरवरील, कुकीज सारखे, अन्य ट्रेस ते सोडणार नाहीत. असे असले तरीही, तुम्ही डाउनलोड करता त्या कोणत्याही फायली संरक्षित केल्या जातील.</translation>
 <translation id="6390994422085833176">सेटअपला फॉलो करणाऱ्या सिंक आणि पर्सनलाइझ वैशिष्ट्यांचे परीक्षण करा</translation>
@@ -3635,6 +3659,7 @@
 <translation id="6419546358665792306">अनपॅक केलेले लोड करा</translation>
 <translation id="642469772702851743">हे डिव्हाइस (SN: <ph name="SERIAL_NUMBER" />) मालकाने लॉक केले होते.</translation>
 <translation id="6426200009596957090">ChromeVox सेटिंग्‍ज उघडा</translation>
+<translation id="6428450836711225518">तुमच्या फोन नंबरची पडताळणी करा</translation>
 <translation id="6429384232893414837">अपडेट एरर</translation>
 <translation id="6430814529589430811">Base64-encoded ASCII, एकल सर्टिफिकेट</translation>
 <translation id="6431347207794742960">या कॉंप्युटरच्या सर्व वापरकर्त्यांसाठी <ph name="PRODUCT_NAME" /> स्वयंचलित अपडेट सेट करतील.</translation>
@@ -3857,6 +3882,7 @@
 <translation id="6786747875388722282">विस्तार</translation>
 <translation id="6787839852456839824">कीबोर्ड शॉर्टकट</translation>
 <translation id="6788210894632713004">पॅक न केलेले एक्स्टेंशन</translation>
+<translation id="6789592661892473991">आडवे विभाजित करा</translation>
 <translation id="6790428901817661496">प्ले करा</translation>
 <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> दूरस्थपणे जोडला</translation>
 <translation id="6790820461102226165">व्यक्ती जोडा...</translation>
@@ -4238,6 +4264,7 @@
 <translation id="7334190995941642545">Smart Lock सध्या अनुपलब्ध आहे. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="7334274148831027933">डॉक केलेले भिंग सुरू करा</translation>
 <translation id="7335974957018254119">यासाठी स्पेल चेक वापरा</translation>
+<translation id="7336799713063880535">सूचना ब्लॉक केल्या.</translation>
 <translation id="7338630283264858612">डिव्हाइस सिरीअल नंबर चुकीचा आहे.</translation>
 <translation id="7339763383339757376">PKCS #7, एकल सर्टिफिकेट</translation>
 <translation id="7339785458027436441">टाइप करताना शब्दलेखन तपासा</translation>
@@ -4265,7 +4292,6 @@
 <translation id="7371006317849674875">सुरू होण्‍याची वेळ</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">माउस कर्सर हलताना हायलाइट करा</translation>
-<translation id="7377169924702866686">Caps Lock सुरू आहे.</translation>
 <translation id="7377451353532943397">सेन्सर ॲक्सेस ब्लॉक करणे सुरू ठेवा</translation>
 <translation id="7378627244592794276">नाही</translation>
 <translation id="73786666777299047">Chrome वेब स्टोअर उघडा</translation>
@@ -4350,6 +4376,7 @@
 <translation id="7506541170099744506">एंटरप्राइझ व्यवस्थापनासाठी आपल्या <ph name="DEVICE_TYPE" /> ची यशस्वीरित्या नोंदणी केली गेली.</translation>
 <translation id="7507930499305566459">स्थिती प्रतिसादकर्ता सर्टिफिकेट</translation>
 <translation id="7508054832109420082">प्रिंटरना ॲक्‍सेस द्या</translation>
+<translation id="7510943789645525906">तुम्ही वापरत असलेला पासवर्ड डेटा भंगचा भाग असल्यास तुम्हाला चेतावणी देते</translation>
 <translation id="7513029293694390567">स्टोअर क्रेडेंशियल वापरून वेबसाइटवर आपोआप साइन इन करा. अक्षम केले असल्यास, वेबसाइटवर साइन इन करण्यापूर्वी प्रत्येकवेळी तुम्हाला पुष्टीकरणासाठी विचारले जाईल.</translation>
 <translation id="7514365320538308">डाउनलोड करा</translation>
 <translation id="7521387064766892559">JavaScript</translation>
@@ -4415,6 +4442,7 @@
 <translation id="7625568159987162309">परवानग्या आणि साइटवर स्टोअर केलेला डेटा पहा</translation>
 <translation id="7629827748548208700">टॅब: <ph name="TAB_NAME" /></translation>
 <translation id="7631014249255418691">Linux अ‍ॅप्स आणि फायलींचा यशस्वीरीत्या बॅकअप घेतला</translation>
+<translation id="7631205654593498032">तुम्ही तुमची डिव्हाइस कनेक्ट करता तेव्हा तुम्ही सहमती दर्शवता की तुमचे <ph name="DEVICE_TYPE" /> हे करू शकेल:</translation>
 <translation id="7631887513477658702">&amp;नेहमी या प्रकारच्या फायली उघडा</translation>
 <translation id="7632948528260659758">खालील कियोस्‍क अ‍ॅप्स अद्यतनांसाठी अयशस्‍वी झाले आहेत:</translation>
 <translation id="763632859238619983">कोणत्याही साइटला पेमेंट हँडलर इंस्टॉल करण्याची अनुमती देऊ नका</translation>
@@ -4575,6 +4603,7 @@
 <ph name="BR" />
 <ph name="BR" />
 <ph name="BEGIN_BOLD" />सूचना:<ph name="END_BOLD" /> प्रक्रियेदरम्यान सिस्टम रीबूट होईल.</translation>
+<translation id="7828731929332799387">हे तृतीय पक्ष संदर्भात उपलब्ध असलेल्या कुकी आणि साइट हटवेल. तुम्हाला पुढे सुरू ठेवायचे आहे का?</translation>
 <translation id="7829298379596169484">ऑडिओ इनपुटमध्‍ये प्रवेश करीत आहे</translation>
 <translation id="7830594666202422257">Linux शी कनेक्ट करा</translation>
 <translation id="7831491651892296503">नेटवर्क कॉन्फिगर करताना एरर आली</translation>
@@ -4779,6 +4808,7 @@
 <translation id="810875025413331850">कोणतीही जवळपासची डिव्हाइस आढळली नाहीत.</translation>
 <translation id="8111155949205007504">तुमच्या iPhone सह हा पासवर्ड शेअर करा</translation>
 <translation id="8113043281354018522">परवाना प्रकार निवडा</translation>
+<translation id="8114875720387900039">आडवे विभाजित करा</translation>
 <translation id="8116972784401310538">&amp;बुकमार्क व्यवस्थापक</translation>
 <translation id="8117620576188476503">स्थिती ट्रेने कनेक्शन, अपडेट आणि सेटिंग्ज व्यवस्थापित करा. येथे कीबोर्डने येण्यासाठी, Alt + Shift + S दाबा.</translation>
 <translation id="8118076340394175570">तुमच्या संस्थेला या डिव्हाइसवर अपडेटची आवश्यकता आहे</translation>
@@ -4962,7 +4992,6 @@
 <translation id="8390449457866780408">सर्व्हर अनुपलब्ध.</translation>
 <translation id="8391218455464584335">व्हिनेल</translation>
 <translation id="8391712576156218334">इमेज अनुपलब्ध आहे. नंतर पुन्हा प्रयत्न करा.</translation>
-<translation id="8392234662362215700">कीबोर्ड लेआउट वरून स्विच करण्यासाठी Control-Shift-Space दाबा.</translation>
 <translation id="8392364544846746346">साइटला तुमच्या डिव्हाइसवरील फाइल किंवा फोल्डरचे संपादन करायचे असते तेव्हा विचारा</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> साठी पर्याय मेनू</translation>
 <translation id="8393511274964623038">प्लगइन थांबवा</translation>
@@ -4970,6 +4999,7 @@
 <translation id="839736845446313156">नोंदणी</translation>
 <translation id="8398877366907290961">तरीही पुढे चला</translation>
 <translation id="8400146488506985033">लोकांना व्यवस्थापित करा</translation>
+<translation id="8401432541486058167">तुमच्या स्‍मार्ट कार्डशी संलग्न असलेला पिन द्या.</translation>
 <translation id="8405046151008197676">नवीनतम अपडेटमधून हायलाइट मिळवा</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">प्रथम विचारा (शिफारस केलेले)</translation>
@@ -5132,7 +5162,6 @@
 <translation id="8656619792520327915">दुसरी ब्लूटूथ सिक्युरिटी की जोडा</translation>
 <translation id="8656768832129462377">तपासू नका</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> तुमची स्क्रीन आणि ऑडिओ <ph name="TAB_NAME" /> सह शेअर करीत आहे.</translation>
-<translation id="8659875081143553823">एकच सेकंद</translation>
 <translation id="8660174278198826384">तुमच्या संस्थेसाठी डिव्हाइस ॲडमिनशी संपर्क साधा</translation>
 <translation id="8661290697478713397">गुप्त विंडोमध्ये लिंक उघडा</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> नेटवर्कमध्‍‍‍‍ये सामील व्‍हा</translation>
@@ -5195,10 +5224,12 @@
 <translation id="8732212173949624846">आपल्या सर्व साइन इन केलेल्या डिव्हाइसेसवर तुमचा ब्राउझिंग इतिहास वाचा आणि बदला</translation>
 <translation id="8732844209475700754">गोपनीयता, सुरक्षितता आणि डेटा संकलनाशी संबंधित अधिक सेटिंग्ज</translation>
 <translation id="8734073480934656039">ही सेटिंग सक्षम करणे कियोस्क अनुप्रयोगांना सुरूवातीस स्वयंचलितपणे लाँच करण्याची अनुमती देते.</translation>
+<translation id="8734674662128056360">तृतीय पक्ष कुकी ब्लॉक करत आहे</translation>
 <translation id="873545264931343897"><ph name="PLUGIN_NAME" /> अपडेट समाप्त झाल्यावर, ते सक्रिय करण्यासाठी पृष्‍ठ रीलोड करा</translation>
 <translation id="8736288397686080465">ही साइट पार्श्वभूमीमध्ये अपडेट केली गेली आहे.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> ऐवजी <ph name="PROTOCOL" /> लिंक उघडा</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8742371904523228557"><ph name="ONE_TIME_CODE" /> हा तुमचा <ph name="ORIGIN" />साठीचा कोड आहे</translation>
 <translation id="8743390665131937741">क्षेत्रे झूम पातळी:</translation>
 <translation id="8743864605301774756">1 तासापूर्वी अपडेट करण्यात आले</translation>
 <translation id="874689135111202667">{0,plural, =1{या साइटवर एक फाइल अपलोड करायची?}other{या साइटवर # फायली अपलोड करायच्या?}}</translation>
@@ -5272,6 +5303,7 @@
 <translation id="883062543841130884">उपघटक</translation>
 <translation id="8830796635868321089">विद्यमान प्रॉक्सी सेटिंग्ज वापरून अपडेट तपासणी अयशस्वी झाली. कृपया तुमच्या <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी 
 सेटिंग्ज<ph name="PROXY_SETTINGS_LINK_END" /> अॅडजस्ट करा.</translation>
+<translation id="8831140208248705279">तुमचे <ph name="DEVICE_TYPE" /> आणि Android एकत्रितपणे आणखी चांगले काम करतात. तुम्हाला तुमच्या काँप्युटरवरून एसएमएस करणे, तुमचे इंटरनेट कनेक्शन शेअर करणे आणि तुमच्या फोनने तुमचे <ph name="DEVICE_TYPE" /> अनलॉक करणे शक्य होण्यासाठी त्यांना कनेक्ट करा.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
 <translation id="8831664945713891930">एक्स्टेंशन सेटिंग्ज उघडा</translation>
 <translation id="8834039744648160717"><ph name="USER_EMAIL" /> ने नेटवर्क कॉन्फिगरेशन नियंत्रित केले आहे.</translation>
 <translation id="8838770651474809439">हॅमबर्गर</translation>
@@ -5303,6 +5335,7 @@
 <translation id="8877448029301136595">[मूळ डिरेक्टरी]</translation>
 <translation id="8879284080359814990">टॅब म्हणून &amp;दर्शवा</translation>
 <translation id="8879921471468674457">साइन इन माहिती लक्षात ठेवा</translation>
+<translation id="8881020143150461183">कृपया पुन्हा प्रयत्न करा. तांत्रिक सपोर्टसाठी, <ph name="CARRIER_NAME" /> शी संपर्क साधा.</translation>
 <translation id="8884570509232205463">तुमचे डिव्हाइस आता <ph name="UNLOCK_TIME" /> वाजता लॉक होईल.</translation>
 <translation id="8885197664446363138">Smart Lock अनुपलब्ध आहे</translation>
 <translation id="8888253246822647887">अपग्रेड पूर्ण झाल्यावर तुमचे अ‍ॅप उघडेल. अपग्रेड करण्यास काही मिनिटे लागू शकतात.</translation>
@@ -5353,6 +5386,7 @@
 <translation id="894871326938397531">गुप्त मोड सोडायचा?</translation>
 <translation id="8948939328578167195"><ph name="WEBSITE" /> ला तुमच्या सिक्युरिटी की ची निर्मिती आणि मॉडेल पहायचा आहे</translation>
 <translation id="8951256747718668828">एररमुळे रिस्टोअर करणे पूर्ण करता आले नाही</translation>
+<translation id="8951465597020890363">अतिथी मोडमधून बाहेर पडायचे आहे का?</translation>
 <translation id="8952831374766033534">कॉन्फिगरेशन पर्याय सपोर्ट करत नाही: <ph name="ERROR_LINE" /></translation>
 <translation id="895347679606913382">प्रारंभ करीत आहे...</translation>
 <translation id="8956941634583033512">{0,plural, =1{एका दिवसामध्ये अपडेट करा}other{# दिवसांमध्ये अपडेट करा}}</translation>
@@ -5368,6 +5402,7 @@
 <translation id="8973596347849323817">तुमच्या गरजा पूर्ण करण्यासाठी तुम्ही हे डिव्हाइस कस्टम करू शकता. ही अॅक्सेसिबिलिटी वैशिष्ट्ये नंतर सेटिंग्जमध्ये बदलली जाऊ शकतात.</translation>
 <translation id="897414447285476047">कनेक्शनमधील समस्येमुळे डेस्टिनेशन फाइल अपूर्ण राहिली.</translation>
 <translation id="897525204902889653">क्वारंटाइन सेवा</translation>
+<translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" आणि इतर एक टॅब}other{"<ph name="TAB_TITLE" />" आणि इतर # टॅब}}</translation>
 <translation id="8976520271376534479">या पेजवर फ्लॅश ब्लॉक केले आहे.</translation>
 <translation id="8977811652087512276">चुकीचा पासवर्ड किंवा करप्ट फाइल</translation>
 <translation id="8978154919215542464">ऑन - सर्वकाही सिंक करत आहे</translation>
@@ -5432,7 +5467,7 @@
 <translation id="9062468308252555888">१४x</translation>
 <translation id="9063208415146866933">ओळ <ph name="ERROR_LINE_START" /> ते <ph name="ERROR_LINE_END" /> पर्यंत एरर</translation>
 <translation id="9064142312330104323">Google प्रोफाइल फोटो (लोड करत आहे)</translation>
-<translation id="9064275926664971810">एका क्लिकमध्ये वेब फॉर्म भरण्यासाठी ऑटोफिल सुरू करा</translation>
+<translation id="9064275926664971810">एका क्लिकमध्ये वेब फॉर्म भरण्यासाठी अॉटोफिल सक्षम करा</translation>
 <translation id="9065203028668620118">संपादन</translation>
 <translation id="9066773882585798925">मोठ्याने वाचलेला मजकूर ऐका</translation>
 <translation id="9066782832737749352">टेक्स्ट टू स्पीच</translation>
@@ -5457,6 +5492,7 @@
 <translation id="9103868373786083162">परत जाण्‍यासाठी दाबा, इतिहास पाहण्‍यासाठी संदर्भ मेनूवर जा</translation>
 <translation id="9104396740804929809">वापर आणि निदान डेटा पाठवा. Google ला आपोआप निदान आणि डिव्हाइस आणि अ‍ॅप वापर डेटा पाठवून तुमचा Android अनुभव सुधारण्यात मदत करा. हे सिस्ट्म आणि अ‍ॅप स्थिरता आणि इतर सुधारणा करण्यात मदत करेल. काही एकत्रित केलेला डेटा Google अ‍ॅप्स आणि Android डेव्हलपर सारख्या भागीदारांना देखील मदत करेल. या सेटिंगची मालकाद्वारे अंमलबजावणी केली जाते. मालक या डिव्हाइससाठी निदान आणि वापर डेटा Google ला पाठवणे निवडू शकतो. जर तुमची अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सेटिंग सुरू केलेली असल्यास, हा डेटा तुमच्या Google खाते वर सेव्ह केला जाऊ शकतो. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation>
 <translation id="9109122242323516435">स्थान मोकळे करण्‍यासाठी, डिव्हाइस स्टोरेजमधून फायली हटवा.</translation>
+<translation id="9109283579179481106">मोबाइल नेटवर्कशी कनेक्ट करा</translation>
 <translation id="9111102763498581341">अनलॉक करा</translation>
 <translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation>
 <translation id="9112748030372401671">तुमचा वॉलपेपर बदला</translation>
@@ -5568,7 +5604,7 @@
 <translation id="988978206646512040">रिक्त सांकेतिक पासफ्रेझाची परवानगी नाही</translation>
 <translation id="992032470292211616">विस्‍तार, ॲप्स आणि थीम आपल्‍या डिव्‍हाइसची हानी करू शकतात. आपल्‍याला खात्री आहे की तुम्ही सुरू ठेवू इच्‍छिता?</translation>
 <translation id="992256792861109788">गुलाबी</translation>
-<translation id="992592832486024913">ChromeVox (वाचिक अभिप्राय) बंद करा</translation>
+<translation id="992592832486024913">ChromeVox (वाचिक फीडबॅक) अक्षम करा</translation>
 <translation id="992778845837390402">Linux बॅकअप सध्या प्रगतीपथावर आहे</translation>
 <translation id="993540765962421562">इंस्टॉलेशन प्रगतीपथावर आहे</translation>
 <translation id="994289308992179865">&amp;वळण</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 500eeb4..43935c0 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Masa mula</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Serlahkan kursor tetikus semasa kursor bergerak</translation>
-<translation id="7377169924702866686">Caps Lock dihidupkan.</translation>
 <translation id="7377451353532943397">Teruskan menyekat akses penderia</translation>
 <translation id="7378627244592794276">Tidak</translation>
 <translation id="73786666777299047">Buka Gedung Web Chrome</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">Pelayan tidak tersedia.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">Imej tidak tersedia. Cuba sebentar lagi.</translation>
-<translation id="8392234662362215700">Tekan Control-Shift-Space untuk menukar reka letak papan kekunci.</translation>
 <translation id="8392364544846746346">Tanya apabila tapak mahu mengedit fail atau folder pada peranti anda</translation>
 <translation id="8392451568018454956">Menu pilihan untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Hentikan pemalam</translation>
@@ -5179,7 +5177,6 @@
 <translation id="8656619792520327915">Tambah kunci keselamatan Bluetooth yang lain</translation>
 <translation id="8656768832129462377">Jangan periksa</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> berkongsi skrin dan audio anda dengan <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Tunggu sebentar</translation>
 <translation id="8660174278198826384">Hubungi pentadbir peranti untuk organisasi anda</translation>
 <translation id="8661290697478713397">Buka Pautan dalam Tetingkap Inko&amp;gnito</translation>
 <translation id="8662671328352114214">Sertai rangkaian <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 0d7e5af..94de5b1 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Starttijd</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">De muisaanwijzer markeren terwijl deze beweegt</translation>
-<translation id="7377169924702866686">Caps Lock is ingeschakeld.</translation>
 <translation id="7377451353532943397">Toegang tot sensoren blijven blokkeren</translation>
 <translation id="7378627244592794276">Nee</translation>
 <translation id="73786666777299047">Chrome Web Store openen</translation>
@@ -5006,7 +5005,6 @@
 <translation id="8390449457866780408">Server niet beschikbaar.</translation>
 <translation id="8391218455464584335">Lp</translation>
 <translation id="8391712576156218334">De afbeelding is niet beschikbaar. Probeer het later opnieuw.</translation>
-<translation id="8392234662362215700">Druk op Ctrl-Shift-spatiebalk om de toetsenbordindeling te wijzigen.</translation>
 <translation id="8392364544846746346">Vragen wanneer een site bestanden of mappen op je apparaat wil bewerken</translation>
 <translation id="8392451568018454956">Optiemenu voor <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Plug-in stoppen</translation>
@@ -5177,7 +5175,6 @@
 <translation id="8656619792520327915">Nog een Bluetooth-beveiligingssleutel toevoegen</translation>
 <translation id="8656768832129462377">Niet controleren</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> deelt je scherm en audio met <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Een ogenblik geduld</translation>
 <translation id="8660174278198826384">Neem contact op met de apparaatbeheerder binnen je organisatie</translation>
 <translation id="8661290697478713397">Link openen in inco&amp;gnitovenster</translation>
 <translation id="8662671328352114214">Deelnemen aan <ph name="TYPE" />-netwerk</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index a6128e9..e69f1682 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -4295,7 +4295,6 @@
 <translation id="7371006317849674875">Starttid</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Fremhev musepekeren når den beveger seg</translation>
-<translation id="7377169924702866686">Caps Lock er på.</translation>
 <translation id="7377451353532943397">Fortsett blokkering av sensortilgang</translation>
 <translation id="7378627244592794276">Nei takk</translation>
 <translation id="73786666777299047">Åpne Chrome Nettmarked</translation>
@@ -5002,7 +5001,6 @@
 <translation id="8390449457866780408">Tjeneren er ikke tilgjengelig.</translation>
 <translation id="8391218455464584335">Vinylplate</translation>
 <translation id="8391712576156218334">Bildet er ikke tilgjengelig. Prøv på nytt senere.</translation>
-<translation id="8392234662362215700">Trykk på Ctrl + Shift + mellomrom for å bytte tastaturoppsett.</translation>
 <translation id="8392364544846746346">Spør når nettsteder vil redigere filer eller mapper på enheten</translation>
 <translation id="8392451568018454956">Alternativmenyen for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Stopp programtillegg</translation>
@@ -5173,7 +5171,6 @@
 <translation id="8656619792520327915">Legg til en annen Bluetooth-sikkerhetsnøkkel</translation>
 <translation id="8656768832129462377">Ikke merk av</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> deler lyden og skjermen din med <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Vent litt</translation>
 <translation id="8660174278198826384">Kontakt enhetsadministratoren for organisasjonen din</translation>
 <translation id="8661290697478713397">Åpne linken i inko&amp;gnitovindu</translation>
 <translation id="8662671328352114214">Koble til <ph name="TYPE" />-nettverket</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 6c44a063..c7528cc 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Godzina rozpoczęcia</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Podświetlaj wskaźnik myszy, gdy się porusza</translation>
-<translation id="7377169924702866686">Caps Lock jest włączony.</translation>
 <translation id="7377451353532943397">Nadal blokuj dostęp do czujników</translation>
 <translation id="7378627244592794276">Nie</translation>
 <translation id="73786666777299047">Otwórz Chrome Web Store</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Serwer jest niedostępny.</translation>
 <translation id="8391218455464584335">Płyta winylowa</translation>
 <translation id="8391712576156218334">Obraz jest niedostępny. Spróbuj ponownie później.</translation>
-<translation id="8392234662362215700">Naciśnij Control+Shift+spacja, by przełączyć układ klawiatury.</translation>
 <translation id="8392364544846746346">Pytaj, gdy witryna chce edytować pliki lub foldery na urządzeniu</translation>
 <translation id="8392451568018454956">Menu opcji dla <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Zatrzymaj wtyczkę</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Dodaj inny klucz bezpieczeństwa Bluetooth</translation>
 <translation id="8656768832129462377">Nie sprawdzaj</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> udostępnia ekran i dźwięk karcie <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Chwileczkę</translation>
 <translation id="8660174278198826384">Skontaktuj się z administratorem urządzeń w swojej organizacji</translation>
 <translation id="8661290697478713397">Otwórz link w oknie inco&amp;gnito</translation>
 <translation id="8662671328352114214">Połącz z siecią <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index d3c3ebe..12b8db6 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -4302,7 +4302,6 @@
 <translation id="7371006317849674875">Horário de início</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Destacar o cursor do mouse quando ele estiver se movendo</translation>
-<translation id="7377169924702866686">O Caps Lock está ativado.</translation>
 <translation id="7377451353532943397">Continuar bloqueando o acesso ao sensor</translation>
 <translation id="7378627244592794276">Não</translation>
 <translation id="73786666777299047">Abrir a Chrome Web Store</translation>
@@ -5009,7 +5008,6 @@
 <translation id="8390449457866780408">Servidor não disponível.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">Imagem indisponível. Tente novamente mais tarde.</translation>
-<translation id="8392234662362215700">Pressione Control-Shift-Barra de espaço para trocar o layout do teclado.</translation>
 <translation id="8392364544846746346">Perguntar quando um site quiser editar arquivos ou pastas do dispositivo</translation>
 <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Parar plug-in</translation>
@@ -5180,7 +5178,6 @@
 <translation id="8656619792520327915">Adicionar outra chave de segurança Bluetooth</translation>
 <translation id="8656768832129462377">Não verificar</translation>
 <translation id="8658645149275195032">O app <ph name="APP_NAME" /> está compartilhando sua tela e áudio com <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Aguarde um instante</translation>
 <translation id="8660174278198826384">Fale com o administrador de dispositivos da sua organização</translation>
 <translation id="8661290697478713397">Abrir link na janela &amp;anônima</translation>
 <translation id="8662671328352114214">Entrar na rede <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index e636e41b..8c8bd62f 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Hora de início</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Realçar o cursor do rato ao ser movido</translation>
-<translation id="7377169924702866686">Caps Lock ativado.</translation>
 <translation id="7377451353532943397">Continuar a impedir o acesso aos sensores</translation>
 <translation id="7378627244592794276">Não</translation>
 <translation id="73786666777299047">Abrir a Web Store do Chrome</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">O servidor não se encontra disponível.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">A imagem não está disponível. Tente novamente mais tarde.</translation>
-<translation id="8392234662362215700">Prima Control-Shift-Espaço para mudar o esquema de teclado.</translation>
 <translation id="8392364544846746346">Perguntar quando um site pretender editar ficheiros ou pastas no dispositivo</translation>
 <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Parar plug-in</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Adicionar outra chave de segurança de Bluetooth</translation>
 <translation id="8656768832129462377">Não verificar</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> está a partilhar o ecrã e o áudio com <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Aguarde um momento</translation>
 <translation id="8660174278198826384">Contacte o administrador do dispositivo da sua entidade</translation>
 <translation id="8661290697478713397">Abrir Link numa Janela de Nave&amp;gação Anónima</translation>
 <translation id="8662671328352114214">Associar à rede <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 29574a0e..1709f46 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Ora de începere</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Evidențiază cursorul mouse-ului când se mișcă</translation>
-<translation id="7377169924702866686">Tasta Caps Lock este activată.</translation>
 <translation id="7377451353532943397">Blochează în continuare accesul la senzori</translation>
 <translation id="7378627244592794276">Nu</translation>
 <translation id="73786666777299047">Deschide Magazinul web Chrome</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Server indisponibil.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">Imaginea nu este disponibilă. Încearcă din nou mai târziu.</translation>
-<translation id="8392234662362215700">Apasă tastele Control-Shift-Spațiu pentru a comuta aranjamentul tastaturii.</translation>
 <translation id="8392364544846746346">Întreabă când un site vrea să modifice fișiere sau dosare de pe dispozitiv</translation>
 <translation id="8392451568018454956">Meniu cu opțiuni pentru <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Oprește pluginul</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Adaugă altă cheie de securitate Bluetooth</translation>
 <translation id="8656768832129462377">Nu verifica</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> trimite conținutul de pe ecran și conținutul audio către <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">O secundă</translation>
 <translation id="8660174278198826384">Ia legătura cu administratorul dispozitivului din organizația ta</translation>
 <translation id="8661290697478713397">Deschide linkul într-o fereastră inco&amp;gnito</translation>
 <translation id="8662671328352114214">Conectează-te la rețeaua <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 52feedb..f46f947 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -4298,7 +4298,6 @@
 <translation id="7371006317849674875">Время начала</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Выделять курсор, когда он движется</translation>
-<translation id="7377169924702866686">Включен режим Caps Lock.</translation>
 <translation id="7377451353532943397">Всегда запрещать использовать датчики</translation>
 <translation id="7378627244592794276">Нет</translation>
 <translation id="73786666777299047">Открыть Интернет-магазин Chrome</translation>
@@ -5004,7 +5003,6 @@
 <translation id="8390449457866780408">Сервер недоступен.</translation>
 <translation id="8391218455464584335">Виниловая пластинка</translation>
 <translation id="8391712576156218334">Фоновое изображение недоступно. Повторите попытку позже.</translation>
-<translation id="8392234662362215700">Нажмите Ctrl + Shift + ПРОБЕЛ, чтобы переключить раскладку клавиатуры.</translation>
 <translation id="8392364544846746346">Запрашивать разрешение на изменение сайтами файлов или папок на устройстве</translation>
 <translation id="8392451568018454956">Меню параметров пользователя "<ph name="USER_EMAIL_ADDRESS" />"</translation>
 <translation id="8393511274964623038">Остановить плагин</translation>
@@ -5175,7 +5173,6 @@
 <translation id="8656619792520327915">Добавить другой электронный Bluetooth-ключ</translation>
 <translation id="8656768832129462377">Не проверять</translation>
 <translation id="8658645149275195032">Приложение "<ph name="APP_NAME" />" предоставило сайту <ph name="TAB_NAME" /> доступ к экрану и аудио.</translation>
-<translation id="8659875081143553823">Подождите…</translation>
 <translation id="8660174278198826384">Обратитесь к администратору устройства.</translation>
 <translation id="8661290697478713397">Открыть ссылку в режиме инкогнито</translation>
 <translation id="8662671328352114214">Новая сеть <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 3345c00e..65855bed 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -4299,7 +4299,6 @@
 <translation id="7371006317849674875">Čas začiatku</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Zvýrazňovať kurzor myši, keď sa hýbe</translation>
-<translation id="7377169924702866686">Kláves Caps Lock je zapnutý.</translation>
 <translation id="7377451353532943397">Naďalej blokovať prístup k senzorom</translation>
 <translation id="7378627244592794276">Nie</translation>
 <translation id="73786666777299047">Otvoriť Internetový obchod Chrome</translation>
@@ -5005,7 +5004,6 @@
 <translation id="8390449457866780408">Server je nedostupný.</translation>
 <translation id="8391218455464584335">Vinyl</translation>
 <translation id="8391712576156218334">Obrázok nie je k dispozícii. Skúste to znova neskôr.</translation>
-<translation id="8392234662362215700">Rozloženie klávesnice zmeníte stlačením klávesov Ctrl + Shift + medzerník.</translation>
 <translation id="8392364544846746346">Pýtať sa, keď chce nejaký web upraviť súbory alebo priečinky vo vašom zariadení</translation>
 <translation id="8392451568018454956">Ponuka možností pre používateľa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ukončiť doplnok</translation>
@@ -5176,7 +5174,6 @@
 <translation id="8656619792520327915">Pridať ďalší bezpečnostný kľúč Bluetooth</translation>
 <translation id="8656768832129462377">Nekontrolovať</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> zdieľa vašu obrazovku a zvuk s kartou <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Moment</translation>
 <translation id="8660174278198826384">Kontaktujte správcu zariadenia svojej organizácie</translation>
 <translation id="8661290697478713397">Otvoriť odkaz v okne inko&amp;gnito</translation>
 <translation id="8662671328352114214">Pridanie sa k sieti <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 3ba05f5..7cc1413 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -4302,7 +4302,6 @@
 <translation id="7371006317849674875">Začetni čas</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Označitev miškinega kazalca med premikanjem</translation>
-<translation id="7377169924702866686">Tipka Caps Lock je vklopljena.</translation>
 <translation id="7377451353532943397">Še naprej preprečuj dostop do tipal</translation>
 <translation id="7378627244592794276">Ne</translation>
 <translation id="73786666777299047">Odpiranje Spletne trgovine Chrome</translation>
@@ -5009,7 +5008,6 @@
 <translation id="8390449457866780408">Strežnik ni na voljo.</translation>
 <translation id="8391218455464584335">Vinilna plošča</translation>
 <translation id="8391712576156218334">Slika ni na voljo. Poskusite znova pozneje.</translation>
-<translation id="8392234662362215700">Pritisnite Control + Shift + preslednico, če želite preklopiti razporeditev tipkovnice.</translation>
 <translation id="8392364544846746346">Vprašaj, ko želi spletno mesto urediti datoteke ali mape v vaši napravi</translation>
 <translation id="8392451568018454956">Meni z možnostmi za <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ustavi vtičnik</translation>
@@ -5180,7 +5178,6 @@
 <translation id="8656619792520327915">Dodajte drug varnostni ključ Bluetooth</translation>
 <translation id="8656768832129462377">Ne preverjaj</translation>
 <translation id="8658645149275195032">Aplikacija <ph name="APP_NAME" /> je v skupno rabo z zavihkom <ph name="TAB_NAME" /> dala vaš zaslon in zvok.</translation>
-<translation id="8659875081143553823">Samo trenutek</translation>
 <translation id="8660174278198826384">Obrnite se na skrbnika naprave za organizacijo</translation>
 <translation id="8661290697478713397">Odpri povezavo v oknu brez bele&amp;ženja zgodovine</translation>
 <translation id="8662671328352114214">Pridružitev omrežju <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 51e6eb4..b34efc0 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -4299,7 +4299,6 @@
 <translation id="7371006317849674875">Време почетка</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Истичи курсор миша док се креће</translation>
-<translation id="7377169924702866686">Caps Lock је укључен.</translation>
 <translation id="7377451353532943397">Настави да блокираш приступ сензорима</translation>
 <translation id="7378627244592794276">Не</translation>
 <translation id="73786666777299047">Отворите Chrome веб-продавницу</translation>
@@ -5006,7 +5005,6 @@
 <translation id="8390449457866780408">Сервер је недоступан.</translation>
 <translation id="8391218455464584335">Грамофонска плоча</translation>
 <translation id="8391712576156218334">Слика је недоступна. Пробајте поново касније.</translation>
-<translation id="8392234662362215700">Притисните тастере Control-Shift-Space да бисте променили распоред тастатуре.</translation>
 <translation id="8392364544846746346">Питај када сајт жели да измени датотеке или директоријуме на уређају</translation>
 <translation id="8392451568018454956">Мени са опцијама за <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Заустави додатну компоненту</translation>
@@ -5177,7 +5175,6 @@
 <translation id="8656619792520327915">Додај други Bluetooth безбедносни кључ</translation>
 <translation id="8656768832129462377">Не проверавај</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> дели екран и звук са <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Само тренутак</translation>
 <translation id="8660174278198826384">Обратите се администратору уређаја за организацију</translation>
 <translation id="8661290697478713397">Отвори линк у прозору за пре&amp;гледање без архивирања</translation>
 <translation id="8662671328352114214">Придружите се <ph name="TYPE" /> мрежи</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index a31ffc0..06754a5 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Starttid</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Markera muspekaren när den är i rörelse</translation>
-<translation id="7377169924702866686">Caps Lock är på.</translation>
 <translation id="7377451353532943397">Fortsätt att blockera sensoråtkomst</translation>
 <translation id="7378627244592794276">Nej</translation>
 <translation id="73786666777299047">Öppna Chrome Web Store</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Servern är inte tillgänglig.</translation>
 <translation id="8391218455464584335">Vinylskiva</translation>
 <translation id="8391712576156218334">Bilden är inte tillgänglig. Försök igen senare.</translation>
-<translation id="8392234662362215700">Tryck på Ctrl + Skift + blanksteg om du vill byta tangentbordslayout.</translation>
 <translation id="8392364544846746346">Fråga när en webbplats vill kunna redigera filer eller mappar på enheten</translation>
 <translation id="8392451568018454956">Alternativmenyn för <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Stoppa pluginprogram</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Lägg till ytterligare en Bluetooth-säkerhetsnyckel</translation>
 <translation id="8656768832129462377">Kontrollera inte</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> delar skärmen och ljudet med <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Ett ögonblick</translation>
 <translation id="8660174278198826384">Kontakta organisationens enhetsadministratör</translation>
 <translation id="8661290697478713397">Öppna länk i inko&amp;gnitofönster</translation>
 <translation id="8662671328352114214">Anslut till <ph name="TYPE" />-nätverket</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 817ffe0e..5b3c360 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -4293,7 +4293,6 @@
 <translation id="7371006317849674875">Wakati wa kuanza</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Angazia kiteuzi cha kipanya kinaposonga</translation>
-<translation id="7377169924702866686">Caps Lock imewashwa.</translation>
 <translation id="7377451353532943397">Endelea kuzuia idhini ya kufikia kitambuzi</translation>
 <translation id="7378627244592794276">La</translation>
 <translation id="73786666777299047">Fungua Duka la Chrome kwenye Wavuti</translation>
@@ -5002,7 +5001,6 @@
 <translation id="8390449457866780408">Seva haipatikani.</translation>
 <translation id="8391218455464584335">Ngozi ya plastiki</translation>
 <translation id="8391712576156218334">Picha haipatikani. Jaribu tena baadaye.</translation>
-<translation id="8392234662362215700">Gusa Control-Shift-Space ili ubadilishe muundo wa kibodi.</translation>
 <translation id="8392364544846746346">Uulizwe wakati tovuti inataka kubadilisha faili au folda kwenye kifaa chako</translation>
 <translation id="8392451568018454956">Menyu ya chaguo za <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Simamisha programu jalizi</translation>
@@ -5173,7 +5171,6 @@
 <translation id="8656619792520327915">Ongeza ufunguo mwingine wa usalama wa Bluetooth</translation>
 <translation id="8656768832129462377">Usikague</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> inashiriki skrini na sauti yako pamoja na <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Subiri kidogo</translation>
 <translation id="8660174278198826384">Wasiliana na msimamizi wa kifaa katika shirika lako</translation>
 <translation id="8661290697478713397">Fungua Kiungo katika Dirisha &amp;Fiche</translation>
 <translation id="8662671328352114214">Jiunge na mtandao wa <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 67ce6b2..15d86b48 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -302,7 +302,7 @@
 <translation id="1444628761356461360">இந்த அமைப்பானது சாதனத்தின் உரிமையாளரால் <ph name="OWNER_EMAIL" /> நிர்வகிக்கப்படுகிறது.</translation>
 <translation id="144518587530125858">தீமிற்காக '<ph name="IMAGE_PATH" />' ஐ ஏற்ற முடியவில்லை.</translation>
 <translation id="1445693676523799095">இதற்குச் சிறிது நேரம் ஆகலாம்</translation>
-<translation id="1450011005989029586">நீங்கள் பயன்படுத்தும் தளத்திலோ ஆப்ஸிலோ நிகழ்ந்த தரவு மீறலால் உங்களின் கடவுச்சொல் வெளியாகிவிட்டது. <ph name="ORIGIN" /> என்ற தளத்தில் <ph name="BOLD" /> Chrome பரிந்துரைக்கிறது.</translation>
+<translation id="1450011005989029586">நீங்கள் பயன்படுத்தும் தளத்திலோ ஆப்ஸிலோ நிகழ்ந்த தரவு மீறலால் உங்களின் கடவுச்சொல் வெளியாகிவிட்டது. <ph name="ORIGIN" /> என்ற தளத்தில் இப்போது <ph name="BOLD" /> Chrome பரிந்துரைக்கிறது.</translation>
 <translation id="1451375123200651445">இணையப்பக்கம், ஒற்றைக் கோப்பு</translation>
 <translation id="1451917004835509682">மேற்பார்வையிடப்படும் பயனரைச் சேர்</translation>
 <translation id="1454223536435069390">ஸ்கிரீன் ஷாட்டை எடு</translation>
@@ -784,7 +784,7 @@
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> போல் தெரிகிறது</translation>
 <translation id="2156283799932971644">Googleளுக்குச் சில சாதனத் தகவல்களையும் பக்க உள்ளடக்கத்தையும் அனுப்புவதன் மூலம் பாதுகாப்பான உலாவலை மேம்படுத்த உதவலாம்.</translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
-<translation id="2157474325782140681">கூடுதல் அம்சங்களைப் பெற இந்த Chromebookகுடன் இணங்குமாறு வடிவமைக்கப்பட்ட டாக்கிங் ஸ்டேஷனைப் பயன்படுத்தவும்.</translation>
+<translation id="2157474325782140681">கூடுதல் அம்சங்களைப் பெற இந்த Chromebookகுடன் இணங்குமாறு வடிவமைக்கப்பட்ட Dell டாக்கிங் ஸ்டேஷனைப் பயன்படுத்தவும்.</translation>
 <translation id="215753907730220065">முழுத்திரையிலிருந்து வெளியேறு</translation>
 <translation id="2157875535253991059">இந்தப் பக்கம் இப்போது முழுத் திரையில்.</translation>
 <translation id="216169395504480358">வைஃபை ஐச் சேர்...</translation>
@@ -969,7 +969,7 @@
 <translation id="2423578206845792524">படத்தை இவ்வாறு சே&amp;மி...</translation>
 <translation id="2428510569851653187">தாவல் சிதைந்த போது, நீங்கள் என்ன செய்து கொண்டிருந்தீர்கள் என்பதை விளக்கவும்</translation>
 <translation id="2431027948063157455">Google அசிஸ்டண்ட்டை ஏற்ற முடியவில்லை. உங்கள் நெட்வொர்க் இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation>
-<translation id="243242775089461296">இந்தத் தளத்திற்கு மூன்றாம் தரப்பு குக்கீயைத் தடுக்கும் அம்சம் முடக்கப்பட்டுள்ளது</translation>
+<translation id="243242775089461296">மூன்றாம் தரப்பினரின் குக்கீயைத் தடுக்கும் அம்சம் இந்தத் தளத்திற்கு முடக்கப்பட்டுள்ளது</translation>
 <translation id="2432753757290432042">Linux (பீட்டா) புதுப்பிப்பு தேவை</translation>
 <translation id="2433452467737464329">பக்கத்தைத் தானாகவே புதுப்பிக்க URLலில் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">தோற்றம்</translation>
@@ -1060,7 +1060,7 @@
 <translation id="2534460670861217804">பாதுகாப்பான HTTP ப்ராக்ஸி</translation>
 <translation id="253557089021624350">கீப்அலைவ் கவுண்ட்</translation>
 <translation id="2535799430745250929">செல்லுலார் நெட்வொர்க் எதுவுமில்லை</translation>
-<translation id="2536052711541161459">பாயிண்டர் துரிதப்படுத்தி</translation>
+<translation id="2536052711541161459">பாயிண்டர் துரிதப்படுத்தல்</translation>
 <translation id="2537395079978992874">பின்வரும் கோப்புகளையும் கோப்புறைகளையும் <ph name="ORIGIN" /> தளத்தால் பார்க்கவும் திருத்தவும் முடியும்</translation>
 <translation id="2538361623464451692">ஒத்திசைவு முடக்கப்பட்டது</translation>
 <translation id="2540449034743108469">நீட்டிப்பு நடவடிக்கைகளை கவனிக்க "தொடங்கு" என்பதை அழுத்தவும்</translation>
@@ -1281,7 +1281,7 @@
 <translation id="2849936225196189499">சிக்கலான</translation>
 <translation id="2850541429955027218">தீமினைச் சேர்</translation>
 <translation id="2851634818064021665">இந்தத் தளத்தைப் பார்ப்பதற்கு அனுமதி தேவை</translation>
-<translation id="2854896010770911740">மூன்றாம் தரப்பு குக்கீகளை அகற்று</translation>
+<translation id="2854896010770911740">மூன்றாம் தரப்பினரின் குக்கீகளை அகற்று</translation>
 <translation id="2858138569776157458">பிரபலமானவை</translation>
 <translation id="2859806420264540918">குறுக்கிடும் அல்லது தவறாக வழிநடத்தும் விளம்பரங்களை இந்தத் தளம் காண்பிக்கிறது.</translation>
 <translation id="2861301611394761800">கணினிப் புதுப்பிப்பு முடிந்தது. கணினியை மறுதொடக்கம் செய்க.</translation>
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">தொடக்க நேரம்</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">மவுஸ் கர்சரை நகர்த்தும் போது, அதை ஹைலைட் செய்</translation>
-<translation id="7377169924702866686">Caps Lock இயக்கத்தில் உள்ளது.</translation>
 <translation id="7377451353532943397">தொடர்ந்து சென்சார் அணுகலைத் தடு</translation>
 <translation id="7378627244592794276">வேண்டாம்</translation>
 <translation id="73786666777299047">Chrome இணைய அங்காடியைத் திற</translation>
@@ -4453,7 +4452,7 @@
 <translation id="7625568159987162309">பல்வேறு தளங்களிலும் சேமித்த அனுமதிகளையும் தரவையும் காட்டு</translation>
 <translation id="7629827748548208700">தாவல்: <ph name="TAB_NAME" /></translation>
 <translation id="7631014249255418691">Linux ஆப்ஸ் &amp; கோப்புகள் வெற்றிகரமாக காப்புப் பிரதி எடுக்கப்பட்டன</translation>
-<translation id="7631205654593498032">உங்கள் சாதனங்களை இணைக்கும்போது <ph name="DEVICE_TYPE" /> இவற்றைச் செய்ய முடியும் என்று ஏற்கிறீர்கள்:</translation>
+<translation id="7631205654593498032">உங்கள் சாதனங்களை இணைக்கும்போது <ph name="DEVICE_TYPE" /> இவற்றைச் செய்யலாம் என்று ஏற்கிறீர்கள்:</translation>
 <translation id="7631887513477658702">&amp;எப்போதும் இந்த வகை கோப்புகளைத் திற</translation>
 <translation id="7632948528260659758">பின்வரும் கியோஸ்க் பயன்பாடுகளைப் புதுப்பிப்பதில் தோல்வி:</translation>
 <translation id="763632859238619983">கட்டண ஹேண்ட்லர்களை நிறுவுவதற்கு எந்தத் தளத்தையும் அனுமதிக்காதே</translation>
@@ -5008,7 +5007,6 @@
 <translation id="8390449457866780408">சேவையகம் கிடைக்கவில்லை.</translation>
 <translation id="8391218455464584335">வினைல்</translation>
 <translation id="8391712576156218334">படம் இல்லை. பின்னர் மீண்டும் முயலவும்.</translation>
-<translation id="8392234662362215700">விசைப்பலகை தளவமைப்பை மாற்ற, கன்ட்ரோல்-ஷிஃப்ட்-ஸ்பேஸ் விசையை அழுத்தவும்.</translation>
 <translation id="8392364544846746346">எனது சாதனத்திலுள்ள கோப்புகளையோ கோப்புறைகளோ ஒரு தளம் மாற்ற விரும்பும்போது அனுமதி கேள்</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> க்கான விருப்பத்தேர்வுகள் மெனு</translation>
 <translation id="8393511274964623038">செருகுநிரலை நிறுத்து</translation>
@@ -5179,7 +5177,6 @@
 <translation id="8656619792520327915">மற்றொரு புளூடூத் பாதுகாப்பு விசையைச் சேர்</translation>
 <translation id="8656768832129462377">சோதிக்காதே</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் உங்கள் திரையையும் ஆடியோவையும் பகிர்கிறது.</translation>
-<translation id="8659875081143553823">சற்று காத்திருக்கவும்</translation>
 <translation id="8660174278198826384">உங்கள் நிறுவனத்தின் சாதன நிர்வாகியைத் தொடர்புகொள்ளவும்</translation>
 <translation id="8661290697478713397">மறை&amp;நிலை சாளரத்தில் இணைப்பைத் திற</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> நெட்வொர்க்கில் சேர்தல்</translation>
@@ -5242,7 +5239,7 @@
 <translation id="8732212173949624846">நீங்கள் உள்நுழைந்துள்ள எல்லா சாதனங்களிலிருக்கும் உலாவல் வரலாற்றைப் படிக்கலாம் மற்றும் மாற்றலாம்</translation>
 <translation id="8732844209475700754">தனியுரிமை, பாதுகாப்பு, தரவுச் சேகரிப்பு ஆகியவை தொடர்பான மேலும் அமைப்புகள்</translation>
 <translation id="8734073480934656039">இந்த அமைப்பை இயக்குவது, தொடக்கத்தில் கியோஸ்க் பயன்பாடுகள் தானாக தொடங்குவதை அனுமதிக்கும்.</translation>
-<translation id="8734674662128056360">மூன்றாம் தரப்பு குக்கீயைத் தடை செய்யும்</translation>
+<translation id="8734674662128056360">மூன்றாம் தரப்பினரின் குக்கீயைத் தடை செய்யும்</translation>
 <translation id="873545264931343897"><ph name="PLUGIN_NAME" /> புதுப்பிக்கப்பட்டதும், அதைச் செயல்படுத்த பக்கத்தை ரெஃப்ரெஷ் செய்யவும்</translation>
 <translation id="8736288397686080465">இந்தத் தளம் பின்புலத்தில் புதுப்பிக்கப்படும்.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" />க்குப் பதிலாக <ph name="PROTOCOL" /> இணைப்புகளைத் திறக்கும்</translation>
@@ -5320,7 +5317,7 @@
 <translation id="8828933418460119530">DNS பெயர்</translation>
 <translation id="883062543841130884">மாற்றுகள்</translation>
 <translation id="8830796635868321089">தற்போதைய பிராக்சி அமைப்புகளைப் பயன்படுத்துவதில் புதுப்பிப்பு சரிபார்ப்பு தோல்வியடைந்தது. உங்கள் <ph name="PROXY_SETTINGS_LINK_START" />பிராக்சி அமைப்புகளைச்<ph name="PROXY_SETTINGS_LINK_END" /> சரிசெய்யவும்.</translation>
-<translation id="8831140208248705279">உங்கள் <ph name="DEVICE_TYPE" /> சாதனத்தையும் Android மொபைலையும் இணைத்தால் மேலும் பல வசதிகளைப் பெறலாம். அவற்றை இணைப்பதால் உங்கள் கம்ப்யூட்டரிலிருந்து மெசேஜ் அனுப்பலாம், இணைய இணைப்பைப் பகிரலாம், உங்கள் மொபைல் மூலம் <ph name="DEVICE_TYPE" /> சாதனத்தைத் திறக்கலாம்.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
+<translation id="8831140208248705279">உங்கள் <ph name="DEVICE_TYPE" /> சாதனத்தையும் Android மொபைலையும் இணைத்தால் மேலும் பல வசதிகளைப் பெறலாம். அவற்றை இணைப்பதால் உங்கள் கம்ப்யூட்டரிலிருந்து மெசேஜ் அனுப்பலாம், இணைய இணைப்பைப் பகிரலாம், உங்கள் மொபைல் மூலம் <ph name="DEVICE_TYPE" /> சாதனத்தைத் திறக்கலாம்.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="8831664945713891930">நீட்டிப்புகள் அமைப்புகளைத் திற</translation>
 <translation id="8834039744648160717">நெட்வொர்க் உள்ளமைவைக் கட்டுப்படுத்துவது: <ph name="USER_EMAIL" />.</translation>
 <translation id="8838770651474809439">ஹம்பர்கர்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 87d4670..91c6a69 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -4266,7 +4266,6 @@
 <translation id="7371006317849674875">ప్రారంభ సమయం</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">మౌస్ కర్సర్ జరుగుతున్నప్పుడు దానిని హైలైట్ చేయి</translation>
-<translation id="7377169924702866686">Caps Lock ఆన్‌లో ఉంది.</translation>
 <translation id="7377451353532943397">సెన్సార్ యాక్సెస్‌ను బ్లాక్ చేయడం కొనసాగించు</translation>
 <translation id="7378627244592794276">వద్దు</translation>
 <translation id="73786666777299047">Chrome వెబ్ స్టోర్‌ను తెరువు</translation>
@@ -4961,7 +4960,6 @@
 <translation id="8390449457866780408">సర్వర్ అందుబాటులో లేదు.</translation>
 <translation id="8391218455464584335">వినైల్</translation>
 <translation id="8391712576156218334">చిత్రం అందుబాటులో లేదు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="8392234662362215700">కీబోర్డ్ లేఅవుట్‌ను మార్చడానికి Control-Shift-Space నొక్కండి.</translation>
 <translation id="8392364544846746346">మీ పరికరంలోని ఫైల్‌లు లేదా ఫోల్డర్‌లను సైట్ సవరించాలనుకున్నప్పుడు అనుమతిని అడుగుతుంది</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> కోసం ఎంపికల మెను</translation>
 <translation id="8393511274964623038">ప్లగ్ఇన్‌‌ను ఆపివేయి</translation>
@@ -5131,7 +5129,6 @@
 <translation id="8656619792520327915">మరొక బ్లూటూత్ భద్రతా కీని జోడించు</translation>
 <translation id="8656768832129462377">తనిఖీ చేయవద్దు</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> మీ స్క్రీన్ మరియు ఆడియోను <ph name="TAB_NAME" />తో భాగస్వామ్యం చేస్తోంది.</translation>
-<translation id="8659875081143553823">ఒక క్షణం వేచి ఉండండి</translation>
 <translation id="8660174278198826384">మీ సంస్థ యొక్క పరికర నిర్వాహకుడిని సంప్రదించండి</translation>
 <translation id="8661290697478713397">అజ్ఞా&amp;త విండోలో లింక్‌ను తెరువు</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> నెట్‌వర్క్‌లో చేరండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 72f44371..6ddeb50 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">เวลาเริ่มต้น</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">ไฮไลต์เคอร์เซอร์เมาส์เมื่อขยับ</translation>
-<translation id="7377169924702866686">Caps Lock เปิดอยู่</translation>
 <translation id="7377451353532943397">บล็อกการเข้าถึงเซ็นเซอร์ต่อไป</translation>
 <translation id="7378627244592794276">ไม่</translation>
 <translation id="73786666777299047">เปิด Chrome เว็บสโตร์</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">เซิร์ฟเวอร์ไม่พร้อมใช้งาน</translation>
 <translation id="8391218455464584335">แผ่นเสียง</translation>
 <translation id="8391712576156218334">รูปภาพไม่พร้อมใช้งาน โปรดลองอีกครั้งภายหลัง</translation>
-<translation id="8392234662362215700">กด Control-Shift-Space เพื่อสลับรูปแบบแป้นพิมพ์</translation>
 <translation id="8392364544846746346">ถามเมื่อเว็บไซต์ต้องการแก้ไขไฟล์หรือโฟลเดอร์ในอุปกรณ์</translation>
 <translation id="8392451568018454956">เมนูตัวเลือกสำหรับ <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">หยุดปลั๊กอิน</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">เพิ่มคีย์ความปลอดภัยบลูทูธอีกอัน</translation>
 <translation id="8656768832129462377">ไม่ต้องตรวจสอบ</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> กำลังแชร์หน้าจอและเสียงของคุณกับ <ph name="TAB_NAME" /></translation>
-<translation id="8659875081143553823">รอสักครู่</translation>
 <translation id="8660174278198826384">ติดต่อผู้ดูแลระบบอุปกรณ์ขององค์กร</translation>
 <translation id="8661290697478713397">เปิดลิงก์ในหน้าต่าง&amp;ที่ไม่ระบุตัวตน</translation>
 <translation id="8662671328352114214">เข้าร่วมเครือข่าย <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 3bdb8326..2b0db80 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4301,7 +4301,6 @@
 <translation id="7371006317849674875">Başlangıç zamanı</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Hareket ederken fare imlecini vurgula</translation>
-<translation id="7377169924702866686">Caps Lock açık.</translation>
 <translation id="7377451353532943397">Sensör erişimini engellemeye devam et</translation>
 <translation id="7378627244592794276">Hayır</translation>
 <translation id="73786666777299047">Chrome Web Mağazası'nı açın</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Sunucu kullanılamıyor.</translation>
 <translation id="8391218455464584335">Vinil</translation>
 <translation id="8391712576156218334">Görüntü kullanılamıyor. Daha sonra tekrar deneyin.</translation>
-<translation id="8392234662362215700">Klavye düzenini değiştirmek için Control-Üst Karakter-Boşluk tuşlarına basın.</translation>
 <translation id="8392364544846746346">Bir site, cihazımdaki dosyaları veya klasörleri düzenlemek istediğinde sor</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> seçenekler menüsü</translation>
 <translation id="8393511274964623038">Eklentiyi durdur</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Başka bir Bluetooth güvenlik anahtarı ekle</translation>
 <translation id="8656768832129462377">Kontrol etme</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" />, ekranınızı ve sesinizi <ph name="TAB_NAME" /> ile paylaşıyor.</translation>
-<translation id="8659875081143553823">Bir saniye</translation>
 <translation id="8660174278198826384">Kuruluşunuz için cihaz yöneticisine başvurun</translation>
 <translation id="8661290697478713397">Bağlantıyı Giz&amp;li Pencere'de Aç</translation>
 <translation id="8662671328352114214"><ph name="TYPE" /> ağına katılın</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index add3142..4f84811 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Час початку</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Підсвічувати курсор миші під час руху</translation>
-<translation id="7377169924702866686">Клавішу Caps Lock увімкнено.</translation>
 <translation id="7377451353532943397">Продовжити блокувати доступ до датчиків</translation>
 <translation id="7378627244592794276">Ні</translation>
 <translation id="73786666777299047">Відкрити Веб-магазин Chrome</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Сервер не доступний.</translation>
 <translation id="8391218455464584335">Вініл</translation>
 <translation id="8391712576156218334">Зображення недоступне. Повторіть спробу пізніше.</translation>
-<translation id="8392234662362215700">Натисніть комбінацію клавіш Control-Shift-Space, щоб змінити розкладку клавіатури.</translation>
 <translation id="8392364544846746346">Запитувати, коли сайт хоче змінювати файли або папки на пристрої</translation>
 <translation id="8392451568018454956">Меню параметрів для <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Зупинити роботу плагіна</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Додати інший ключ безпеки Bluetooth</translation>
 <translation id="8656768832129462377">Не перевіряти</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> транслює ваш екран і аудіо на вкладку <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Зачекайте</translation>
 <translation id="8660174278198826384">Зв'яжіться з адміністратором пристрою своєї організації</translation>
 <translation id="8661290697478713397">Відкрити посилання в аноні&amp;мному вікні</translation>
 <translation id="8662671328352114214">Під’єднатися до мережі <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 0aa5624..7f0f844 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -529,7 +529,7 @@
 <translation id="1764226536771329714">beta</translation>
 <translation id="176587472219019965">Cửa sổ &amp;Mới</translation>
 <translation id="1766575458646819543">Đã thoát chế độ toàn màn hình</translation>
-<translation id="1766957085594317166">Lưu các mật khẩu vào Tài khoản Google của bạn một cách an toàn để bạn không phải nhập lại mật khẩu nữa</translation>
+<translation id="1766957085594317166">Lưu mật khẩu vào Tài khoản Google của bạn một cách an toàn để bạn không phải nhập lại mật khẩu nữa</translation>
 <translation id="1768278914020124551">Rất tiếc! Đã xảy ra lỗi khi liên hệ với máy chủ đăng nhập. Vui lòng kiểm tra kết nối mạng của bạn và tên miền, sau đó thử lại.</translation>
 <translation id="1769104665586091481">Mở Liên kết bằng Cửa sổ &amp;Mới</translation>
 <translation id="1773212559869067373">Chứng chỉ xác thực bị từ chối cục bộ</translation>
@@ -4300,7 +4300,6 @@
 <translation id="7371006317849674875">Thời gian bắt đầu</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">Đánh dấu con trỏ chuột khi đang di chuyển</translation>
-<translation id="7377169924702866686">Caps Lock đang bật.</translation>
 <translation id="7377451353532943397">Tiếp tục chặn quyền sử dụng cảm biến</translation>
 <translation id="7378627244592794276">Không</translation>
 <translation id="73786666777299047">Mở cửa hàng Chrome trực tuyến</translation>
@@ -5007,7 +5006,6 @@
 <translation id="8390449457866780408">Máy chủ không khả dụng.</translation>
 <translation id="8391218455464584335">Vinyl</translation>
 <translation id="8391712576156218334">Không có hình ảnh. Hãy thử lại sau.</translation>
-<translation id="8392234662362215700">Ấn Control-Shift-Space để chuyển đổi bố cục bàn phím.</translation>
 <translation id="8392364544846746346">Hỏi khi một trang web muốn chỉnh sửa tệp hoặc thư mục trên thiết bị</translation>
 <translation id="8392451568018454956">Menu tùy chọn dành cho <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8393511274964623038">Ngừng plugin</translation>
@@ -5178,7 +5176,6 @@
 <translation id="8656619792520327915">Thêm khóa bảo mật Bluetooth khác</translation>
 <translation id="8656768832129462377">Không kiểm tra</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> đang chia sẻ màn hình và âm thanh của bạn với <ph name="TAB_NAME" />.</translation>
-<translation id="8659875081143553823">Hãy đợi giây lát</translation>
 <translation id="8660174278198826384">Liên hệ với quản trị viên thiết bị của tổ chức bạn</translation>
 <translation id="8661290697478713397">Mở Liên kết bằn&amp;g Cửa sổ Ẩn danh</translation>
 <translation id="8662671328352114214">Kết nối mạng <ph name="TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 94568ef..36ef3b3 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -302,7 +302,7 @@
 <translation id="1444628761356461360">此设置由设备所有者<ph name="OWNER_EMAIL" />管理。</translation>
 <translation id="144518587530125858">无法加载主题背景的路径“<ph name="IMAGE_PATH" />”。</translation>
 <translation id="1445693676523799095">该过程可能需要一点时间</translation>
-<translation id="1450011005989029586">您使用的某个网站或应用发生了数据泄露,导致您的密码被外泄。Chrome 建议您立即在 <ph name="ORIGIN" /> 上<ph name="BOLD" />。</translation>
+<translation id="1450011005989029586">您使用的某个网站或应用发生了数据泄露,导致您的密码外泄。Chrome 建议您立即在 <ph name="ORIGIN" /> 上<ph name="BOLD" />。</translation>
 <translation id="1451375123200651445">网页(单个文件)</translation>
 <translation id="1451917004835509682">添加受监管用户</translation>
 <translation id="1454223536435069390">屏幕截图(&amp;A)</translation>
@@ -4295,7 +4295,6 @@
 <translation id="7371006317849674875">开始时间</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">在移动鼠标光标时突出显示光标</translation>
-<translation id="7377169924702866686">大写锁定已打开。</translation>
 <translation id="7377451353532943397">继续禁止使用传感器</translation>
 <translation id="7378627244592794276">否</translation>
 <translation id="73786666777299047">打开 Chrome 网上应用店</translation>
@@ -4381,7 +4380,7 @@
 <translation id="7506541170099744506">您的 <ph name="DEVICE_TYPE" /> 已成功注册企业管理服务。</translation>
 <translation id="7507930499305566459">状态响应程序证书</translation>
 <translation id="7508054832109420082">授予对打印机的使用期限</translation>
-<translation id="7510943789645525906">如果您使用的某个密码属于已遭泄露的数据,就会向您发出警告</translation>
+<translation id="7510943789645525906">如有密码遭遇数据泄露就会向您发出警告</translation>
 <translation id="7513029293694390567">使用存储的凭据自动登录网站。停用该功能后,系统会在您每次登录网站时要求您进行确认。</translation>
 <translation id="7514365320538308">下载</translation>
 <translation id="7521387064766892559">JavaScript</translation>
@@ -5001,7 +5000,6 @@
 <translation id="8390449457866780408">服务器无法使用。</translation>
 <translation id="8391218455464584335">黑胶唱片</translation>
 <translation id="8391712576156218334">图片不可用。请稍后重试。</translation>
-<translation id="8392234662362215700">按 Ctrl+Shift+空格键可切换键盘布局。</translation>
 <translation id="8392364544846746346">在网站想要修改您设备上的文件或文件夹时要先询问您</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> 的“选项”菜单</translation>
 <translation id="8393511274964623038">停止使用插件</translation>
@@ -5172,7 +5170,6 @@
 <translation id="8656619792520327915">添加其他蓝牙安全密钥</translation>
 <translation id="8656768832129462377">不检查</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> 正在与 <ph name="TAB_NAME" /> 共享您的屏幕和音频。</translation>
-<translation id="8659875081143553823">请稍候</translation>
 <translation id="8660174278198826384">请与贵组织的设备管理员联系</translation>
 <translation id="8661290697478713397">在隐身窗口中打开链接(&amp;G)</translation>
 <translation id="8662671328352114214">加入<ph name="TYPE" />网络</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 650fe89..a1764f26 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -541,7 +541,7 @@
 <translation id="1781502536226964113">開啟新分頁</translation>
 <translation id="1781771911845953849">帳戶與同步處理</translation>
 <translation id="1782196717298160133">搜尋你的手機</translation>
-<translation id="1784707308176068866">合作內建應用程式提出要求時在背景執行</translation>
+<translation id="1784707308176068866">合作原生應用程式提出要求時在背景執行</translation>
 <translation id="1784849162047402014">裝置磁碟空間即將用盡</translation>
 <translation id="1790194216133135334">傳送連結到「<ph name="DEVICE_NAME" />」</translation>
 <translation id="1790976235243700817">移除存取權</translation>
@@ -2755,7 +2755,7 @@
 <translation id="5087926280563932024">無法驗證帳戶。請再試一次,或重新啟動 Chromebook。</translation>
 <translation id="5088172560898466307">伺服器主機名稱</translation>
 <translation id="5088534251099454936">PKCS #1 SHA-512 (使用 RSA 加密)</translation>
-<translation id="5094721898978802975">與合作內建應用程式建立連線</translation>
+<translation id="5094721898978802975">與合作原生應用程式建立連線</translation>
 <translation id="5097002363526479830">無法連線至「<ph name="NAME" />」:<ph name="DETAILS" /></translation>
 <translation id="5101042277149003567">開啟所有書籤</translation>
 <translation id="5101839224773798795">游標停止時自動點擊</translation>
@@ -4298,7 +4298,6 @@
 <translation id="7371006317849674875">開始時間</translation>
 <translation id="7375053625150546623">EAP</translation>
 <translation id="7376553024552204454">滑鼠游標移動時醒目顯示</translation>
-<translation id="7377169924702866686">大寫鍵已啟用。</translation>
 <translation id="7377451353532943397">繼續禁止存取感應器</translation>
 <translation id="7378627244592794276">不需要</translation>
 <translation id="73786666777299047">開啟 Chrome 線上應用程式商店</translation>
@@ -5004,7 +5003,6 @@
 <translation id="8390449457866780408">無法與伺服器連線。</translation>
 <translation id="8391218455464584335">黑膠</translation>
 <translation id="8391712576156218334">目前無法存取圖片,請稍後再試。</translation>
-<translation id="8392234662362215700">按下 Ctrl + Shift + 空格鍵可切換鍵盤配置。</translation>
 <translation id="8392364544846746346">網站必須先詢問你,才能編輯裝置上的檔案或資料夾</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> 的選項選單</translation>
 <translation id="8393511274964623038">停止外掛程式</translation>
@@ -5175,7 +5173,6 @@
 <translation id="8656619792520327915">新增其他藍牙安全金鑰</translation>
 <translation id="8656768832129462377">不檢查</translation>
 <translation id="8658645149275195032"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用您的畫面和音訊。</translation>
-<translation id="8659875081143553823">請稍候</translation>
 <translation id="8660174278198826384">請與貴機構的裝置管理員聯絡</translation>
 <translation id="8661290697478713397">在無痕式視窗中開啟連結(&amp;G)</translation>
 <translation id="8662671328352114214">加入 <ph name="TYPE" /> 網路</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 1ba665a..5726b57d 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -55,6 +55,9 @@
 <translation id="2094919256425865063">Umalis pa rin sa Chrome?</translation>
 <translation id="2120620239521071941">Magde-delete ito ng <ph name="ITEMS_COUNT" /> (na) item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chrome bilang <ph name="USER_EMAIL" />.</translation>
 <translation id="2123055963409958220">Tulungang pahusayin ang Chrome sa pamamagitan ng pag-ulat sa <ph name="BEGIN_LINK" />mga kasalukuyang setting<ph name="END_LINK" /></translation>
+<translation id="2128103434102193461">Para sa mga detalye ng Chrome OS, pakitingnan ang <ph name="LINK_BEGIN" />
+      Tungkol sa Chrome OS<ph name="LINK_END" /></translation>
+<translation id="2151406531797534936">Paki-restart ang Chrome ngayon</translation>
 <translation id="216054706567564023">I-install ang Chrome sa telepono mo. Magpapadala kami ng SMS sa iyong numero ng telepono para sa pag-recover ng account.</translation>
 <translation id="2246246234298806438">Hindi maipapakita ng Google Chrome ang preview sa pag-print kapag nawawala ang built-in na PDF viewer.</translation>
 <translation id="2252923619938421629">Tumulong na mapahusay ang Google Chrome sa pamamagitan ng pag-uulat ng mga kasalukuyang setting</translation>
@@ -227,6 +230,7 @@
 <translation id="7589360514048265910">Hindi na makakatanggap ng mga update sa Google Chrome ang computer na ito dahil hindi na sinusuportahan ang Mac OS X 10.9.</translation>
 <translation id="7592736734348559088">Hindi mai-sync ng Google Chrome ang iyong data dahil hindi napapanahon ang mga detalye sa pag-sign in ng iyong account.</translation>
 <translation id="7626032353295482388">Welcome sa Chrome</translation>
+<translation id="7629695634924605473">Ipinapaalam sa iyo ng Chrome kung nakompromiso ang mga password mo</translation>
 <translation id="7641148173327520642">Na-configure ng iyong system administrator ang Google Chrome para buksan ang <ph name="ALTERNATIVE_BROWSER_NAME" /> para ma-access ang <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="7651907282515937834">Logo ng Chrome Enterprise</translation>
 <translation id="7747138024166251722">Hindi makalikha ng pansamantalang direktoryo ang installer. Paki-suri para sa puwang sa disk na walang laman at pahintulot upang i-install ang software.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 81966e77..29bd3d4 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -51,6 +51,9 @@
 <translation id="2094919256425865063">फिर भी Chrome छोड़ें?</translation>
 <translation id="2120620239521071941">ऐसा करने से इस डिवाइस से <ph name="ITEMS_COUNT" /> आइटम मिट जाएंगे. बाद में अपना डेटा पाने के लिए, Chrome में <ph name="USER_EMAIL" /> के रूप में साइन इन करें.</translation>
 <translation id="2123055963409958220"><ph name="BEGIN_LINK" />अभी वाली सेटिंग<ph name="END_LINK" /> की रिपोर्ट करके Chrome को बेहतर बनाने में सहायता करें</translation>
+<translation id="2128103434102193461">Chrome OS की जानकारी के लिए, कृपया <ph name="LINK_BEGIN" />
+      Chrome OS के बारे में<ph name="LINK_END" /> देखें</translation>
+<translation id="2151406531797534936">कृपया Chrome को अभी रीस्टार्ट करें</translation>
 <translation id="216054706567564023">अपने फ़ोन पर Chrome इंस्टॉल करें. हम आपके उस फ़ोन नंबर पर एक मैसेज (एसएमएस) भेजेंगे, जिसे आपने अपना खाता वापस पाने के लिए सेट किया है.</translation>
 <translation id="2246246234298806438">अगर Google Chrome के साथ ही आने वाला PDF व्यूअर मौजूद नहीं होगा तो, Google Chrome प्रिंट करने से पहले की झलक नहीं दिखा पाएगा.</translation>
 <translation id="2252923619938421629">वर्तमान सेटिंग की रिपोर्ट करके Google Chrome को बेहतर बनाने में सहायता करें</translation>
@@ -223,6 +226,7 @@
 <translation id="7589360514048265910">इस कंप्यूटर पर अब Google Chrome के अपडेट नहीं मिलेंगे क्योंकि अब इस पर Mac OS X 10.9 की सुविधा नहीं है.</translation>
 <translation id="7592736734348559088">Google Chrome आपका डेटा सिंक नहीं कर सका क्‍योंकि आपके खाते के साइन इन विवरण की समय सीमा पूरी हो चुकी है.</translation>
 <translation id="7626032353295482388">Chrome में आपका स्वागत है</translation>
+<translation id="7629695634924605473">Chrome यह बताता है कि कहीं आपके पासवर्ड का गलत इस्तेमाल तो नहीं किया गया है</translation>
 <translation id="7641148173327520642">आपके सिस्टम एडमिन ने <ph name="ALTERNATIVE_BROWSER_NAME" /> खाेलने के लिए, Google Chrome को कॉन्फ़िगर किया है ताकि <ph name="TARGET_URL_HOSTNAME" /> को ऐक्सेस किया जा सके.</translation>
 <translation id="7651907282515937834">Chrome Enterprise लोगो</translation>
 <translation id="7747138024166251722">इंस्टॉलर अस्थायी डायरेक्टरी नहीं बना सका. कृपया डिस्क में खाली जगह और सॉफ़्टवेयर इंस्टॉल करने की अनुमति जांचें.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 4b08e95..402218eb 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -55,6 +55,9 @@
 <translation id="2094919256425865063">Chrome을 종료하시겠습니까?</translation>
 <translation id="2120620239521071941">항목 <ph name="ITEMS_COUNT" />개가 기기에서 삭제됩니다. 나중에 데이터를 가져오려면 Chrome에 <ph name="USER_EMAIL" />(으)로 로그인하세요.</translation>
 <translation id="2123055963409958220"><ph name="BEGIN_LINK" />현재 설정<ph name="END_LINK" />을 보고하여 Chrome 개선에 참여</translation>
+<translation id="2128103434102193461">Chrome OS에 관한 자세한 내용은 <ph name="LINK_BEGIN" />
+      Chrome OS 소개<ph name="LINK_END" />를 참조하세요.</translation>
+<translation id="2151406531797534936">지금 Chrome을 다시 시작하세요</translation>
 <translation id="216054706567564023">휴대전화에 Chrome을 설치하세요. 계정 복구 전화번호로 SMS를 보내 드리겠습니다.</translation>
 <translation id="2246246234298806438">기본 제공되는 PDF 뷰어가 없는 경우 Chrome에서 인쇄 미리보기를 표시할 수 없습니다.</translation>
 <translation id="2252923619938421629">현재 설정을 보고하여 더 나은 Chrome을 만드는 데 도움 주기</translation>
@@ -227,6 +230,7 @@
 <translation id="7589360514048265910">Mac OS X 10.9가 더 이상 지원되지 않으므로 이 컴퓨터에서 Chrome 업데이트를 받을 수 없게 됩니다.</translation>
 <translation id="7592736734348559088">계정의 로그인 세부정보가 오래되어 Chrome에서 데이터를 동기화하지 못했습니다.</translation>
 <translation id="7626032353295482388">Chrome에 오신 것을 환영합니다</translation>
+<translation id="7629695634924605473">비밀번호가 유출되면 Chrome에서 알려줍니다.</translation>
 <translation id="7641148173327520642">시스템 관리자가 <ph name="TARGET_URL_HOSTNAME" /> 액세스를 위해 <ph name="ALTERNATIVE_BROWSER_NAME" />을(를) 열도록 Chrome을 구성했습니다.</translation>
 <translation id="7651907282515937834">Chrome Enterprise 로고</translation>
 <translation id="7747138024166251722">설치 프로그램이 임시 디렉터리를 만들지 못했습니다. 디스크 공간 및 설치 권한을 확인해 보세요.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index 0b3d06a..b79bf06 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -13,7 +13,7 @@
 <translation id="110877069173485804">हा तुमचा Chrome आहे</translation>
 <translation id="1142745911746664600">Chrome अपडेट करू शकत नाही</translation>
 <translation id="1154147086299354128">Chrome मध्‍ये &amp;उघडा</translation>
-<translation id="123620459398936149">Chrome OS तुमचा डेटा सिंक करू शकले नाही. कृपया तुमचा सिंक सांकेतिक पासफ्रेझ अपडेट करा.</translation>
+<translation id="123620459398936149">Chrome OS तुमचा डेटा सिंक करू शकले नाही. कृपया तुमचा सिंक सांकेतिक पासफ्रेज अपडेट करा.</translation>
 <translation id="127345590676626841">Chrome आपोआप अपडेट होते जेणेकरून तुमच्याकडे नेहमी सर्वात नवीन आवृत्ती असते. जेव्हा हे डाउनलोड पूर्ण होते, तेव्हा Chrome रीस्टार्ट होईल आणि तुम्ही तुमच्या मार्गावर असाल.</translation>
 <translation id="1302523850133262269">कृपया Chrome नवीनतम सिस्टम अपडेट इंस्टॉल करताना प्रतीक्षा करा.</translation>
 <translation id="137466361146087520">Google Chrome बीटा</translation>
@@ -46,6 +46,8 @@
 <translation id="1873233029667955273">Google Chrome तुमचा डीफॉल्ट ब्राउझर नाही</translation>
 <translation id="1874309113135274312">Google Chrome बीटा (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome कालबाह्य आहे</translation>
+<translation id="1900795423379050516">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" />
+      Chrome ब्राउझर सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation>
 <translation id="1915828456209461693">Chrome साठी नवीन अपडेट उपलब्ध आहे आणि तुम्ही रीलाँच करताच ते लागू केले जाईल.</translation>
 <translation id="1919130412786645364">Chrome मध्ये साइन इन करण्यासाठी अनुमती द्या</translation>
 <translation id="2063848847527508675">अपडेट लागू करण्यासाठी Chrome OS रीस्टार्ट करणे आवश्यक आहे.</translation>
@@ -53,7 +55,7 @@
 <translation id="2120620239521071941">हे या डिव्‍हाइस मधून <ph name="ITEMS_COUNT" /> आयटम हटवेल. नंतर तुमचा डेटा पुनर्प्राप्त करण्‍यासाठी Chrome मध्ये <ph name="USER_EMAIL" /> म्हणून साइन इन करा.</translation>
 <translation id="2123055963409958220"><ph name="BEGIN_LINK" />वर्तमान सेटिंग्ज<ph name="END_LINK" /> चा अहवाल देऊन Chrome ला आणखी चांगले बनविण्यात मदत करा</translation>
 <translation id="216054706567564023">Chrome तुमच्या फोनवर इंस्टॉल करा. आम्ही तुमच्या खाते रिकव्हरी फोन नंबरवर एक SMS पाठवू.</translation>
-<translation id="2246246234298806438">बिल्ट-इन PDF व्ह्यूअर गहाळ असताना Google Chrome प्रिंट पूर्वावलोकन दर्शवू शकत नाही.</translation>
+<translation id="2246246234298806438">बिल्ट-इन पीडीएफ व्ह्यूअर गहाळ असताना Google Chrome प्रिंट पूर्वावलोकन दाखवू शकत नाही.</translation>
 <translation id="2252923619938421629">वर्तमान सेटिंग्जचा अहवाल देऊन Google Chrome उत्कृष्ट बनविण्यास मदत करा</translation>
 <translation id="2286950485307333924">तुम्ही आता Chrome वर साइन इन केले आहे</translation>
 <translation id="2290014774651636340">Google API की गहाळ आहेत. Google Chrome ची काही कार्यक्षमता अक्षम केली जाईल.</translation>
@@ -145,7 +147,7 @@
 <translation id="4953650215774548573">तुमचा डीफॉल्ट ब्राउझर म्हणून Google Chrome सेट करा</translation>
 <translation id="495931528404527476">Chrome मध्ये</translation>
 <translation id="4990567037958725628">Google Chrome कॅनरी</translation>
-<translation id="5028489144783860647">Google Chrome तुमचा डेटा सिंक करू शकले नाही. कृपया तुमचा सिंक पासफ्रेझ अपडेट करा.</translation>
+<translation id="5028489144783860647">Google Chrome तुमचा डेटा सिंक करू शकले नाही. कृपया तुमची सिंक पासफ्रेज अपडेट करा.</translation>
 <translation id="5062123544085870375">Chrome OS रीस्टार्ट करा</translation>
 <translation id="5132929315877954718">Google Chrome साठी उत्कृष्ट ॲप, खेळ, विस्तार आणि थीम शोधा.</translation>
 <translation id="5170938038195470297">तुमचे प्रोफाइल वापरले जाणे शक्य नाही कारण ते Google Chrome च्या नवीनतम आवृत्तीमधील आहे.
@@ -162,6 +164,8 @@
 <translation id="5543953544073077331">Chrome च्या इतर प्रती रन होत आहेत. अपडेट करण्यासाठी, त्या बंद करा.</translation>
 <translation id="556024056938947818">Google Chrome पासवर्ड दर्शवण्याचा प्रयत्न करत आहे.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-मध्ये)</translation>
+<translation id="5657226924540934362">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" />
+      Chrome OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> धोकादायक असू शकते, त्यामुळे Chrom ने ते अवरोधित केले आहे.</translation>
 <translation id="5686916850681061684">Google Chrome कस्टमाइझ करा आणि नियंत्रित करा. एका गोष्टीवर तुम्ही लक्ष द्यायला हवे - तपशिलांसाठी क्लिक करा.</translation>
 <translation id="5690427481109656848">Google LLC</translation>
@@ -188,7 +192,7 @@
 <translation id="6368958679917195344"> Chrome OS अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />मुक्त स्रोत सॉफ्टवेअर<ph name="END_LINK_CROS_OSS" /> द्वारे शक्य झाले आहे.</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome डेव्हलपर</translation>
 <translation id="6566149418543181476">Google Chrome अपडेट करीत आहे (<ph name="PROGRESS_PERCENT" />)</translation>
-<translation id="6598387184982954187">तुम्ही तुमची Chrome सामग्री सिंक करण्यासाठी <ph name="PROFILE_EMAIL" /> वापरत आहात. तुमचे सिंक प्राधान्य अपडेट करण्यासाठी किंवा Google खात्याशिवाय Chrome वापरण्यासाठी, <ph name="SETTINGS_LINK" /> ला भेट द्या.</translation>
+<translation id="6598387184982954187">तुम्ही तुमचा Chrome आशय सिंक करण्यासाठी <ph name="PROFILE_EMAIL" /> वापरत आहात. तुमचे सिंक प्राधान्य अपडेट करण्यासाठी किंवा Google खात्याशिवाय Chrome वापरण्यासाठी, <ph name="SETTINGS_LINK" /> ला भेट द्या.</translation>
 <translation id="6600954340915313787">Chrome वर कॉपी केले</translation>
 <translation id="6634887557811630702">Google Chrome अद्ययावत आहे.</translation>
 <translation id="6676384891291319759">इंटरनेट अॅक्सेस करा</translation>
@@ -265,7 +269,7 @@
 <translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
 <translation id="870251953148363156">&amp;Google Chrome अपडेट करा</translation>
 <translation id="873133009373065397">Google Chrome डीफॉल्ट ब्राउझर निर्धारित करू शकत नाही किंवा सेट करू शकत नाही</translation>
-<translation id="8736674169840206667">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावी यासाठी तुम्ही Chrome पुन्हा लाँच करण्याची आवश्यकता आहे</translation>
+<translation id="8736674169840206667">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावी यासाठी तुम्ही Chrome पुन्हा लाँच करणे अावश्यक आहे</translation>
 <translation id="8823341990149967727">Chrome कालबाह्य आहे</translation>
 <translation id="884296878221830158">तुम्ही Chrome सुरू करता किंवा होम बटण क्लिक करता तेव्हा कोणते पेज दर्शविले जाते ते देखील हे नियंत्रित करते.</translation>
 <translation id="8862326446509486874">तुमच्याकडे सिस्टम स्तरावरील इंस्टॉलसाठी योग्य अधिकार नाहीत. अॅडमिनिस्ट्रेटर म्हणून पुन्हा इंस्टॉलर चालविण्याचा प्रयत्न करा.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 6dff8b89..cdca8528 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1995,7 +1995,6 @@
     "//components/contextual_search/core:browser",
     "//components/cookie_config",
     "//components/crx_file",
-    "//components/data_reduction_proxy/content/browser",
     "//components/data_reduction_proxy/content/common",
     "//components/data_reduction_proxy/core/browser",
     "//components/data_use_measurement/core:ascriber",
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index cc08145..6e708e09 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -2778,8 +2778,8 @@
 
 }  // namespace
 
-// TODO(crbug.com/994789): Flaky on MSan.
-#if defined(MEMORY_SANITIZER)
+// TODO(crbug.com/994789): Flaky on MSan, Linux, and Chrome OS.
+#if defined(MEMORY_SANITIZER) || defined(OS_LINUX) || defined(OS_CHROMEOS)
 #define MAYBE_DownloadCookieIsolation DISABLED_DownloadCookieIsolation
 #else
 #define MAYBE_DownloadCookieIsolation DownloadCookieIsolation
@@ -2924,8 +2924,8 @@
   content::EnsureCookiesFlushed(profile());
 }
 
-// TODO(crbug.com/994789): Flaky on ChromeOS. Fix and re-enable the test.
-#if defined(OS_CHROMEOS)
+// TODO(crbug.com/994789): Flaky on MSan, Linux, and ChromeOS.
+#if defined(MEMORY_SANITIZER) || defined(OS_LINUX) || defined(OS_CHROMEOS)
 #define MAYBE_DownloadCookieIsolation_CrossSession \
   DISABLED_DownloadCookieIsolation_CrossSession
 #else
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 48c6c03..93ddb4cc 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -380,7 +380,6 @@
 #include "chrome/browser/chromeos/chrome_browser_main_chromeos.h"
 #include "chrome/browser/chromeos/chrome_content_browser_client_chromeos_part.h"
 #include "chrome/browser/chromeos/drive/fileapi/drivefs_file_system_backend_delegate.h"
-#include "chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h"
 #include "chrome/browser/chromeos/file_manager/app_id.h"
 #include "chrome/browser/chromeos/file_system_provider/fileapi/backend_delegate.h"
 #include "chrome/browser/chromeos/fileapi/external_file_url_loader_factory.h"
@@ -3552,7 +3551,6 @@
       content::BrowserContext::GetMountPoints(browser_context);
   DCHECK(external_mount_points);
   auto backend = std::make_unique<chromeos::FileSystemBackend>(
-      std::make_unique<drive::FileSystemBackendDelegate>(),
       std::make_unique<chromeos::file_system_provider::BackendDelegate>(),
       std::make_unique<chromeos::MTPFileSystemBackendDelegate>(
           storage_partition_path),
@@ -3836,7 +3834,7 @@
                                                      render_frame_host);
 }
 
-bool ChromeContentBrowserClient::BindAssociatedInterfaceRequestFromFrame(
+bool ChromeContentBrowserClient::BindAssociatedReceiverFromFrame(
     content::RenderFrameHost* render_frame_host,
     const std::string& interface_name,
     mojo::ScopedInterfaceEndpointHandle* handle) {
@@ -3850,8 +3848,8 @@
   if (interface_name == autofill::mojom::PasswordManagerDriver::Name_) {
     password_manager::ContentPasswordManagerDriverFactory::
         BindPasswordManagerDriver(
-            autofill::mojom::PasswordManagerDriverAssociatedRequest(
-                std::move(*handle)),
+            mojo::PendingAssociatedReceiver<
+                autofill::mojom::PasswordManagerDriver>(std::move(*handle)),
             render_frame_host);
     return true;
   }
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 22e3d7b..bfd0d86 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -389,7 +389,7 @@
   void BindCredentialManagerReceiver(
       content::RenderFrameHost* render_frame_host,
       mojo::PendingReceiver<blink::mojom::CredentialManager> receiver) override;
-  bool BindAssociatedInterfaceRequestFromFrame(
+  bool BindAssociatedReceiverFromFrame(
       content::RenderFrameHost* render_frame_host,
       const std::string& interface_name,
       mojo::ScopedInterfaceEndpointHandle* handle) override;
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 8dadbe0..e4c9e8a 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -67,6 +67,7 @@
     "//chrome/browser/extensions",
     "//chrome/browser/resource_coordinator:tab_metrics_event_proto",
     "//chrome/browser/ssl:proto",
+    "//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings",
     "//chrome/browser/web_applications",
     "//chrome/browser/web_applications:web_applications_on_extensions",
     "//chrome/browser/web_applications/components",
@@ -682,6 +683,10 @@
     "base/file_flusher.h",
     "base/locale_util.cc",
     "base/locale_util.h",
+    "bluetooth/debug_logs_manager.cc",
+    "bluetooth/debug_logs_manager.h",
+    "bluetooth/debug_logs_manager_factory.cc",
+    "bluetooth/debug_logs_manager_factory.h",
     "boot_times_recorder.cc",
     "boot_times_recorder.h",
     "camera_detector.cc",
@@ -839,26 +844,14 @@
     "drive/debug_info_collector.h",
     "drive/download_handler.cc",
     "drive/download_handler.h",
-    "drive/drive_file_stream_reader.cc",
-    "drive/drive_file_stream_reader.h",
     "drive/drive_integration_service.cc",
     "drive/drive_integration_service.h",
     "drive/file_system_util.cc",
     "drive/file_system_util.h",
-    "drive/fileapi/async_file_util.cc",
-    "drive/fileapi/async_file_util.h",
     "drive/fileapi/drivefs_async_file_util.cc",
     "drive/fileapi/drivefs_async_file_util.h",
     "drive/fileapi/drivefs_file_system_backend_delegate.cc",
     "drive/fileapi/drivefs_file_system_backend_delegate.h",
-    "drive/fileapi/file_system_backend_delegate.cc",
-    "drive/fileapi/file_system_backend_delegate.h",
-    "drive/fileapi/fileapi_worker.cc",
-    "drive/fileapi/fileapi_worker.h",
-    "drive/fileapi/webkit_file_stream_reader_impl.cc",
-    "drive/fileapi/webkit_file_stream_reader_impl.h",
-    "drive/fileapi/webkit_file_stream_writer_impl.cc",
-    "drive/fileapi/webkit_file_stream_writer_impl.h",
     "drive/write_on_cache_file.cc",
     "drive/write_on_cache_file.h",
     "eol_notification.cc",
@@ -2504,11 +2497,8 @@
     "customization/customization_document_unittest.cc",
     "dbus/proxy_resolution_service_provider_unittest.cc",
     "drive/download_handler_unittest.cc",
-    "drive/drive_file_stream_reader_unittest.cc",
     "drive/drive_integration_service_unittest.cc",
     "drive/file_system_util_unittest.cc",
-    "drive/fileapi/fileapi_worker_unittest.cc",
-    "drive/fileapi/webkit_file_stream_reader_impl_unittest.cc",
     "drive/write_on_cache_file_unittest.cc",
     "events/event_rewriter_unittest.cc",
     "extensions/active_tab_permission_granter_delegate_chromeos_unittest.cc",
diff --git a/chrome/browser/chromeos/bluetooth/OWNERS b/chrome/browser/chromeos/bluetooth/OWNERS
new file mode 100644
index 0000000..66256300
--- /dev/null
+++ b/chrome/browser/chromeos/bluetooth/OWNERS
@@ -0,0 +1,3 @@
+khorimoto@chromium.org
+hansberry@chromium.org
+# COMPONENT: OS>Systems>Bluetooth
diff --git a/chrome/browser/chromeos/bluetooth/debug_logs_manager.cc b/chrome/browser/chromeos/bluetooth/debug_logs_manager.cc
new file mode 100644
index 0000000..1b400ff
--- /dev/null
+++ b/chrome/browser/chromeos/bluetooth/debug_logs_manager.cc
@@ -0,0 +1,53 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
+
+#include "base/feature_list.h"
+#include "base/strings/string_util.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/user_manager/user.h"
+
+namespace {
+const char kSupportedEmailSuffix[] = "@google.com";
+}  // namespace
+
+DebugLogsManager::DebugLogsManager(const user_manager::User* primary_user)
+    : primary_user_(primary_user) {}
+
+DebugLogsManager::~DebugLogsManager() = default;
+
+DebugLogsManager::DebugLogsState DebugLogsManager::GetDebugLogsState() const {
+  if (!AreDebugLogsSupported())
+    return DebugLogsState::kNotSupported;
+
+  return are_debug_logs_enabled_ ? DebugLogsState::kSupportedAndEnabled
+                                 : DebugLogsState::kSupportedButDisabled;
+}
+
+mojom::DebugLogsChangeHandlerPtr DebugLogsManager::GenerateInterfacePtr() {
+  mojom::DebugLogsChangeHandlerPtr interface_ptr;
+  bindings_.AddBinding(this, mojo::MakeRequest(&interface_ptr));
+  return interface_ptr;
+}
+
+void DebugLogsManager::ChangeDebugLogsState(bool should_debug_logs_be_enabled) {
+  DCHECK_NE(GetDebugLogsState(), DebugLogsState::kNotSupported);
+
+  // TODO(yshavit): Handle the user enabling/disabling logs.
+  are_debug_logs_enabled_ = should_debug_logs_be_enabled;
+}
+
+bool DebugLogsManager::AreDebugLogsSupported() const {
+  if (!base::FeatureList::IsEnabled(
+          chromeos::features::kShowBluetoothDebugLogToggle)) {
+    return false;
+  }
+
+  if (!primary_user_)
+    return false;
+
+  return base::EndsWith(primary_user_->GetDisplayEmail(), kSupportedEmailSuffix,
+                        base::CompareCase::INSENSITIVE_ASCII);
+}
diff --git a/chrome/browser/chromeos/bluetooth/debug_logs_manager.h b/chrome/browser/chromeos/bluetooth/debug_logs_manager.h
new file mode 100644
index 0000000..6509242
--- /dev/null
+++ b/chrome/browser/chromeos/bluetooth/debug_logs_manager.h
@@ -0,0 +1,54 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_BLUETOOTH_DEBUG_LOGS_MANAGER_H_
+#define CHROME_BROWSER_CHROMEOS_BLUETOOTH_DEBUG_LOGS_MANAGER_H_
+
+#include "base/macros.h"
+#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+
+namespace user_manager {
+class User;
+}  // namespace user_manager
+
+// Manages the use of debug Bluetooth logs. Under normal usage, only warning and
+// error logs are captured, but there are some situations in which it is
+// advantageous to capture more verbose logs (e.g., in noisy environments or on
+// a device with a particular Bluetooth chip). This class tracks the current
+// state of debug logs and handles the user enabling/disabling them.
+class DebugLogsManager : public mojom::DebugLogsChangeHandler {
+ public:
+  explicit DebugLogsManager(const user_manager::User* primary_user);
+  ~DebugLogsManager() override;
+
+  // State for capturing debug Bluetooth logs; logs are only captured when
+  // supported and enabled. Debug logs are supported when the associated flag is
+  // enabled and if an eligible user is signed in. Debug logs are enabled only
+  // via interaction with the DebugLogsChangeHandler Mojo interface.
+  enum class DebugLogsState {
+    kNotSupported,
+    kSupportedButDisabled,
+    kSupportedAndEnabled
+  };
+
+  DebugLogsState GetDebugLogsState() const;
+
+  // Generates an InterfacePtr bound to this object.
+  mojom::DebugLogsChangeHandlerPtr GenerateInterfacePtr();
+
+ private:
+  // mojom::DebugLogsManager:
+  void ChangeDebugLogsState(bool should_debug_logs_be_enabled) override;
+
+  bool AreDebugLogsSupported() const;
+
+  const user_manager::User* primary_user_ = nullptr;
+  bool are_debug_logs_enabled_ = false;
+  mojo::BindingSet<mojom::DebugLogsChangeHandler> bindings_;
+
+  DISALLOW_COPY_AND_ASSIGN(DebugLogsManager);
+};
+
+#endif  // CHROME_BROWSER_CHROMEOS_BLUETOOTH_DEBUG_LOGS_MANAGER_H_
diff --git a/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc
new file mode 100644
index 0000000..9ef7fb42
--- /dev/null
+++ b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc
@@ -0,0 +1,67 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h"
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace {
+
+// Wraps a DebugLogsManager instance in a KeyedService.
+class DebugLogsManagerService : public KeyedService {
+ public:
+  explicit DebugLogsManagerService(Profile* profile)
+      : debug_logs_manager_(
+            chromeos::ProfileHelper::Get()->GetUserByProfile(profile)) {}
+
+  ~DebugLogsManagerService() override = default;
+
+  DebugLogsManager* debug_logs_manager() { return &debug_logs_manager_; }
+
+ private:
+  DebugLogsManager debug_logs_manager_;
+  DISALLOW_COPY_AND_ASSIGN(DebugLogsManagerService);
+};
+
+}  // namespace
+
+// static
+DebugLogsManager* DebugLogsManagerFactory::GetForProfile(Profile* profile) {
+  if (!profile)
+    return nullptr;
+
+  DebugLogsManagerService* service = static_cast<DebugLogsManagerService*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+
+  return service ? service->debug_logs_manager() : nullptr;
+}
+
+// static
+DebugLogsManagerFactory* DebugLogsManagerFactory::GetInstance() {
+  return base::Singleton<DebugLogsManagerFactory>::get();
+}
+
+DebugLogsManagerFactory::DebugLogsManagerFactory()
+    : BrowserContextKeyedServiceFactory(
+          "DebugLogsManagerFactory",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+DebugLogsManagerFactory::~DebugLogsManagerFactory() = default;
+
+KeyedService* DebugLogsManagerFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
+
+  // Only primary profiles have an associated logs manager.
+  if (!chromeos::ProfileHelper::Get()->IsPrimaryProfile(profile))
+    return nullptr;
+
+  return new DebugLogsManagerService(profile);
+}
diff --git a/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h
new file mode 100644
index 0000000..4e73af7
--- /dev/null
+++ b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h
@@ -0,0 +1,33 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_BLUETOOTH_DEBUG_LOGS_MANAGER_FACTORY_H_
+#define CHROME_BROWSER_CHROMEOS_BLUETOOTH_DEBUG_LOGS_MANAGER_FACTORY_H_
+
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class DebugLogsManager;
+class Profile;
+
+// Factory for DebugLogsManager.
+class DebugLogsManagerFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static DebugLogsManager* GetForProfile(Profile* profile);
+  static DebugLogsManagerFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<DebugLogsManagerFactory>;
+
+  DebugLogsManagerFactory();
+  ~DebugLogsManagerFactory() override;
+
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(DebugLogsManagerFactory);
+};
+
+#endif  // CHROME_BROWSER_CHROMEOS_BLUETOOTH_DEBUG_LOGS_MANAGER_FACTORY_H_
diff --git a/chrome/browser/chromeos/drive/drive_file_stream_reader.cc b/chrome/browser/chromeos/drive/drive_file_stream_reader.cc
deleted file mode 100644
index 98f8742..0000000
--- a/chrome/browser/chromeos/drive/drive_file_stream_reader.cc
+++ /dev/null
@@ -1,487 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/drive_file_stream_reader.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <cstring>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/sequenced_task_runner.h"
-#include "base/task/post_task.h"
-#include "components/drive/chromeos/file_system_interface.h"
-#include "components/drive/drive.pb.h"
-#include "components/drive/local_file_reader.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "google_apis/drive/task_util.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/http/http_byte_range.h"
-
-using content::BrowserThread;
-
-namespace drive {
-namespace {
-
-// Converts FileError code to net::Error code.
-int FileErrorToNetError(FileError error) {
-  return net::FileErrorToNetError(FileErrorToBaseFileError(error));
-}
-
-// Computes the concrete |start| offset and the |length| of |range| in a file
-// of |total| size.
-//
-// This is a thin wrapper of HttpByteRange::ComputeBounds, extended to allow
-// an empty range at the end of the file, like "Range: bytes 0-" on a zero byte
-// file. This is for convenience in unifying implementation with the seek
-// operation of stream reader. HTTP doesn't allow such ranges but we want to
-// treat such seeking as valid.
-bool ComputeConcretePosition(net::HttpByteRange range,
-                             int64_t total,
-                             int64_t* start,
-                             int64_t* length) {
-  // The special case when empty range in the end of the file is selected.
-  if (range.HasFirstBytePosition() && range.first_byte_position() == total) {
-    *start = range.first_byte_position();
-    *length = 0;
-    return true;
-  }
-
-  // Otherwise forward to HttpByteRange::ComputeBounds.
-  if (!range.ComputeBounds(total))
-    return false;
-  *start = range.first_byte_position();
-  *length = range.last_byte_position() - range.first_byte_position() + 1;
-  return true;
-}
-
-}  // namespace
-
-namespace internal {
-namespace {
-
-// Copies the content in |pending_data| into |buffer| at most
-// |buffer_length| bytes, and erases the copied data from
-// |pending_data|. Returns the number of copied bytes.
-int ReadInternal(std::vector<std::unique_ptr<std::string>>* pending_data,
-                 net::IOBuffer* buffer,
-                 int buffer_length) {
-  size_t index = 0;
-  int offset = 0;
-  for (; index < pending_data->size() && offset < buffer_length; ++index) {
-    const std::string& chunk = *(*pending_data)[index];
-    DCHECK(!chunk.empty());
-
-    size_t bytes_to_read = std::min(
-        chunk.size(), static_cast<size_t>(buffer_length - offset));
-    std::memmove(buffer->data() + offset, chunk.data(), bytes_to_read);
-    offset += bytes_to_read;
-    if (bytes_to_read < chunk.size()) {
-      // The chunk still has some remaining data.
-      // So remove leading (copied) bytes, and quit the loop so that
-      // the remaining data won't be deleted in the following erase().
-      (*pending_data)[index]->erase(0, bytes_to_read);
-      break;
-    }
-  }
-
-  // Consume the copied data.
-  pending_data->erase(pending_data->begin(), pending_data->begin() + index);
-
-  return offset;
-}
-
-}  // namespace
-
-LocalReaderProxy::LocalReaderProxy(
-    std::unique_ptr<util::LocalFileReader> file_reader,
-    int64_t length)
-    : file_reader_(std::move(file_reader)), remaining_length_(length) {
-  DCHECK(file_reader_);
-}
-
-LocalReaderProxy::~LocalReaderProxy() = default;
-
-int LocalReaderProxy::Read(net::IOBuffer* buffer,
-                           int buffer_length,
-                           net::CompletionOnceCallback callback) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(file_reader_);
-
-  if (buffer_length > remaining_length_) {
-    // Here, narrowing is safe.
-    buffer_length = static_cast<int>(remaining_length_);
-  }
-
-  if (!buffer_length)
-    return 0;
-
-  file_reader_->Read(
-      buffer, buffer_length,
-      base::BindOnce(&LocalReaderProxy::OnReadCompleted,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-  return net::ERR_IO_PENDING;
-}
-
-void LocalReaderProxy::OnGetContent(std::unique_ptr<std::string> data) {
-  // This method should never be called, because no data should be received
-  // from the network during the reading of local-cache file.
-  NOTREACHED();
-}
-
-void LocalReaderProxy::OnCompleted(FileError error) {
-  // If this method is called, no network error should be happened.
-  DCHECK_EQ(FILE_ERROR_OK, error);
-}
-
-void LocalReaderProxy::OnReadCompleted(net::CompletionOnceCallback callback,
-                                       int read_result) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(file_reader_);
-
-  if (read_result >= 0) {
-    // |read_result| bytes data is read.
-    DCHECK_LE(read_result, remaining_length_);
-    remaining_length_ -= read_result;
-  } else {
-    // An error occurs. Close the |file_reader_|.
-    file_reader_.reset();
-  }
-  std::move(callback).Run(read_result);
-}
-
-NetworkReaderProxy::NetworkReaderProxy(int64_t offset,
-                                       int64_t content_length,
-                                       int64_t full_content_length,
-                                       const base::Closure& job_canceller)
-    : remaining_offset_(offset),
-      remaining_content_length_(content_length),
-      is_full_download_(offset + content_length == full_content_length),
-      error_code_(net::OK),
-      buffer_length_(0),
-      job_canceller_(job_canceller) {}
-
-NetworkReaderProxy::~NetworkReaderProxy() {
-  if (!job_canceller_.is_null()) {
-    job_canceller_.Run();
-  }
-}
-
-int NetworkReaderProxy::Read(net::IOBuffer* buffer,
-                             int buffer_length,
-                             net::CompletionOnceCallback callback) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  // Check if there is no pending Read operation.
-  DCHECK(!buffer_.get());
-  DCHECK_EQ(buffer_length_, 0);
-  DCHECK(callback_.is_null());
-  // Validate the arguments.
-  DCHECK(buffer);
-  DCHECK_GT(buffer_length, 0);
-  DCHECK(callback);
-
-  if (error_code_ != net::OK) {
-    // An error is already found. Return it immediately.
-    return error_code_;
-  }
-
-  if (remaining_content_length_ == 0) {
-    // If no more data, return immediately.
-    return 0;
-  }
-
-  if (buffer_length > remaining_content_length_) {
-    // Here, narrowing cast should be safe.
-    buffer_length = static_cast<int>(remaining_content_length_);
-  }
-
-  if (pending_data_.empty()) {
-    // No data is available. Keep the arguments, and return pending status.
-    buffer_ = buffer;
-    buffer_length_ = buffer_length;
-    callback_ = std::move(callback);
-    return net::ERR_IO_PENDING;
-  }
-
-  int result = ReadInternal(&pending_data_, buffer, buffer_length);
-  remaining_content_length_ -= result;
-  DCHECK_GE(remaining_content_length_, 0);
-
-  // Although OnCompleted() should reset |job_canceller_| when download is done,
-  // due to timing issues the ReaderProxy instance may be destructed before the
-  // notification. To fix the case we reset here earlier.
-  if (is_full_download_ && remaining_content_length_ == 0)
-    job_canceller_.Reset();
-
-  return result;
-}
-
-void NetworkReaderProxy::OnGetContent(std::unique_ptr<std::string> data) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(data && !data->empty());
-
-  if (remaining_offset_ >= static_cast<int64_t>(data->length())) {
-    // Skip unneeded leading data.
-    remaining_offset_ -= data->length();
-    return;
-  }
-
-  if (remaining_offset_ > 0) {
-    // Erase unnecessary leading bytes.
-    data->erase(0, static_cast<size_t>(remaining_offset_));
-    remaining_offset_ = 0;
-  }
-
-  pending_data_.push_back(std::move(data));
-  if (!buffer_.get()) {
-    // No pending Read operation.
-    return;
-  }
-
-  int result = ReadInternal(&pending_data_, buffer_.get(), buffer_length_);
-  remaining_content_length_ -= result;
-  DCHECK_GE(remaining_content_length_, 0);
-
-  if (is_full_download_ && remaining_content_length_ == 0)
-    job_canceller_.Reset();
-
-  buffer_ = nullptr;
-  buffer_length_ = 0;
-  DCHECK(!callback_.is_null());
-  std::move(callback_).Run(result);
-}
-
-void NetworkReaderProxy::OnCompleted(FileError error) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  // The downloading is completed, so we do not need to cancel the job
-  // in the destructor.
-  job_canceller_.Reset();
-
-  if (error == FILE_ERROR_OK) {
-    return;
-  }
-
-  error_code_ = FileErrorToNetError(error);
-  pending_data_.clear();
-
-  if (callback_.is_null()) {
-    // No pending Read operation.
-    return;
-  }
-
-  buffer_ = nullptr;
-  buffer_length_ = 0;
-  std::move(callback_).Run(error_code_);
-}
-
-}  // namespace internal
-
-namespace {
-
-// Calls FileSystemInterface::GetFileContent if the file system
-// is available. If not, the |completion_callback| is invoked with
-// FILE_ERROR_FAILED.
-base::Closure GetFileContentOnUIThread(
-    const DriveFileStreamReader::FileSystemGetter& file_system_getter,
-    const base::FilePath& drive_file_path,
-    GetFileContentInitializedCallback initialized_callback,
-    const google_apis::GetContentCallback& get_content_callback,
-    const FileOperationCallback& completion_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  FileSystemInterface* file_system = file_system_getter.Run();
-  if (!file_system) {
-    completion_callback.Run(FILE_ERROR_FAILED);
-    return base::Closure();
-  }
-
-  return google_apis::CreateRelayCallback(file_system->GetFileContent(
-      drive_file_path, std::move(initialized_callback), get_content_callback,
-      completion_callback));
-}
-
-// Helper to run FileSystemInterface::GetFileContent on UI thread.
-void GetFileContent(
-    const DriveFileStreamReader::FileSystemGetter& file_system_getter,
-    const base::FilePath& drive_file_path,
-    GetFileContentInitializedCallback initialized_callback,
-    const google_apis::GetContentCallback& get_content_callback,
-    const FileOperationCallback& completion_callback,
-    const base::Callback<void(const base::Closure&)>& reply_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::PostTaskAndReplyWithResult(
-      FROM_HERE, {BrowserThread::UI},
-      base::Bind(&GetFileContentOnUIThread, file_system_getter, drive_file_path,
-                 base::Passed(google_apis::CreateRelayCallback(
-                     std::move(initialized_callback))),
-                 google_apis::CreateRelayCallback(get_content_callback),
-                 google_apis::CreateRelayCallback(completion_callback)),
-      reply_callback);
-}
-
-}  // namespace
-
-DriveFileStreamReader::DriveFileStreamReader(
-    const FileSystemGetter& file_system_getter,
-    base::SequencedTaskRunner* file_task_runner)
-    : file_system_getter_(file_system_getter),
-      file_task_runner_(file_task_runner) {}
-
-DriveFileStreamReader::~DriveFileStreamReader() = default;
-
-bool DriveFileStreamReader::IsInitialized() const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  return reader_proxy_.get() != nullptr;
-}
-
-void DriveFileStreamReader::Initialize(
-    const base::FilePath& drive_file_path,
-    const net::HttpByteRange& byte_range,
-    InitializeCompletionOnceCallback callback) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(callback);
-
-  init_callback_ = std::move(callback);
-  GetFileContent(
-      file_system_getter_, drive_file_path,
-      base::Bind(
-          &DriveFileStreamReader ::InitializeAfterGetFileContentInitialized,
-          weak_ptr_factory_.GetWeakPtr(), byte_range),
-      base::Bind(&DriveFileStreamReader::OnGetContent,
-                 weak_ptr_factory_.GetWeakPtr()),
-      base::Bind(&DriveFileStreamReader::OnGetFileContentCompletion,
-                 weak_ptr_factory_.GetWeakPtr()),
-      base::Bind(&DriveFileStreamReader::StoreCancelDownloadClosure,
-                 weak_ptr_factory_.GetWeakPtr()));
-}
-
-int DriveFileStreamReader::Read(net::IOBuffer* buffer,
-                                int buffer_length,
-                                net::CompletionOnceCallback callback) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(reader_proxy_);
-  DCHECK(buffer);
-  DCHECK(callback);
-  return reader_proxy_->Read(buffer, buffer_length, std::move(callback));
-}
-
-void DriveFileStreamReader::StoreCancelDownloadClosure(
-    const base::Closure& cancel_download_closure) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  cancel_download_closure_ = cancel_download_closure;
-}
-
-void DriveFileStreamReader::InitializeAfterGetFileContentInitialized(
-    const net::HttpByteRange& byte_range,
-    FileError error,
-    const base::FilePath& local_cache_file_path,
-    std::unique_ptr<ResourceEntry> entry) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  // StoreCancelDownloadClosure() should be called before this function.
-  DCHECK(!cancel_download_closure_.is_null());
-
-  if (error != FILE_ERROR_OK) {
-    std::move(init_callback_)
-        .Run(FileErrorToNetError(error), std::unique_ptr<ResourceEntry>());
-    return;
-  }
-  DCHECK(entry);
-
-  int64_t range_start = 0, range_length = 0;
-  if (!ComputeConcretePosition(byte_range, entry->file_info().size(),
-                               &range_start, &range_length)) {
-    // If |byte_range| is invalid (e.g. out of bounds), return with an error.
-    // At the same time, we cancel the in-flight downloading operation if
-    // needed and and invalidate weak pointers so that we won't
-    // receive unwanted callbacks.
-    cancel_download_closure_.Run();
-    weak_ptr_factory_.InvalidateWeakPtrs();
-    std::move(init_callback_)
-        .Run(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE,
-             std::unique_ptr<ResourceEntry>());
-    return;
-  }
-
-  if (local_cache_file_path.empty()) {
-    // The file is not cached, and being downloaded.
-    reader_proxy_ = std::make_unique<internal::NetworkReaderProxy>(
-        range_start, range_length, entry->file_info().size(),
-        cancel_download_closure_);
-    std::move(init_callback_).Run(net::OK, std::move(entry));
-    return;
-  }
-
-  // Otherwise, open the stream for file.
-  std::unique_ptr<util::LocalFileReader> file_reader(
-      new util::LocalFileReader(file_task_runner_.get()));
-  util::LocalFileReader* file_reader_ptr = file_reader.get();
-  file_reader_ptr->Open(
-      local_cache_file_path,
-      range_start,
-      base::Bind(
-          &DriveFileStreamReader::InitializeAfterLocalFileOpen,
-          weak_ptr_factory_.GetWeakPtr(),
-          range_length,
-          base::Passed(&entry),
-          base::Passed(&file_reader)));
-}
-
-void DriveFileStreamReader::InitializeAfterLocalFileOpen(
-    int64_t length,
-    std::unique_ptr<ResourceEntry> entry,
-    std::unique_ptr<util::LocalFileReader> file_reader,
-    int open_result) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  if (open_result != net::OK) {
-    std::move(init_callback_)
-        .Run(net::ERR_FAILED, std::unique_ptr<ResourceEntry>());
-    return;
-  }
-
-  reader_proxy_ = std::make_unique<internal::LocalReaderProxy>(
-      std::move(file_reader), length);
-  std::move(init_callback_).Run(net::OK, std::move(entry));
-}
-
-void DriveFileStreamReader::OnGetContent(
-    google_apis::DriveApiErrorCode error_code,
-    std::unique_ptr<std::string> data) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(reader_proxy_);
-  reader_proxy_->OnGetContent(std::move(data));
-}
-
-void DriveFileStreamReader::OnGetFileContentCompletion(
-    FileError error) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  if (reader_proxy_) {
-    // If the proxy object available, send the error to it.
-    reader_proxy_->OnCompleted(error);
-  } else {
-    // Here the proxy object is not yet available.
-    // There are two cases. 1) Some error happens during the initialization.
-    // 2) the cache file is found, but the proxy object is not *yet*
-    // initialized because the file is being opened.
-    // We are interested in 1) only. The callback for 2) will be called
-    // after opening the file is completed.
-    // Note: due to the same reason, LocalReaderProxy::OnCompleted may
-    // or may not be called. This is timing issue, and it is difficult to avoid
-    // unfortunately.
-    if (error != FILE_ERROR_OK) {
-      std::move(init_callback_)
-          .Run(FileErrorToNetError(error), std::unique_ptr<ResourceEntry>());
-    }
-  }
-}
-
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/drive_file_stream_reader.h b/chrome/browser/chromeos/drive/drive_file_stream_reader.h
deleted file mode 100644
index 29541e9e..0000000
--- a/chrome/browser/chromeos/drive/drive_file_stream_reader.h
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_FILE_STREAM_READER_H_
-#define CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_FILE_STREAM_READER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/threading/thread_checker.h"
-#include "components/drive/file_errors.h"
-#include "google_apis/drive/drive_api_error_codes.h"
-#include "net/base/completion_once_callback.h"
-
-namespace base {
-class SequencedTaskRunner;
-}  // namespace base
-
-namespace net {
-class HttpByteRange;
-class IOBuffer;
-}  // namespace net
-
-namespace drive {
-namespace util {
-class LocalFileReader;
-}  // namespace util
-
-namespace internal {
-
-// An interface to dispatch the reading operation. If the file is locally
-// cached, LocalReaderProxy defined below will be used. Otherwise (i.e. the
-// file is being downloaded from the server), NetworkReaderProxy will be used.
-class ReaderProxy {
- public:
-  virtual ~ReaderProxy() {}
-
-  // Called from DriveFileStreamReader::Read method.
-  virtual int Read(net::IOBuffer* buffer,
-                   int buffer_length,
-                   net::CompletionOnceCallback callback) = 0;
-
-  // Called when the data from the server is received.
-  virtual void OnGetContent(std::unique_ptr<std::string> data) = 0;
-
-  // Called when the accessing to the file system is completed.
-  virtual void OnCompleted(FileError error) = 0;
-};
-
-// The read operation implementation for the locally cached files.
-class LocalReaderProxy : public ReaderProxy {
- public:
-  // The |file_reader| should be the instance which is already opened.
-  // This class takes its ownership.
-  // |length| is the number of bytes to be read. It must be equal or
-  // smaller than the remaining data size in the |file_reader|.
-  LocalReaderProxy(std::unique_ptr<util::LocalFileReader> file_reader,
-                   int64_t length);
-  ~LocalReaderProxy() override;
-
-  // ReaderProxy overrides.
-  int Read(net::IOBuffer* buffer,
-           int buffer_length,
-           net::CompletionOnceCallback callback) override;
-  void OnGetContent(std::unique_ptr<std::string> data) override;
-  void OnCompleted(FileError error) override;
-
- private:
-  std::unique_ptr<util::LocalFileReader> file_reader_;
-
-  // Callback for the LocalFileReader::Read.
-  void OnReadCompleted(net::CompletionOnceCallback callback, int read_result);
-
-  // The number of remaining bytes to be read.
-  int64_t remaining_length_;
-
-  THREAD_CHECKER(thread_checker_);
-
-  // This should remain the last member so it'll be destroyed first and
-  // invalidate its weak pointers before other members are destroyed.
-  base::WeakPtrFactory<LocalReaderProxy> weak_ptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(LocalReaderProxy);
-};
-
-// The read operation implementation for the file which is being downloaded.
-class NetworkReaderProxy : public ReaderProxy {
- public:
-  // If the instance is deleted during the download process, it is necessary
-  // to cancel the job. |job_canceller| should be the callback to run the
-  // cancelling. |full_content_length| is necessary for determining whether the
-  // deletion is done in the middle of download process.
-  NetworkReaderProxy(int64_t offset,
-                     int64_t content_length,
-                     int64_t full_content_length,
-                     const base::Closure& job_canceller);
-  ~NetworkReaderProxy() override;
-
-  // ReaderProxy overrides.
-  int Read(net::IOBuffer* buffer,
-           int buffer_length,
-           net::CompletionOnceCallback callback) override;
-  void OnGetContent(std::unique_ptr<std::string> data) override;
-  void OnCompleted(FileError error) override;
-
- private:
-  // The data received from the server, but not yet read.
-  std::vector<std::unique_ptr<std::string>> pending_data_;
-
-  // The number of bytes to be skipped.
-  int64_t remaining_offset_;
-
-  // The number of bytes of remaining data (including the data not yet
-  // received from the server).
-  int64_t remaining_content_length_;
-
-  // Flag to remember whether this read request is for reading till the end of
-  // the file.
-  const bool is_full_download_;
-
-  int error_code_;
-
-  // To support pending Read(), it is necessary to keep its arguments.
-  scoped_refptr<net::IOBuffer> buffer_;
-  int buffer_length_;
-  net::CompletionOnceCallback callback_;
-
-  THREAD_CHECKER(thread_checker_);
-
-  // Keeps the closure to cancel downloading job if necessary.
-  // Will be reset when the job is completed (regardless whether the job is
-  // successfully done or not).
-  base::Closure job_canceller_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkReaderProxy);
-};
-
-}  // namespace internal
-
-class FileSystemInterface;
-class ResourceEntry;
-
-// The stream reader for a file in FileSystem. Instances of this class
-// should live on IO thread.
-// Operations to communicate with a locally cached file will run on
-// |file_task_runner| specified by the constructor.
-class DriveFileStreamReader {
- public:
-  // Callback to return the FileSystemInterface instance. This is an
-  // injecting point for testing.
-  // Note that the callback will be copied between threads (IO and UI), and
-  // will be called on UI thread.
-  typedef base::Callback<FileSystemInterface*()> FileSystemGetter;
-
-  // Callback to return the result of Initialize().
-  // |error| is net::Error code.
-  typedef base::OnceCallback<void(int error,
-                                  std::unique_ptr<ResourceEntry> entry)>
-      InitializeCompletionOnceCallback;
-
-  DriveFileStreamReader(const FileSystemGetter& file_system_getter,
-                        base::SequencedTaskRunner* file_task_runner);
-  ~DriveFileStreamReader();
-
-  // Returns true if the reader is initialized.
-  bool IsInitialized() const;
-
-  // Initializes the stream for the |drive_file_path|.
-  // |callback| must not be null.
-  void Initialize(const base::FilePath& drive_file_path,
-                  const net::HttpByteRange& byte_range,
-                  InitializeCompletionOnceCallback callback);
-
-  // Reads the data into |buffer| at most |buffer_length|, and returns
-  // the number of bytes. If an error happened, returns an error code.
-  // If no data is available yet, returns net::ERR_IO_PENDING immediately,
-  // and when the data is available the actual Read operation is done
-  // and |callback| will be run with the result.
-  // The Read() method must not be called before the Initialize() is completed
-  // successfully, or if there is pending read operation.
-  // Neither |buffer| nor |callback| must be null.
-  int Read(net::IOBuffer* buffer,
-           int buffer_length,
-           net::CompletionOnceCallback callback);
-
- private:
-  // Used to store the cancel closure returned by FileSystemInterface.
-  void StoreCancelDownloadClosure(const base::Closure& cancel_download_closure);
-
-  // Part of Initialize. Called after GetFileContent's initialization
-  // is done.
-  void InitializeAfterGetFileContentInitialized(
-      const net::HttpByteRange& byte_range,
-      FileError error,
-      const base::FilePath& local_cache_file_path,
-      std::unique_ptr<ResourceEntry> entry);
-
-  // Part of Initialize. Called when the local file open process is done.
-  void InitializeAfterLocalFileOpen(
-      int64_t length,
-      std::unique_ptr<ResourceEntry> entry,
-      std::unique_ptr<util::LocalFileReader> file_reader,
-      int open_result);
-
-  // Called when the data is received from the server.
-  void OnGetContent(google_apis::DriveApiErrorCode error_code,
-                    std::unique_ptr<std::string> data);
-
-  // Called when GetFileContent is completed.
-  void OnGetFileContentCompletion(
-      FileError error);
-
-  InitializeCompletionOnceCallback init_callback_;
-  const FileSystemGetter file_system_getter_;
-  scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
-  base::Closure cancel_download_closure_;
-  std::unique_ptr<internal::ReaderProxy> reader_proxy_;
-
-  THREAD_CHECKER(thread_checker_);
-
-  // This should remain the last member so it'll be destroyed first and
-  // invalidate its weak pointers before other members are destroyed.
-  base::WeakPtrFactory<DriveFileStreamReader> weak_ptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(DriveFileStreamReader);
-};
-
-}  // namespace drive
-
-#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_FILE_STREAM_READER_H_
diff --git a/chrome/browser/chromeos/drive/drive_file_stream_reader_unittest.cc b/chrome/browser/chromeos/drive/drive_file_stream_reader_unittest.cc
deleted file mode 100644
index 2f90501..0000000
--- a/chrome/browser/chromeos/drive/drive_file_stream_reader_unittest.cc
+++ /dev/null
@@ -1,577 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/drive_file_stream_reader.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/file_path.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "components/drive/chromeos/drive_test_util.h"
-#include "components/drive/chromeos/fake_file_system.h"
-#include "components/drive/file_system_core_util.h"
-#include "components/drive/local_file_reader.h"
-#include "components/drive/service/fake_drive_service.h"
-#include "components/drive/service/test_util.h"
-#include "content/public/test/browser_task_environment.h"
-#include "content/public/test/test_utils.h"
-#include "google_apis/drive/drive_api_parser.h"
-#include "google_apis/drive/test_util.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/test_completion_callback.h"
-#include "net/http/http_byte_range.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace drive {
-namespace internal {
-namespace {
-
-// Increments the |num_called|, when this method is invoked.
-void IncrementCallback(int* num_called) {
-  DCHECK(num_called);
-  ++*num_called;
-}
-
-}  // namespace
-
-class LocalReaderProxyTest : public ::testing::Test {
- protected:
-  LocalReaderProxyTest()
-      : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) {}
-
-  void SetUp() override {
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    ASSERT_TRUE(google_apis::test_util::CreateFileOfSpecifiedSize(
-        temp_dir_.GetPath(), 1024, &file_path_, &file_content_));
-
-    worker_thread_ = std::make_unique<base::Thread>("ReaderProxyTest");
-    ASSERT_TRUE(worker_thread_->Start());
-  }
-
-  content::BrowserTaskEnvironment task_environment_;
-
-  base::ScopedTempDir temp_dir_;
-  base::FilePath file_path_;
-  std::string file_content_;
-
-  std::unique_ptr<base::Thread> worker_thread_;
-};
-
-TEST_F(LocalReaderProxyTest, Read) {
-  // Open the file first.
-  std::unique_ptr<util::LocalFileReader> file_reader(
-      new util::LocalFileReader(worker_thread_->task_runner().get()));
-  net::TestCompletionCallback callback;
-  file_reader->Open(file_path_, 0, callback.callback());
-  ASSERT_EQ(net::OK, callback.WaitForResult());
-
-  // Test instance.
-  LocalReaderProxy proxy(std::move(file_reader), file_content_.size());
-
-  // Make sure the read content is as same as the file.
-  std::string content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(&proxy, &content));
-  EXPECT_EQ(file_content_, content);
-}
-
-TEST_F(LocalReaderProxyTest, ReadWithLimit) {
-  // This test case, we only read first half of the file.
-  const std::string expected_content =
-      file_content_.substr(0, file_content_.size() / 2);
-
-  // Open the file first.
-  std::unique_ptr<util::LocalFileReader> file_reader(
-      new util::LocalFileReader(worker_thread_->task_runner().get()));
-  net::TestCompletionCallback callback;
-  file_reader->Open(file_path_, 0, callback.callback());
-  ASSERT_EQ(net::OK, callback.WaitForResult());
-
-  // Test instance.
-  LocalReaderProxy proxy(std::move(file_reader), expected_content.size());
-
-  // Make sure the read content is as same as the file.
-  std::string content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(&proxy, &content));
-  EXPECT_EQ(expected_content, content);
-}
-
-class NetworkReaderProxyTest : public ::testing::Test {
- protected:
-  NetworkReaderProxyTest()
-      : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) {}
-
-  content::BrowserTaskEnvironment task_environment_;
-};
-
-TEST_F(NetworkReaderProxyTest, EmptyFile) {
-  NetworkReaderProxy proxy(0, 0, 0, base::DoNothing());
-
-  net::TestCompletionCallback callback;
-  const int kBufferSize = 10;
-  scoped_refptr<net::IOBuffer> buffer =
-      base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-  int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-
-  // For empty file, Read() should return 0 immediately.
-  EXPECT_EQ(0, result);
-}
-
-TEST_F(NetworkReaderProxyTest, Read) {
-  int cancel_called = 0;
-  {
-    NetworkReaderProxy proxy(0, 10, 10,
-                             base::Bind(&IncrementCallback, &cancel_called));
-
-    net::TestCompletionCallback callback;
-    const int kBufferSize = 3;
-    scoped_refptr<net::IOBuffer> buffer =
-        base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-
-    // If no data is available yet, ERR_IO_PENDING should be returned.
-    int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-    EXPECT_EQ(net::ERR_IO_PENDING, result);
-
-    // And when the data is supplied, the callback will be called.
-    std::unique_ptr<std::string> data(new std::string("abcde"));
-    proxy.OnGetContent(std::move(data));
-
-    // The returned data should be fit to the buffer size.
-    result = callback.GetResult(result);
-    EXPECT_EQ(3, result);
-    EXPECT_EQ("abc", std::string(buffer->data(), result));
-
-    // The next Read should return immediately because there is pending data
-    result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-    EXPECT_EQ(2, result);
-    EXPECT_EQ("de", std::string(buffer->data(), result));
-
-    // Supply the data before calling Read operation.
-    data = std::make_unique<std::string>("fg");
-    proxy.OnGetContent(std::move(data));
-    data = std::make_unique<std::string>("hij");
-    proxy.OnGetContent(std::move(data));  // Now 10 bytes are supplied.
-
-    // The data should be concatenated if possible.
-    result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-    EXPECT_EQ(3, result);
-    EXPECT_EQ("fgh", std::string(buffer->data(), result));
-
-    result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-    EXPECT_EQ(2, result);
-    EXPECT_EQ("ij", std::string(buffer->data(), result));
-
-    // The whole data is read, so Read() should return 0 immediately by then.
-    result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-    EXPECT_EQ(0, result);
-  }
-
-  // Proxy is deleted without any called to OnCompleted(). Even in the case,
-  // cancel callback should not be invoked.
-  EXPECT_EQ(0, cancel_called);
-}
-
-TEST_F(NetworkReaderProxyTest, ReadWithLimit) {
-  NetworkReaderProxy proxy(10, 10, 10, base::DoNothing());
-
-  net::TestCompletionCallback callback;
-  const int kBufferSize = 3;
-  scoped_refptr<net::IOBuffer> buffer =
-      base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-
-  // If no data is available yet, ERR_IO_PENDING should be returned.
-  int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-  EXPECT_EQ(net::ERR_IO_PENDING, result);
-
-  // And when the data is supplied, the callback will be called.
-  std::unique_ptr<std::string> data(new std::string("abcde"));
-  proxy.OnGetContent(std::move(data));
-  data = std::make_unique<std::string>("fgh");
-  proxy.OnGetContent(std::move(data));
-  data = std::make_unique<std::string>("ijklmno");
-  proxy.OnGetContent(std::move(data));
-
-  // The returned data should be fit to the buffer size.
-  result = callback.GetResult(result);
-  EXPECT_EQ(3, result);
-  EXPECT_EQ("klm", std::string(buffer->data(), result));
-
-  // The next Read should return immediately because there is pending data
-  result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-  EXPECT_EQ(2, result);
-  EXPECT_EQ("no", std::string(buffer->data(), result));
-
-  // Supply the data before calling Read operation.
-  data = std::make_unique<std::string>("pqrs");
-  proxy.OnGetContent(std::move(data));
-  data = std::make_unique<std::string>("tuvwxyz");
-  proxy.OnGetContent(std::move(data));  // 't' is the 20-th byte.
-
-  // The data should be concatenated if possible.
-  result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-  EXPECT_EQ(3, result);
-  EXPECT_EQ("pqr", std::string(buffer->data(), result));
-
-  result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-  EXPECT_EQ(2, result);
-  EXPECT_EQ("st", std::string(buffer->data(), result));
-
-  // The whole data is read, so Read() should return 0 immediately by then.
-  result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-  EXPECT_EQ(0, result);
-}
-
-TEST_F(NetworkReaderProxyTest, ErrorWithPendingCallback) {
-  NetworkReaderProxy proxy(0, 10, 10, base::DoNothing());
-
-  net::TestCompletionCallback callback;
-  const int kBufferSize = 3;
-  scoped_refptr<net::IOBuffer> buffer =
-      base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-
-  // Set pending callback.
-  int result = proxy.Read(buffer.get(), kBufferSize, callback.callback());
-  EXPECT_EQ(net::ERR_IO_PENDING, result);
-
-  // Emulate that an error is found. The callback should be called internally.
-  proxy.OnCompleted(FILE_ERROR_FAILED);
-  result = callback.GetResult(result);
-  EXPECT_EQ(net::ERR_FAILED, result);
-
-  // The next Read call should also return the same error code.
-  EXPECT_EQ(net::ERR_FAILED,
-            proxy.Read(buffer.get(), kBufferSize, callback.callback()));
-}
-
-TEST_F(NetworkReaderProxyTest, ErrorWithPendingData) {
-  NetworkReaderProxy proxy(0, 10, 10, base::DoNothing());
-
-  net::TestCompletionCallback callback;
-  const int kBufferSize = 3;
-  scoped_refptr<net::IOBuffer> buffer =
-      base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-
-  // Supply the data before an error.
-  std::unique_ptr<std::string> data(new std::string("abcde"));
-  proxy.OnGetContent(std::move(data));
-
-  // Emulate that an error is found.
-  proxy.OnCompleted(FILE_ERROR_FAILED);
-
-  // The next Read call should return the error code, even if there is
-  // pending data (the pending data should be released in OnCompleted.
-  EXPECT_EQ(net::ERR_FAILED,
-            proxy.Read(buffer.get(), kBufferSize, callback.callback()));
-}
-
-TEST_F(NetworkReaderProxyTest, CancelJob) {
-  int num_called = 0;
-  {
-    NetworkReaderProxy proxy(
-        0, 0, 0, base::Bind(&IncrementCallback, &num_called));
-    proxy.OnCompleted(FILE_ERROR_OK);
-    // Destroy the instance after the network operation is completed.
-    // The cancelling callback shouldn't be called.
-  }
-  EXPECT_EQ(0, num_called);
-
-  num_called = 0;
-  {
-    NetworkReaderProxy proxy(
-        0, 0, 0, base::Bind(&IncrementCallback, &num_called));
-    // Destroy the instance before the network operation is completed.
-    // The cancelling callback should be called.
-  }
-  EXPECT_EQ(1, num_called);
-}
-
-}  // namespace internal
-
-class DriveFileStreamReaderTest : public ::testing::Test {
- protected:
-  DriveFileStreamReaderTest()
-      : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) {}
-
-  void SetUp() override {
-    worker_thread_ =
-        std::make_unique<base::Thread>("DriveFileStreamReaderTest");
-    ASSERT_TRUE(worker_thread_->Start());
-
-    // Initialize FakeDriveService.
-    fake_drive_service_ = std::make_unique<FakeDriveService>();
-    ASSERT_TRUE(test_util::SetUpTestEntries(fake_drive_service_.get()));
-
-    // Create a testee instance.
-    fake_file_system_ =
-        std::make_unique<test_util::FakeFileSystem>(fake_drive_service_.get());
-  }
-
-  FileSystemInterface* GetFileSystem() {
-    return fake_file_system_.get();
-  }
-
-  DriveFileStreamReader::FileSystemGetter GetFileSystemGetter() {
-    return base::Bind(&DriveFileStreamReaderTest::GetFileSystem,
-                      base::Unretained(this));
-  }
-
-  content::BrowserTaskEnvironment task_environment_;
-
-  std::unique_ptr<base::Thread> worker_thread_;
-
-  std::unique_ptr<FakeDriveService> fake_drive_service_;
-  std::unique_ptr<test_util::FakeFileSystem> fake_file_system_;
-};
-
-TEST_F(DriveFileStreamReaderTest, Read) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-  // Create the reader, and initialize it.
-  // In this case, the file is not yet locally cached.
-  std::unique_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader(
-      GetFileSystemGetter(), worker_thread_->task_runner().get()));
-  EXPECT_FALSE(reader->IsInitialized());
-
-  int error = net::ERR_FAILED;
-  std::unique_ptr<ResourceEntry> entry;
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        net::HttpByteRange(),
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::OK, error);
-  ASSERT_TRUE(entry);
-  EXPECT_TRUE(reader->IsInitialized());
-  size_t content_size = entry->file_info().size();
-
-  // Read data from the reader.
-  std::string first_content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &first_content));
-  EXPECT_EQ(content_size, first_content.size());
-
-  // Create second instance and initialize it.
-  // In this case, the file should be cached one.
-  reader = std::make_unique<DriveFileStreamReader>(
-      GetFileSystemGetter(), worker_thread_->task_runner().get());
-  EXPECT_FALSE(reader->IsInitialized());
-
-  error = net::ERR_FAILED;
-  entry.reset();
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        net::HttpByteRange(),
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::OK, error);
-  ASSERT_TRUE(entry);
-  EXPECT_TRUE(reader->IsInitialized());
-
-  // The size should be same.
-  EXPECT_EQ(content_size, static_cast<size_t>(entry->file_info().size()));
-
-  // Read data from the reader, again.
-  std::string second_content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &second_content));
-
-  // The same content is expected.
-  EXPECT_EQ(first_content, second_content);
-}
-
-TEST_F(DriveFileStreamReaderTest, ReadRange) {
-  // In this test case, we just confirm that the part of file is read.
-  const int64_t kRangeOffset = 3;
-  const int64_t kRangeLength = 4;
-
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-  // Create the reader, and initialize it.
-  // In this case, the file is not yet locally cached.
-  std::unique_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader(
-      GetFileSystemGetter(), worker_thread_->task_runner().get()));
-  EXPECT_FALSE(reader->IsInitialized());
-
-  int error = net::ERR_FAILED;
-  std::unique_ptr<ResourceEntry> entry;
-  net::HttpByteRange byte_range;
-  byte_range.set_first_byte_position(kRangeOffset);
-  // Last byte position is inclusive.
-  byte_range.set_last_byte_position(kRangeOffset + kRangeLength - 1);
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        byte_range,
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::OK, error);
-  ASSERT_TRUE(entry);
-  EXPECT_TRUE(reader->IsInitialized());
-
-  // Read data from the reader.
-  std::string first_content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &first_content));
-
-  // The length should be equal to range length.
-  EXPECT_EQ(kRangeLength, static_cast<int64_t>(first_content.size()));
-
-  // Create second instance and initialize it.
-  // In this case, the file should be cached one.
-  reader = std::make_unique<DriveFileStreamReader>(
-      GetFileSystemGetter(), worker_thread_->task_runner().get());
-  EXPECT_FALSE(reader->IsInitialized());
-
-  error = net::ERR_FAILED;
-  entry.reset();
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        byte_range,
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::OK, error);
-  ASSERT_TRUE(entry);
-  EXPECT_TRUE(reader->IsInitialized());
-
-  // Read data from the reader, again.
-  std::string second_content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &second_content));
-
-  // The same content is expected.
-  EXPECT_EQ(first_content, second_content);
-}
-
-TEST_F(DriveFileStreamReaderTest, OutOfRangeError) {
-  const int64_t kRangeOffset = 1000000;  // Out of range.
-  const int64_t kRangeLength = 4;
-
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-  // Create the reader, and initialize it.
-  // In this case, the file is not yet locally cached.
-  std::unique_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader(
-      GetFileSystemGetter(), worker_thread_->task_runner().get()));
-  EXPECT_FALSE(reader->IsInitialized());
-
-  int error = net::ERR_FAILED;
-  std::unique_ptr<ResourceEntry> entry;
-  net::HttpByteRange byte_range;
-  byte_range.set_first_byte_position(kRangeOffset);
-  // Last byte position is inclusive.
-  byte_range.set_last_byte_position(kRangeOffset + kRangeLength - 1);
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        byte_range,
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, error);
-  EXPECT_FALSE(entry);
-}
-
-TEST_F(DriveFileStreamReaderTest, ZeroByteFileRead) {
-  // Prepare an empty file
-  {
-    google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR;
-    std::unique_ptr<google_apis::FileResource> entry;
-    fake_drive_service_->AddNewFile(
-        "text/plain",
-        "",  // empty
-        fake_drive_service_->GetRootResourceId(),
-        "EmptyFile.txt",
-        false,  // shared_with_me
-        google_apis::test_util::CreateCopyResultCallback(&error, &entry));
-    content::RunAllTasksUntilIdle();
-    ASSERT_EQ(google_apis::HTTP_CREATED, error);
-    ASSERT_TRUE(entry);
-    ASSERT_EQ(0, entry->file_size());
-  }
-
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("EmptyFile.txt");
-  // Create the reader, and initialize it.
-  // In this case, the file is not yet locally cached.
-  std::unique_ptr<DriveFileStreamReader> reader(new DriveFileStreamReader(
-      GetFileSystemGetter(), worker_thread_->task_runner().get()));
-  EXPECT_FALSE(reader->IsInitialized());
-
-  int error = net::ERR_FAILED;
-  std::unique_ptr<ResourceEntry> entry;
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        net::HttpByteRange(),
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::OK, error);
-  ASSERT_TRUE(entry);
-  ASSERT_EQ(0u, entry->file_info().size());  // It's a zero-byte file.
-  EXPECT_TRUE(reader->IsInitialized());
-
-  // Read data from the reader. Check that it successfuly reads empty data.
-  std::string first_content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &first_content));
-  EXPECT_EQ(0u, first_content.size());
-
-  // Create second instance and initialize it.
-  // In this case, the file should be cached one.
-  reader = std::make_unique<DriveFileStreamReader>(
-      GetFileSystemGetter(), worker_thread_->task_runner().get());
-  EXPECT_FALSE(reader->IsInitialized());
-
-  error = net::ERR_FAILED;
-  entry.reset();
-  {
-    base::RunLoop run_loop;
-    reader->Initialize(
-        kDriveFile,
-        net::HttpByteRange(),
-        google_apis::test_util::CreateQuitCallback(
-            &run_loop,
-            google_apis::test_util::CreateCopyResultCallback(&error, &entry)));
-    run_loop.Run();
-  }
-  EXPECT_EQ(net::OK, error);
-  ASSERT_TRUE(entry);
-  EXPECT_TRUE(reader->IsInitialized());
-
-  // Read data from the reader, again.
-  std::string second_content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &second_content));
-  EXPECT_EQ(0u, second_content.size());
-}
-
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/async_file_util.cc b/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
deleted file mode 100644
index 4e640e0..0000000
--- a/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
+++ /dev/null
@@ -1,471 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/async_file_util.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "base/task/post_task.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/drive/drive_integration_service.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
-#include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "google_apis/drive/task_util.h"
-#include "storage/browser/blob/shareable_file_reference.h"
-#include "storage/browser/fileapi/file_system_operation_context.h"
-#include "storage/browser/fileapi/file_system_url.h"
-
-using content::BrowserThread;
-
-namespace drive {
-namespace internal {
-namespace {
-
-// Posts fileapi_internal::RunFileSystemCallback to UI thread.
-// This function must be called on IO thread.
-// The |on_error_callback| will be called (on error case) on IO thread.
-void PostFileSystemCallback(
-    const fileapi_internal::FileSystemGetter& file_system_getter,
-    const base::Callback<void(FileSystemInterface*)>& function,
-    const base::Closure& on_error_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::PostTask(
-      FROM_HERE, {BrowserThread::UI},
-      base::BindOnce(&fileapi_internal::RunFileSystemCallback,
-                     file_system_getter, function,
-                     on_error_callback.is_null()
-                         ? base::Closure()
-                         : base::Bind(&google_apis::RunTaskWithTaskRunner,
-                                      base::ThreadTaskRunnerHandle::Get(),
-                                      on_error_callback)));
-}
-
-// Runs CreateOrOpenFile callback based on the given |error| and |file|.
-void RunCreateOrOpenFileCallback(
-    AsyncFileUtil::CreateOrOpenCallback callback,
-    base::File file,
-    const base::Closure& close_callback_on_ui_thread) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  // It is necessary to make a closure, which runs on file closing here.
-  // It will be provided as a FileSystem::OpenFileCallback's argument later.
-  // (crbug.com/259184).
-  std::move(callback).Run(
-      std::move(file),
-      base::Bind(&google_apis::RunTaskWithTaskRunner,
-                 base::CreateSingleThreadTaskRunner({BrowserThread::UI}),
-                 close_callback_on_ui_thread));
-}
-
-// Runs CreateOrOpenFile when the error happens.
-void RunCreateOrOpenFileCallbackOnError(
-    AsyncFileUtil::CreateOrOpenCallback callback,
-    base::File::Error error) {
-  std::move(callback).Run(base::File(error), base::Closure());
-}
-
-// Runs EnsureFileExistsCallback based on the given |error|.
-void RunEnsureFileExistsCallback(
-    AsyncFileUtil::EnsureFileExistsCallback callback,
-    base::File::Error error) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  // Remember if the file is actually created or not.
-  bool created = (error == base::File::FILE_OK);
-
-  // File::FILE_ERROR_EXISTS is not an actual error here.
-  if (error == base::File::FILE_ERROR_EXISTS)
-    error = base::File::FILE_OK;
-
-  std::move(callback).Run(error, created);
-}
-
-// Runs |callback| with the arguments based on the given arguments.
-void RunCreateSnapshotFileCallback(
-    AsyncFileUtil::CreateSnapshotFileCallback callback,
-    base::File::Error error,
-    const base::File::Info& file_info,
-    const base::FilePath& local_path,
-    storage::ScopedFile::ScopeOutPolicy scope_out_policy) {
-  // ShareableFileReference is thread *unsafe* class. So it is necessary to
-  // create the instance (by invoking GetOrCreate) on IO thread, though
-  // most drive file system related operations run on UI thread.
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  scoped_refptr<storage::ShareableFileReference> file_reference =
-      storage::ShareableFileReference::GetOrCreate(
-          storage::ScopedFile(local_path, scope_out_policy,
-                              base::CreateSequencedTaskRunner(
-                                  {base::ThreadPool(), base::MayBlock(),
-                                   base::TaskPriority::USER_BLOCKING})));
-  std::move(callback).Run(error, file_info, local_path,
-                          std::move(file_reference));
-}
-
-}  // namespace
-
-AsyncFileUtil::AsyncFileUtil() = default;
-
-AsyncFileUtil::~AsyncFileUtil() = default;
-
-void AsyncFileUtil::CreateOrOpen(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    int file_flags,
-    CreateOrOpenCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File(base::File::FILE_ERROR_NOT_FOUND),
-                            base::Closure());
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  const fileapi_internal::FileSystemGetter getter =
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url);
-  PostFileSystemCallback(
-      getter,
-      base::Bind(&fileapi_internal::OpenFile, file_path, file_flags,
-                 google_apis::CreateRelayCallback(base::Bind(
-                     &RunCreateOrOpenFileCallback, copyable_callback))),
-      base::Bind(&RunCreateOrOpenFileCallbackOnError, copyable_callback,
-                 base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::EnsureFileExists(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    EnsureFileExistsCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND, false);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::CreateFile, file_path,
-                 true /* is_exlusive */,
-                 google_apis::CreateRelayCallback(base::Bind(
-                     &RunEnsureFileExistsCallback, copyable_callback))),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED, false));
-}
-
-void AsyncFileUtil::CreateDirectory(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    bool exclusive,
-    bool recursive,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::CreateDirectory, file_path, exclusive,
-                 recursive,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::GetFileInfo(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    int /* fields */,
-    GetFileInfoCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND,
-                            base::File::Info());
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::GetFileInfo, file_path,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED,
-                 base::File::Info()));
-}
-
-void AsyncFileUtil::ReadDirectory(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    ReadDirectoryCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    callback.Run(base::File::FILE_ERROR_NOT_FOUND, EntryList(), false);
-    return;
-  }
-
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::ReadDirectory,
-                 file_path, google_apis::CreateRelayCallback(callback)),
-      base::Bind(callback, base::File::FILE_ERROR_FAILED,
-                 EntryList(), false));
-}
-
-void AsyncFileUtil::Touch(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    const base::Time& last_access_time,
-    const base::Time& last_modified_time,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::TouchFile, file_path, last_access_time,
-                 last_modified_time,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::Truncate(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    int64_t length,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::Truncate, file_path, length,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::CopyFileLocal(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& src_url,
-    const storage::FileSystemURL& dest_url,
-    CopyOrMoveOption option,
-    CopyFileProgressCallback progress_callback,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath src_path = util::ExtractDrivePathFromFileSystemUrl(src_url);
-  base::FilePath dest_path = util::ExtractDrivePathFromFileSystemUrl(dest_url);
-  if (src_path.empty() || dest_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(kinaba): crbug.com/339794.
-  // Assumption here is that |src_url| and |dest_url| are always from the same
-  // profile. This indeed holds as long as we mount different profiles onto
-  // different mount point. Hence, using GetFileSystemFromUrl(dest_url) is safe.
-  // This will change after we introduce cross-profile sharing etc., and we
-  // need to deal with files from different profiles here.
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, dest_url),
-      base::Bind(
-          &fileapi_internal::Copy, src_path, dest_path,
-          option == storage::FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED,
-          google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::MoveFileLocal(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& src_url,
-    const storage::FileSystemURL& dest_url,
-    CopyOrMoveOption option,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath src_path = util::ExtractDrivePathFromFileSystemUrl(src_url);
-  base::FilePath dest_path = util::ExtractDrivePathFromFileSystemUrl(dest_url);
-  if (src_path.empty() || dest_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(kinaba): see the comment in CopyFileLocal(). |src_url| and |dest_url|
-  // always return the same FileSystem by GetFileSystemFromUrl, but we need to
-  // change it in order to support cross-profile file sharing etc.
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, dest_url),
-      base::Bind(&fileapi_internal::Move, src_path, dest_path,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::CopyInForeignFile(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const base::FilePath& src_file_path,
-    const storage::FileSystemURL& dest_url,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath dest_path = util::ExtractDrivePathFromFileSystemUrl(dest_url);
-  if (dest_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, dest_url),
-      base::Bind(&fileapi_internal::CopyInForeignFile, src_file_path, dest_path,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::DeleteFile(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::Remove, file_path,
-                 false /* not recursive */,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::DeleteDirectory(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::Remove, file_path,
-                 false /* not recursive */,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::DeleteRecursively(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    StatusCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND);
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::Remove, file_path, true /* recursive */,
-                 google_apis::CreateRelayCallback(copyable_callback)),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED));
-}
-
-void AsyncFileUtil::CreateSnapshotFile(
-    std::unique_ptr<storage::FileSystemOperationContext> context,
-    const storage::FileSystemURL& url,
-    CreateSnapshotFileCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    std::move(callback).Run(base::File::FILE_ERROR_NOT_FOUND,
-                            base::File::Info(), base::FilePath(),
-                            scoped_refptr<storage::ShareableFileReference>());
-    return;
-  }
-
-  // TODO(tzik): Update PostFileSystemCallback to remove
-  // AdaptCallbackForRepeating here.
-  auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback));
-  PostFileSystemCallback(
-      base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-      base::Bind(&fileapi_internal::CreateSnapshotFile, file_path,
-                 google_apis::CreateRelayCallback(base::Bind(
-                     &RunCreateSnapshotFileCallback, copyable_callback))),
-      base::Bind(copyable_callback, base::File::FILE_ERROR_FAILED,
-                 base::File::Info(), base::FilePath(),
-                 scoped_refptr<storage::ShareableFileReference>()));
-}
-
-}  // namespace internal
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/async_file_util.h b/chrome/browser/chromeos/drive/fileapi/async_file_util.h
deleted file mode 100644
index 24bd1f5..0000000
--- a/chrome/browser/chromeos/drive/fileapi/async_file_util.h
+++ /dev/null
@@ -1,100 +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 CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_ASYNC_FILE_UTIL_H_
-#define CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_ASYNC_FILE_UTIL_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "storage/browser/fileapi/async_file_util.h"
-
-namespace drive {
-
-namespace internal {
-
-// The implementation of storage::AsyncFileUtil for Drive File System.
-class AsyncFileUtil : public storage::AsyncFileUtil {
- public:
-  AsyncFileUtil();
-  ~AsyncFileUtil() override;
-
-  // storage::AsyncFileUtil overrides.
-  void CreateOrOpen(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      int file_flags,
-      CreateOrOpenCallback callback) override;
-  void EnsureFileExists(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      EnsureFileExistsCallback callback) override;
-  void CreateDirectory(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      bool exclusive,
-      bool recursive,
-      StatusCallback callback) override;
-  void GetFileInfo(std::unique_ptr<storage::FileSystemOperationContext> context,
-                   const storage::FileSystemURL& url,
-                   int fields,
-                   GetFileInfoCallback callback) override;
-  void ReadDirectory(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      ReadDirectoryCallback callback) override;
-  void Touch(std::unique_ptr<storage::FileSystemOperationContext> context,
-             const storage::FileSystemURL& url,
-             const base::Time& last_access_time,
-             const base::Time& last_modified_time,
-             StatusCallback callback) override;
-  void Truncate(std::unique_ptr<storage::FileSystemOperationContext> context,
-                const storage::FileSystemURL& url,
-                int64_t length,
-                StatusCallback callback) override;
-  void CopyFileLocal(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& src_url,
-      const storage::FileSystemURL& dest_url,
-      CopyOrMoveOption option,
-      CopyFileProgressCallback progress_callback,
-      StatusCallback callback) override;
-  void MoveFileLocal(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& src_url,
-      const storage::FileSystemURL& dest_url,
-      CopyOrMoveOption option,
-      StatusCallback callback) override;
-  void CopyInForeignFile(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const base::FilePath& src_file_path,
-      const storage::FileSystemURL& dest_url,
-      StatusCallback callback) override;
-  void DeleteFile(std::unique_ptr<storage::FileSystemOperationContext> context,
-                  const storage::FileSystemURL& url,
-                  StatusCallback callback) override;
-  void DeleteDirectory(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      StatusCallback callback) override;
-  void DeleteRecursively(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      StatusCallback callback) override;
-  void CreateSnapshotFile(
-      std::unique_ptr<storage::FileSystemOperationContext> context,
-      const storage::FileSystemURL& url,
-      CreateSnapshotFileCallback callback) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AsyncFileUtil);
-};
-
-}  // namespace internal
-}  // namespace drive
-
-#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_ASYNC_FILE_UTIL_H_
diff --git a/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc b/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc
deleted file mode 100644
index 6ab4ea1b..0000000
--- a/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/task/post_task.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
-#include "chrome/browser/chromeos/drive/fileapi/async_file_util.h"
-#include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h"
-#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h"
-#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.h"
-#include "components/drive/chromeos/file_system_interface.h"
-#include "components/drive/drive_api_util.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "storage/browser/fileapi/async_file_util.h"
-#include "storage/browser/fileapi/file_stream_reader.h"
-#include "storage/browser/fileapi/file_system_context.h"
-#include "storage/browser/fileapi/file_system_url.h"
-
-using content::BrowserThread;
-
-namespace drive {
-namespace {
-
-// Called on the UI thread after GetRedirectURLForContentsOnUIThread. Obtains
-// the browser URL from |entry|. |callback| will be called on the IO thread.
-void GetRedirectURLForContentsOnUIThreadWithResourceEntry(
-    const storage::URLCallback& callback,
-    FileError error,
-    std::unique_ptr<ResourceEntry> entry) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  GURL url;
-  if (error == FILE_ERROR_OK && entry->has_file_specific_info() &&
-      entry->file_specific_info().is_hosted_document()) {
-    url = GURL(entry->alternate_url());
-  }
-  base::PostTask(FROM_HERE, {BrowserThread::IO}, base::BindOnce(callback, url));
-}
-
-// Called on the UI thread after
-// FileSystemBackendDelegate::GetRedirectURLForContents.  Requestes to obtain
-// ResourceEntry for the |url|.
-void GetRedirectURLForContentsOnUIThread(
-    const storage::FileSystemURL& url,
-    const storage::URLCallback& callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  FileSystemInterface* const file_system =
-      fileapi_internal::GetFileSystemFromUrl(url);
-  if (!file_system) {
-    base::PostTask(FROM_HERE, {BrowserThread::IO},
-                   base::BindOnce(callback, GURL()));
-    return;
-  }
-  const base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty()) {
-    base::PostTask(FROM_HERE, {BrowserThread::IO},
-                   base::BindOnce(callback, GURL()));
-    return;
-  }
-
-  file_system->GetResourceEntry(
-      file_path,
-      base::BindOnce(&GetRedirectURLForContentsOnUIThreadWithResourceEntry,
-                     callback));
-}
-
-}  // namespace
-
-FileSystemBackendDelegate::FileSystemBackendDelegate()
-    : async_file_util_(new internal::AsyncFileUtil) {
-}
-
-FileSystemBackendDelegate::~FileSystemBackendDelegate() = default;
-
-storage::AsyncFileUtil* FileSystemBackendDelegate::GetAsyncFileUtil(
-    storage::FileSystemType type) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(storage::kFileSystemTypeDrive, type);
-  return async_file_util_.get();
-}
-
-std::unique_ptr<storage::FileStreamReader>
-FileSystemBackendDelegate::CreateFileStreamReader(
-    const storage::FileSystemURL& url,
-    int64_t offset,
-    int64_t max_bytes_to_read,
-    const base::Time& expected_modification_time,
-    storage::FileSystemContext* context) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(storage::kFileSystemTypeDrive, url.type());
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  if (file_path.empty())
-    return std::unique_ptr<storage::FileStreamReader>();
-
-  return std::unique_ptr<storage::FileStreamReader>(
-      new internal::WebkitFileStreamReaderImpl(
-          base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-          context->default_file_task_runner(), file_path, offset,
-          expected_modification_time));
-}
-
-std::unique_ptr<storage::FileStreamWriter>
-FileSystemBackendDelegate::CreateFileStreamWriter(
-    const storage::FileSystemURL& url,
-    int64_t offset,
-    storage::FileSystemContext* context) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(storage::kFileSystemTypeDrive, url.type());
-
-  base::FilePath file_path = util::ExtractDrivePathFromFileSystemUrl(url);
-  // Hosted documents don't support stream writer.
-  if (file_path.empty() || util::HasHostedDocumentExtension(file_path))
-    return std::unique_ptr<storage::FileStreamWriter>();
-
-  return std::unique_ptr<storage::FileStreamWriter>(
-      new internal::WebkitFileStreamWriterImpl(
-          base::Bind(&fileapi_internal::GetFileSystemFromUrl, url),
-          context->default_file_task_runner(), file_path, offset));
-}
-
-storage::WatcherManager* FileSystemBackendDelegate::GetWatcherManager(
-    storage::FileSystemType type) {
-  NOTIMPLEMENTED();
-  return nullptr;
-}
-
-void FileSystemBackendDelegate::GetRedirectURLForContents(
-    const storage::FileSystemURL& url,
-    const storage::URLCallback& callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  base::PostTask(
-      FROM_HERE, {BrowserThread::UI},
-      base::BindOnce(&GetRedirectURLForContentsOnUIThread, url, callback));
-}
-
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h b/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h
deleted file mode 100644
index 6ac4027..0000000
--- a/chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h
+++ /dev/null
@@ -1,59 +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 CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILE_SYSTEM_BACKEND_DELEGATE_H_
-#define CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILE_SYSTEM_BACKEND_DELEGATE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/chromeos/fileapi/file_system_backend_delegate.h"
-
-namespace storage {
-class AsyncFileUtil;
-class FileSystemContext;
-class FileStreamReader;
-class FileSystemURL;
-class FileStreamWriter;
-class WatcherManager;
-}  // namespace storage
-
-namespace drive {
-
-// Delegate implementation of the some methods in chromeos::FileSystemBackend
-// for Drive file system.
-class FileSystemBackendDelegate : public chromeos::FileSystemBackendDelegate {
- public:
-  FileSystemBackendDelegate();
-  ~FileSystemBackendDelegate() override;
-
-  // FileSystemBackend::Delegate overrides.
-  storage::AsyncFileUtil* GetAsyncFileUtil(
-      storage::FileSystemType type) override;
-  std::unique_ptr<storage::FileStreamReader> CreateFileStreamReader(
-      const storage::FileSystemURL& url,
-      int64_t offset,
-      int64_t max_bytes_to_read,
-      const base::Time& expected_modification_time,
-      storage::FileSystemContext* context) override;
-  std::unique_ptr<storage::FileStreamWriter> CreateFileStreamWriter(
-      const storage::FileSystemURL& url,
-      int64_t offset,
-      storage::FileSystemContext* context) override;
-  storage::WatcherManager* GetWatcherManager(
-      storage::FileSystemType type) override;
-  void GetRedirectURLForContents(const storage::FileSystemURL& url,
-                                 const storage::URLCallback& callback) override;
-
- private:
-  std::unique_ptr<storage::AsyncFileUtil> async_file_util_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileSystemBackendDelegate);
-};
-
-}  // namespace drive
-
-#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILE_SYSTEM_BACKEND_DELEGATE_H_
diff --git a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc b/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
deleted file mode 100644
index b1f77d7..0000000
--- a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
+++ /dev/null
@@ -1,367 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h"
-
-#include <stddef.h>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/task/post_task.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
-#include "components/drive/chromeos/file_system_interface.h"
-#include "components/drive/drive.pb.h"
-#include "components/drive/file_errors.h"
-#include "components/drive/resource_entry_conversion.h"
-#include "components/services/filesystem/public/mojom/types.mojom.h"
-#include "content/public/browser/browser_thread.h"
-#include "storage/browser/fileapi/file_system_url.h"
-
-using content::BrowserThread;
-
-namespace drive {
-namespace fileapi_internal {
-namespace {
-
-// The summary of opening mode is:
-// - File::FLAG_OPEN: Open the existing file. Fail if not exists.
-// - File::FLAG_CREATE: Create the file if not exists. Fail if exists.
-// - File::FLAG_OPEN_ALWAYS: Open the existing file. Create a new file
-//     if not exists.
-// - File::FLAG_CREATE_ALWAYS: Create a new file if not exists. If exists
-//     open it with truncate.
-// - File::FLAG_OPEN_TRUNCATE: Open the existing file with truncate.
-//     Fail if not exists.
-OpenMode GetOpenMode(int file_flag) {
-  if (file_flag & (base::File::FLAG_OPEN | base::File::FLAG_OPEN_TRUNCATED))
-    return OPEN_FILE;
-
-  if (file_flag & base::File::FLAG_CREATE)
-    return CREATE_FILE;
-
-  DCHECK(file_flag &
-         (base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_CREATE_ALWAYS));
-  return OPEN_OR_CREATE_FILE;
-}
-
-// Runs |callback| with the File::Error converted from |error|.
-void RunStatusCallbackByFileError(const StatusCallback& callback,
-                                  FileError error) {
-  callback.Run(FileErrorToBaseFileError(error));
-}
-
-// Runs |callback| with arguments converted from |error| and |entry|.
-void RunGetFileInfoCallback(const GetFileInfoCallback& callback,
-                            FileError error,
-                            std::unique_ptr<ResourceEntry> entry) {
-  if (error != FILE_ERROR_OK) {
-    callback.Run(FileErrorToBaseFileError(error), base::File::Info());
-    return;
-  }
-
-  DCHECK(entry);
-  base::File::Info file_info;
-  ConvertResourceEntryToFileInfo(*entry, &file_info);
-  callback.Run(base::File::FILE_OK, file_info);
-}
-
-// Runs |callback| with entries.
-void RunReadDirectoryCallbackWithEntries(
-    const ReadDirectoryCallback& callback,
-    std::unique_ptr<ResourceEntryVector> resource_entries) {
-  DCHECK(resource_entries);
-
-  std::vector<filesystem::mojom::DirectoryEntry> entries;
-  // Convert drive files to File API's directory entry.
-  entries.reserve(resource_entries->size());
-  for (size_t i = 0; i < resource_entries->size(); ++i) {
-    const ResourceEntry& resource_entry = (*resource_entries)[i];
-    entries.emplace_back(base::FilePath(resource_entry.base_name()),
-                         resource_entry.file_info().is_directory()
-                             ? filesystem::mojom::FsFileType::DIRECTORY
-                             : filesystem::mojom::FsFileType::REGULAR_FILE);
-  }
-
-  callback.Run(base::File::FILE_OK, entries, true /*has_more*/);
-}
-
-// Runs |callback| with |error|.
-void RunReadDirectoryCallbackOnCompletion(const ReadDirectoryCallback& callback,
-                                          FileError error) {
-  callback.Run(FileErrorToBaseFileError(error),
-               std::vector<filesystem::mojom::DirectoryEntry>(),
-               false /*has_more*/);
-}
-
-// Runs |callback| with arguments based on |error|, |local_path| and |entry|.
-void RunCreateSnapshotFileCallback(const CreateSnapshotFileCallback& callback,
-                                   FileError error,
-                                   const base::FilePath& local_path,
-                                   std::unique_ptr<ResourceEntry> entry) {
-  if (error != FILE_ERROR_OK) {
-    callback.Run(FileErrorToBaseFileError(error),
-                 base::File::Info(),
-                 base::FilePath(),
-                 storage::ScopedFile::ScopeOutPolicy());
-    return;
-  }
-
-  DCHECK(entry);
-
-  // When reading file, last modified time specified in file info will be
-  // compared to the last modified time of the local version of the drive file.
-  // Since those two values don't generally match (last modification time on the
-  // drive server vs. last modification time of the local, downloaded file), so
-  // we have to opt out from this check. We do this by unsetting last_modified
-  // value in the file info passed to the CreateSnapshot caller.
-  base::File::Info file_info;
-  ConvertResourceEntryToFileInfo(*entry, &file_info);
-  file_info.last_modified = base::Time();
-
-  // If the file is a hosted document, a temporary JSON file is created to
-  // represent the document. The JSON file is not cached and its lifetime
-  // is managed by ShareableFileReference.
-  storage::ScopedFile::ScopeOutPolicy scope_out_policy =
-      entry->file_specific_info().is_hosted_document()
-          ? storage::ScopedFile::DELETE_ON_SCOPE_OUT
-          : storage::ScopedFile::DONT_DELETE_ON_SCOPE_OUT;
-
-  callback.Run(base::File::FILE_OK, file_info, local_path, scope_out_policy);
-}
-
-// Runs |callback| with arguments converted from |error| and |local_path|.
-void RunCreateWritableSnapshotFileCallback(
-    const CreateWritableSnapshotFileCallback& callback,
-    FileError error,
-    const base::FilePath& local_path,
-    const base::Closure& close_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  callback.Run(FileErrorToBaseFileError(error), local_path, close_callback);
-}
-
-// Runs |callback| with |file|.
-void RunOpenFileCallback(const OpenFileCallback& callback,
-                         const base::Closure& close_callback,
-                         base::File file) {
-  callback.Run(std::move(file), close_callback);
-}
-
-base::File OpenFile(const base::FilePath& path, int flags) {
-  return base::File(path, flags);
-}
-
-// Part of OpenFile(). Called after FileSystem::OpenFile().
-void OpenFileAfterFileSystemOpenFile(int file_flags,
-                                     const OpenFileCallback& callback,
-                                     FileError error,
-                                     const base::FilePath& local_path,
-                                     const base::Closure& close_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  if (error != FILE_ERROR_OK) {
-    callback.Run(base::File(FileErrorToBaseFileError(error)), base::Closure());
-    return;
-  }
-
-  // Here, the file should be at |local_path|, but there may be timing issue.
-  // Because the file is managed by Drive file system, so, in order to avoid
-  // unexpected file creation, CREATE, OPEN_ALWAYS and CREATE_ALWAYS are
-  // translated into OPEN or OPEN_TRUNCATED, here. Keep OPEN and OPEN_TRUNCATED
-  // as is.
-  if (file_flags & (base::File::FLAG_CREATE |
-                    base::File::FLAG_OPEN_ALWAYS)) {
-    file_flags &= ~(base::File::FLAG_CREATE |
-                    base::File::FLAG_OPEN_ALWAYS);
-    file_flags |= base::File::FLAG_OPEN;
-  } else if (file_flags & base::File::FLAG_CREATE_ALWAYS) {
-    file_flags &= ~base::File::FLAG_CREATE_ALWAYS;
-    file_flags |= base::File::FLAG_OPEN_TRUNCATED;
-  }
-
-  // Cache file prepared for modification is available. Open it locally.
-  base::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::ThreadPool(), base::MayBlock()},
-      base::Bind(&OpenFile, local_path, file_flags),
-      base::Bind(&RunOpenFileCallback, callback, close_callback));
-}
-
-}  // namespace
-
-FileSystemInterface* GetFileSystemFromUrl(const storage::FileSystemURL& url) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  Profile* profile = util::ExtractProfileFromPath(url.path());
-  return profile ? util::GetFileSystemByProfile(profile) : nullptr;
-}
-
-void RunFileSystemCallback(
-    const FileSystemGetter& file_system_getter,
-    const base::Callback<void(FileSystemInterface*)>& callback,
-    const base::Closure& on_error_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  FileSystemInterface* file_system = file_system_getter.Run();
-
-  if (!file_system) {
-    if (!on_error_callback.is_null())
-      on_error_callback.Run();
-    return;
-  }
-
-  callback.Run(file_system);
-}
-
-void GetFileInfo(const base::FilePath& file_path,
-                 const GetFileInfoCallback& callback,
-                 FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->GetResourceEntry(
-      file_path, base::BindOnce(&RunGetFileInfoCallback, callback));
-}
-
-void Copy(const base::FilePath& src_file_path,
-          const base::FilePath& dest_file_path,
-          bool preserve_last_modified,
-          const StatusCallback& callback,
-          FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->Copy(src_file_path, dest_file_path, preserve_last_modified,
-                    base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void Move(const base::FilePath& src_file_path,
-          const base::FilePath& dest_file_path,
-          const StatusCallback& callback,
-          FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->Move(src_file_path, dest_file_path,
-                    base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void CopyInForeignFile(const base::FilePath& src_foreign_file_path,
-                       const base::FilePath& dest_file_path,
-                       const StatusCallback& callback,
-                       FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->TransferFileFromLocalToRemote(
-      src_foreign_file_path, dest_file_path,
-      base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void ReadDirectory(const base::FilePath& file_path,
-                   const ReadDirectoryCallback& callback,
-                   FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->ReadDirectory(
-      file_path,
-      base::Bind(&RunReadDirectoryCallbackWithEntries, callback),
-      base::Bind(&RunReadDirectoryCallbackOnCompletion, callback));
-}
-
-void Remove(const base::FilePath& file_path,
-            bool is_recursive,
-            const StatusCallback& callback,
-            FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->Remove(file_path, is_recursive,
-                      base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void CreateDirectory(const base::FilePath& file_path,
-                     bool is_exclusive,
-                     bool is_recursive,
-                     const StatusCallback& callback,
-                     FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->CreateDirectory(
-      file_path, is_exclusive, is_recursive,
-      base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void CreateFile(const base::FilePath& file_path,
-                bool is_exclusive,
-                const StatusCallback& callback,
-                FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->CreateFile(file_path, is_exclusive,
-                          std::string(),  // no mime type; guess from file_path
-                          base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void Truncate(const base::FilePath& file_path,
-              int64_t length,
-              const StatusCallback& callback,
-              FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->TruncateFile(
-      file_path, length,
-      base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-void CreateSnapshotFile(const base::FilePath& file_path,
-                        const CreateSnapshotFileCallback& callback,
-                        FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->GetFile(file_path,
-                       base::Bind(&RunCreateSnapshotFileCallback, callback));
-}
-
-void CreateWritableSnapshotFile(
-    const base::FilePath& file_path,
-    const CreateWritableSnapshotFileCallback& callback,
-    FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->OpenFile(
-      file_path,
-      OPEN_FILE,
-      std::string(),  // no mime type; we never create a new file here.
-      base::Bind(&RunCreateWritableSnapshotFileCallback, callback));
-}
-
-void OpenFile(const base::FilePath& file_path,
-              int file_flags,
-              const OpenFileCallback& callback,
-              FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  // Returns an error if any unsupported flag is found.
-  if (file_flags & ~(base::File::FLAG_OPEN |
-                     base::File::FLAG_CREATE |
-                     base::File::FLAG_OPEN_ALWAYS |
-                     base::File::FLAG_CREATE_ALWAYS |
-                     base::File::FLAG_OPEN_TRUNCATED |
-                     base::File::FLAG_READ |
-                     base::File::FLAG_WRITE |
-                     base::File::FLAG_WRITE_ATTRIBUTES |
-                     base::File::FLAG_APPEND)) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(callback,
-                       Passed(base::File(base::File::FILE_ERROR_FAILED)),
-                       base::Closure()));
-    return;
-  }
-
-  file_system->OpenFile(
-      file_path, GetOpenMode(file_flags),
-      std::string(),  // no mime type; guess from file_path
-      base::Bind(&OpenFileAfterFileSystemOpenFile, file_flags, callback));
-}
-
-void TouchFile(const base::FilePath& file_path,
-               const base::Time& last_access_time,
-               const base::Time& last_modified_time,
-               const StatusCallback& callback,
-               FileSystemInterface* file_system) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  file_system->TouchFile(file_path, last_access_time, last_modified_time,
-                         base::Bind(&RunStatusCallbackByFileError, callback));
-}
-
-}  // namespace fileapi_internal
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.h b/chrome/browser/chromeos/drive/fileapi/fileapi_worker.h
deleted file mode 100644
index e293122..0000000
--- a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.h
+++ /dev/null
@@ -1,184 +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.
-//
-// This file provides the core implementation of fileapi methods.
-// The functions should be called on UI thread.
-// Note that most method invocation of fileapi is done on IO thread. The gap is
-// filled by FileSystemProxy.
-// Also, the order of arguments for the functions which take FileSystemInterface
-// at the last is intentional. The instance of FileSystemInterface should be
-// accessible only on UI thread, but arguments are passed on IO thread.
-// So, here is an intended use case:
-//   1) Bind arguments on IO thread. Then a callback instance whose type is
-//      Callback<void(FileSysstemInterface*)> is created.
-//   2) Post the task to the UI thread.
-//   3) On UI thread, check if the instance of FileSystemInterface is alive or
-//      not. If yes, Run the callback with it.
-
-#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILEAPI_WORKER_H_
-#define CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILEAPI_WORKER_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/callback_forward.h"
-#include "base/memory/weak_ptr.h"
-#include "components/drive/file_errors.h"
-#include "components/services/filesystem/public/mojom/types.mojom.h"
-#include "storage/browser/blob/scoped_file.h"
-
-namespace base {
-class FilePath;
-}  // namespace base
-
-namespace storage {
-struct DirectoryEntry;
-class FileSystemURL;
-}  // namespace storage
-
-namespace drive {
-
-class FileSystemInterface;
-
-namespace fileapi_internal {
-
-typedef base::Callback<FileSystemInterface*()> FileSystemGetter;
-
-typedef base::Callback<
-    void(base::File::Error result)> StatusCallback;
-typedef base::Callback<
-    void(base::File::Error result,
-         const base::File::Info& file_info)> GetFileInfoCallback;
-typedef base::RepeatingCallback<void(
-    base::File::Error result,
-    std::vector<filesystem::mojom::DirectoryEntry> file_list,
-    bool has_more)>
-    ReadDirectoryCallback;
-typedef base::Callback<void(base::File::Error result,
-                            const base::File::Info& file_info,
-                            const base::FilePath& snapshot_file_path,
-                            storage::ScopedFile::ScopeOutPolicy
-                                scope_out_policy)> CreateSnapshotFileCallback;
-typedef base::Callback<
-    void(base::File::Error result,
-         const base::FilePath& snapshot_file_path,
-         const base::Closure& close_callback)>
-    CreateWritableSnapshotFileCallback;
-typedef base::Callback<
-    void(base::File file,
-         const base::Closure& close_callback)> OpenFileCallback;
-
-// Gets the profile of the Drive entry pointed by |url|. Used as
-// FileSystemGetter callback by binding an URL on the IO thread and passing to
-// the UI thread.
-FileSystemInterface* GetFileSystemFromUrl(const storage::FileSystemURL& url);
-
-// Runs |file_system_getter| to obtain the instance of FileSystemInstance,
-// and then runs |callback| with it.
-// If |file_system_getter| returns NULL, runs |error_callback| instead.
-// This function must be called on UI thread.
-// |file_system_getter| and |callback| must not be null, but
-// |error_callback| can be null (if no operation is necessary for error
-// case).
-void RunFileSystemCallback(
-    const FileSystemGetter& file_system_getter,
-    const base::Callback<void(FileSystemInterface*)>& callback,
-    const base::Closure& error_callback);
-
-// Returns the metadata info of the file at |file_path|.
-// Called from FileSystemProxy::GetFileInfo().
-void GetFileInfo(const base::FilePath& file_path,
-                 const GetFileInfoCallback& callback,
-                 FileSystemInterface* file_system);
-
-// Copies a file from |src_file_path| to |dest_file_path|.
-// Called from FileSystemProxy::Copy().
-void Copy(const base::FilePath& src_file_path,
-          const base::FilePath& dest_file_path,
-          bool preserve_last_modified,
-          const StatusCallback& callback,
-          FileSystemInterface* file_system);
-
-// Moves a file from |src_file_path| to |dest_file_path|.
-// Called from FileSystemProxy::Move().
-void Move(const base::FilePath& src_file_path,
-          const base::FilePath& dest_file_path,
-          const StatusCallback& callback,
-          FileSystemInterface* file_system);
-
-
-// Copies a file at |src_foreign_file_path|, which is not managed by Drive File
-// System, to |dest_file_path|.
-void CopyInForeignFile(const base::FilePath& src_foreign_file_path,
-                       const base::FilePath& dest_file_path,
-                       const StatusCallback& callback,
-                       FileSystemInterface* file_system);
-
-// Reads the contents of the directory at |file_path|.
-// Called from FileSystemProxy::ReadDirectory().
-void ReadDirectory(const base::FilePath& file_path,
-                   const ReadDirectoryCallback& callback,
-                   FileSystemInterface* file_system);
-
-// Removes a file at |file_path|. Called from FileSystemProxy::Remove().
-void Remove(const base::FilePath& file_path,
-            bool is_recursive,
-            const StatusCallback& callback,
-            FileSystemInterface* file_system);
-
-// Creates a new directory at |file_path|.
-// Called from FileSystemProxy::CreateDirectory().
-void CreateDirectory(const base::FilePath& file_path,
-                     bool is_exclusive,
-                     bool is_recursive,
-                     const StatusCallback& callback,
-                     FileSystemInterface* file_system);
-
-// Creates a new file at |file_path|.
-// Called from FileSystemProxy::CreateFile().
-void CreateFile(const base::FilePath& file_path,
-                bool is_exclusive,
-                const StatusCallback& callback,
-                FileSystemInterface* file_system);
-
-// Truncates the file at |file_path| to |length| bytes.
-// Called from FileSystemProxy::Truncate().
-void Truncate(const base::FilePath& file_path,
-              int64_t length,
-              const StatusCallback& callback,
-              FileSystemInterface* file_system);
-
-// Creates a snapshot for the file at |file_path|.
-// Called from FileSystemProxy::CreateSnapshotFile().
-void CreateSnapshotFile(const base::FilePath& file_path,
-                        const CreateSnapshotFileCallback& callback,
-                        FileSystemInterface* file_system);
-
-// Creates a writable snapshot for the file at |file_path|.
-// After writing operation is done, |close_callback| must be called.
-void CreateWritableSnapshotFile(
-    const base::FilePath& file_path,
-    const CreateWritableSnapshotFileCallback& callback,
-    FileSystemInterface* file_system);
-
-// Opens the file at |file_path| with options |file_flags|.
-// Called from FileSystemProxy::OpenFile.
-void OpenFile(const base::FilePath& file_path,
-              int file_flags,
-              const OpenFileCallback& callback,
-              FileSystemInterface* file_system);
-
-// Changes timestamp of the file at |file_path| to |last_access_time| and
-// |last_modified_time|. Called from FileSystemProxy::TouchFile().
-void TouchFile(const base::FilePath& file_path,
-               const base::Time& last_access_time,
-               const base::Time& last_modified_time,
-               const StatusCallback& callback,
-               FileSystemInterface* file_system);
-
-}  // namespace fileapi_internal
-}  // namespace drive
-
-#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_FILEAPI_WORKER_H_
diff --git a/chrome/browser/chromeos/drive/fileapi/fileapi_worker_unittest.cc b/chrome/browser/chromeos/drive/fileapi/fileapi_worker_unittest.cc
deleted file mode 100644
index a6fee93..0000000
--- a/chrome/browser/chromeos/drive/fileapi/fileapi_worker_unittest.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h"
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/file_util.h"
-#include "components/drive/chromeos/dummy_file_system.h"
-#include "content/public/test/browser_task_environment.h"
-#include "content/public/test/test_utils.h"
-#include "google_apis/drive/test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace drive {
-namespace fileapi_internal {
-namespace {
-
-// Increments |num_called| for checking how many times the closure is called.
-void Increment(int* num_called) {
-  ++*num_called;
-}
-
-// Returns the |instance| as is.
-FileSystemInterface* GetFileSystem(FileSystemInterface* instance) {
-  return instance;
-}
-
-// A test file system that always returns |local_file_path|. For testing
-// purpose, it checks if |open_mode| is the expected value, and record if the
-// close callback is called.
-class TestFileSystemForOpenFile : public DummyFileSystem {
- public:
-  TestFileSystemForOpenFile(const base::FilePath& local_file_path,
-                            OpenMode expected_open_mode)
-      : local_file_path_(local_file_path),
-        expected_open_mode_(expected_open_mode),
-        closed_(false) {
-  }
-
-  void OpenFile(const base::FilePath& file_path,
-                OpenMode open_mode,
-                const std::string& mime_type,
-                drive::OpenFileCallback callback) override {
-    EXPECT_EQ(expected_open_mode_, open_mode);
-
-    std::move(callback).Run(
-        FILE_ERROR_OK, local_file_path_,
-        base::Bind(&TestFileSystemForOpenFile::Close, base::Unretained(this)));
-  }
-
-  void Close() {
-    closed_ = true;
-  }
-
-  bool closed() const { return closed_; }
-
- private:
-  const base::FilePath local_file_path_;
-  const OpenMode expected_open_mode_;
-  bool closed_;
-};
-
-// Helper function of testing OpenFile() for write access. It checks that the
-// file handle correctly writes to the expected file.
-void VerifyWrite(int64_t expected_size,
-                 const base::FilePath& expected_written_path,
-                 const std::string& write_data,
-                 base::File file,
-                 const base::Closure& close_callback) {
-  // Check that the file was properly opened.
-  EXPECT_TRUE(file.IsValid());
-  EXPECT_FALSE(close_callback.is_null());
-
-  // Check that the file has the expected length (i.e., truncated or not)
-  base::File::Info info;
-  EXPECT_TRUE(file.GetInfo(&info));
-  EXPECT_EQ(expected_size, info.size);
-
-  // Write some data.
-  const int data_size = static_cast<int>(write_data.size());
-  EXPECT_EQ(data_size, file.Write(0, write_data.c_str(), data_size));
-  EXPECT_TRUE(file.SetLength(data_size));
-
-  // Close.
-  file.Close();
-  close_callback.Run();
-
-  // Checks that the written content goes to |expected_written_path|. I.e.,
-  // the |file| handle is pointing to the file.
-  std::string written;
-  EXPECT_TRUE(base::ReadFileToString(expected_written_path, &written));
-  EXPECT_EQ(write_data, written);
-}
-
-// Helper function of testing OpenFile() for read access. It checks that the
-// file is readable and contains |expected_data|.
-void VerifyRead(const std::string& expected_data,
-                base::File file,
-                const base::Closure& close_callback) {
-  // Check that the file was properly opened.
-  EXPECT_TRUE(file.IsValid());
-  EXPECT_FALSE(close_callback.is_null());
-
-  // Check that the file has the expected content.
-  const int data_size = static_cast<int>(expected_data.size());
-  base::File::Info info;
-  EXPECT_TRUE(file.GetInfo(&info));
-  EXPECT_EQ(data_size, info.size);
-
-  std::vector<char> buffer(data_size);
-  EXPECT_EQ(data_size, file.Read(0, buffer.data(), data_size));
-  EXPECT_EQ(expected_data, std::string(buffer.begin(), buffer.end()));
-
-  // Close.
-  file.Close();
-  close_callback.Run();
-}
-
-}  // namespace
-
-class FileApiWorkerTest : public testing::Test {
- private:
-  content::BrowserTaskEnvironment task_environment_;
-};
-
-TEST_F(FileApiWorkerTest, RunFileSystemCallbackSuccess) {
-  DummyFileSystem dummy_file_system;
-
-  FileSystemInterface* file_system = nullptr;
-  RunFileSystemCallback(
-      base::Bind(&GetFileSystem, &dummy_file_system),
-      google_apis::test_util::CreateCopyResultCallback(&file_system),
-      base::Closure());
-
-  EXPECT_EQ(&dummy_file_system, file_system);
-}
-
-TEST_F(FileApiWorkerTest, RunFileSystemCallbackFail) {
-  FileSystemInterface* file_system = nullptr;
-
-  // Make sure on_error_callback is called if file_system_getter returns NULL.
-  int num_called = 0;
-  RunFileSystemCallback(
-      base::Bind(&GetFileSystem, static_cast<FileSystemInterface*>(nullptr)),
-      google_apis::test_util::CreateCopyResultCallback(&file_system),
-      base::Bind(&Increment, &num_called));
-  EXPECT_EQ(1, num_called);
-
-  // Just make sure this null |on_error_callback| doesn't cause a crash.
-  RunFileSystemCallback(
-      base::Bind(&GetFileSystem, static_cast<FileSystemInterface*>(nullptr)),
-      google_apis::test_util::CreateCopyResultCallback(&file_system),
-      base::Closure());
-}
-
-TEST_F(FileApiWorkerTest, OpenFileForCreateWrite) {
-  const base::FilePath kDummyPath = base::FilePath::FromUTF8Unsafe("whatever");
-  const std::string kWriteData = "byebye";
-
-  base::FilePath temp_path;
-  base::CreateTemporaryFile(&temp_path);
-
-  // CREATE => CREATE (fails if file exists.)
-  TestFileSystemForOpenFile file_system(temp_path, CREATE_FILE);
-  const int64_t kExpectedSize = 0;
-
-  OpenFile(kDummyPath,
-           base::File::FLAG_CREATE | base::File::FLAG_WRITE,
-           base::Bind(&VerifyWrite, kExpectedSize, temp_path, kWriteData),
-           &file_system);
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(file_system.closed());
-}
-
-TEST_F(FileApiWorkerTest, OpenFileForOpenAlwaysWrite) {
-  const base::FilePath kDummyPath = base::FilePath::FromUTF8Unsafe("whatever");
-  const std::string kWriteData = "byebye";
-  const std::string kInitialData = "hello";
-
-  base::FilePath temp_path;
-  base::CreateTemporaryFile(&temp_path);
-  google_apis::test_util::WriteStringToFile(temp_path, kInitialData);
-
-  // OPEN_ALWAYS => OPEN_OR_CREATE (success whether file exists or not.)
-  // No truncation should take place.
-  TestFileSystemForOpenFile file_system(temp_path, OPEN_OR_CREATE_FILE);
-  const int64_t kExpectedSize = static_cast<int64_t>(kInitialData.size());
-
-  OpenFile(kDummyPath,
-           base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE,
-           base::Bind(&VerifyWrite, kExpectedSize, temp_path, kWriteData),
-           &file_system);
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(file_system.closed());
-}
-
-TEST_F(FileApiWorkerTest, OpenFileForOpenTruncatedWrite) {
-  const base::FilePath kDummyPath = base::FilePath::FromUTF8Unsafe("whatever");
-  const std::string kInitialData = "hello";
-  const std::string kWriteData = "byebye";
-
-  base::FilePath temp_path;
-  base::CreateTemporaryFile(&temp_path);
-  google_apis::test_util::WriteStringToFile(temp_path, kInitialData);
-
-  // OPEN_TRUNCATED => OPEN (failure when the file did not exist.)
-  // It should truncate the file before passing to the callback.
-  TestFileSystemForOpenFile file_system(temp_path, OPEN_FILE);
-  const int64_t kExpectedSize = 0;
-
-  OpenFile(kDummyPath,
-           base::File::FLAG_OPEN_TRUNCATED | base::File::FLAG_WRITE,
-           base::Bind(&VerifyWrite, kExpectedSize, temp_path, kWriteData),
-           &file_system);
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(file_system.closed());
-}
-
-TEST_F(FileApiWorkerTest, OpenFileForOpenCreateAlwaysWrite) {
-  const base::FilePath kDummyPath = base::FilePath::FromUTF8Unsafe("whatever");
-  const std::string kInitialData = "hello";
-  const std::string kWriteData = "byebye";
-
-  base::FilePath temp_path;
-  base::CreateTemporaryFile(&temp_path);
-  google_apis::test_util::WriteStringToFile(temp_path, kInitialData);
-
-  // CREATE_ALWAYS => OPEN_OR_CREATE (success whether file exists or not.)
-  // It should truncate the file before passing to the callback.
-  TestFileSystemForOpenFile file_system(temp_path, OPEN_OR_CREATE_FILE);
-  const int64_t kExpectedSize = 0;
-
-  OpenFile(kDummyPath,
-           base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE,
-           base::Bind(&VerifyWrite, kExpectedSize, temp_path, kWriteData),
-           &file_system);
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(file_system.closed());
-}
-
-TEST_F(FileApiWorkerTest, OpenFileForOpenRead) {
-  const base::FilePath kDummyPath = base::FilePath::FromUTF8Unsafe("whatever");
-  const std::string kInitialData = "hello";
-
-  base::FilePath temp_path;
-  base::CreateTemporaryFile(&temp_path);
-  google_apis::test_util::WriteStringToFile(temp_path, kInitialData);
-
-  // OPEN => OPEN (failure when the file did not exist.)
-  TestFileSystemForOpenFile file_system(temp_path, OPEN_FILE);
-
-  OpenFile(kDummyPath,
-           base::File::FLAG_OPEN | base::File::FLAG_READ,
-           base::Bind(&VerifyRead, kInitialData),
-           &file_system);
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(file_system.closed());
-}
-
-}  // namespace fileapi_internal
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.cc b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.cc
deleted file mode 100644
index 52bbd37..0000000
--- a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "chrome/browser/chromeos/drive/drive_file_stream_reader.h"
-#include "components/drive/drive.pb.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/http/http_byte_range.h"
-
-using content::BrowserThread;
-
-namespace drive {
-namespace internal {
-
-WebkitFileStreamReaderImpl::WebkitFileStreamReaderImpl(
-    const DriveFileStreamReader::FileSystemGetter& file_system_getter,
-    base::SequencedTaskRunner* file_task_runner,
-    const base::FilePath& drive_file_path,
-    int64_t offset,
-    const base::Time& expected_modification_time)
-    : stream_reader_(
-          new DriveFileStreamReader(file_system_getter, file_task_runner)),
-      drive_file_path_(drive_file_path),
-      offset_(offset),
-      expected_modification_time_(expected_modification_time),
-      file_size_(-1) {
-  DCHECK_GE(offset, 0);
-}
-
-WebkitFileStreamReaderImpl::~WebkitFileStreamReaderImpl() = default;
-
-int WebkitFileStreamReaderImpl::Read(net::IOBuffer* buffer,
-                                     int buffer_length,
-                                     net::CompletionOnceCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(stream_reader_);
-  DCHECK(buffer);
-  DCHECK(callback);
-
-  if (stream_reader_->IsInitialized())
-    return stream_reader_->Read(buffer, buffer_length, std::move(callback));
-
-  net::HttpByteRange byte_range;
-  byte_range.set_first_byte_position(offset_);
-  stream_reader_->Initialize(
-      drive_file_path_, byte_range,
-      base::BindOnce(
-          &WebkitFileStreamReaderImpl::OnStreamReaderInitialized,
-          weak_ptr_factory_.GetWeakPtr(),
-          base::BindOnce(
-              &WebkitFileStreamReaderImpl::ReadAfterStreamReaderInitialized,
-              weak_ptr_factory_.GetWeakPtr(), base::WrapRefCounted(buffer),
-              buffer_length, std::move(callback))));
-  return net::ERR_IO_PENDING;
-}
-
-int64_t WebkitFileStreamReaderImpl::GetLength(
-    net::Int64CompletionOnceCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(stream_reader_);
-  DCHECK(callback);
-
-  if (stream_reader_->IsInitialized()) {
-    // Returns file_size regardless of |offset_|.
-    return file_size_;
-  }
-
-  net::HttpByteRange byte_range;
-  byte_range.set_first_byte_position(offset_);
-  stream_reader_->Initialize(
-      drive_file_path_, byte_range,
-      base::BindOnce(
-          &WebkitFileStreamReaderImpl::OnStreamReaderInitialized,
-          weak_ptr_factory_.GetWeakPtr(),
-          base::BindOnce(&WebkitFileStreamReaderImpl::
-                             GetLengthAfterStreamReaderInitialized,
-                         weak_ptr_factory_.GetWeakPtr(), std::move(callback))));
-  return net::ERR_IO_PENDING;
-}
-
-void WebkitFileStreamReaderImpl::OnStreamReaderInitialized(
-    net::CompletionOnceCallback callback,
-    int error,
-    std::unique_ptr<ResourceEntry> entry) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(stream_reader_);
-  DCHECK(callback);
-
-  // TODO(hashimoto): Report ERR_UPLOAD_FILE_CHANGED when modification time
-  // doesn't match. crbug.com/346625
-  if (error != net::OK) {
-    // Found an error. Close the |stream_reader_| and notify it to the caller.
-    stream_reader_.reset();
-    std::move(callback).Run(error);
-    return;
-  }
-
-  // Remember the size of the file.
-  file_size_ = entry->file_info().size();
-  std::move(callback).Run(net::OK);
-}
-
-void WebkitFileStreamReaderImpl::ReadAfterStreamReaderInitialized(
-    scoped_refptr<net::IOBuffer> buffer,
-    int buffer_length,
-    net::CompletionOnceCallback callback,
-    int initialization_result) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(callback);
-
-  if (initialization_result != net::OK) {
-    std::move(callback).Run(initialization_result);
-    return;
-  }
-
-  DCHECK(stream_reader_);
-  read_callback_ = std::move(callback);
-  int result =
-      stream_reader_->Read(buffer.get(), buffer_length,
-                           base::BindOnce(&WebkitFileStreamReaderImpl::OnRead,
-                                          weak_ptr_factory_.GetWeakPtr()));
-  if (result != net::ERR_IO_PENDING)
-    std::move(read_callback_).Run(result);
-}
-
-void WebkitFileStreamReaderImpl::OnRead(int result) {
-  std::move(read_callback_).Run(result);
-}
-
-void WebkitFileStreamReaderImpl::GetLengthAfterStreamReaderInitialized(
-    net::Int64CompletionOnceCallback callback,
-    int initialization_result) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(callback);
-
-  if (initialization_result != net::OK) {
-    std::move(callback).Run(initialization_result);
-    return;
-  }
-
-  DCHECK_GE(file_size_, 0);
-  std::move(callback).Run(file_size_);
-}
-
-}  // namespace internal
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h
deleted file mode 100644
index 7ff5aea..0000000
--- a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h
+++ /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.
-
-#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_WEBKIT_FILE_STREAM_READER_IMPL_H_
-#define CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_WEBKIT_FILE_STREAM_READER_IMPL_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/time/time.h"
-#include "chrome/browser/chromeos/drive/drive_file_stream_reader.h"
-#include "net/base/completion_once_callback.h"
-#include "storage/browser/fileapi/file_stream_reader.h"
-
-namespace base {
-class SequencedTaskRunner;
-}  // namespace base
-
-namespace drive {
-
-class ResourceEntry;
-
-namespace internal {
-
-// The implementation of storage::FileStreamReader for drive file system.
-// storage::FileStreamReader does not provide a way for explicit
-// initialization, hence the initialization of this class will be done lazily.
-// Note that when crbug.com/225339 is resolved, this class will be also
-// initialized explicitly.
-class WebkitFileStreamReaderImpl : public storage::FileStreamReader {
- public:
-  WebkitFileStreamReaderImpl(
-      const DriveFileStreamReader::FileSystemGetter& file_system_getter,
-      base::SequencedTaskRunner* file_task_runner,
-      const base::FilePath& drive_file_path,
-      int64_t offset,
-      const base::Time& expected_modification_time);
-  ~WebkitFileStreamReaderImpl() override;
-
-  // storage::FileStreamReader override.
-  int Read(net::IOBuffer* buffer,
-           int buffer_length,
-           net::CompletionOnceCallback callback) override;
-  int64_t GetLength(net::Int64CompletionOnceCallback callback) override;
-
- private:
-  // Called upon the initialization completion of |stream_reader_|.
-  // Processes the result of the initialization with checking last
-  // modified time, and calls |callback| with net::Error code as its result.
-  void OnStreamReaderInitialized(net::CompletionOnceCallback callback,
-                                 int error,
-                                 std::unique_ptr<ResourceEntry> entry);
-
-  // Part of Read(). Called after all the initialization process is completed.
-  void ReadAfterStreamReaderInitialized(scoped_refptr<net::IOBuffer> buffer,
-                                        int buffer_length,
-                                        net::CompletionOnceCallback callback,
-                                        int initialization_result);
-
-  // Part of Read().  Passed in to DriveFileStreamReader::Read().
-  void OnRead(int result);
-
-  // Part of GetLength(). Called after all the initialization process is
-  // completed.
-  void GetLengthAfterStreamReaderInitialized(
-      net::Int64CompletionOnceCallback callback,
-      int initialization_result);
-
-  net::CompletionOnceCallback read_callback_;
-  std::unique_ptr<DriveFileStreamReader> stream_reader_;
-  const base::FilePath drive_file_path_;
-  const int64_t offset_;
-  const base::Time expected_modification_time_;
-
-  // This is available only after initialize is done.
-  int64_t file_size_;
-
-  // This should remain the last member so it'll be destroyed first and
-  // invalidate its weak pointers before other members are destroyed.
-  base::WeakPtrFactory<WebkitFileStreamReaderImpl> weak_ptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(WebkitFileStreamReaderImpl);
-};
-
-}  // namespace internal
-}  // namespace drive
-
-#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_WEBKIT_FILE_STREAM_READER_IMPL_H_
diff --git a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl_unittest.cc b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl_unittest.cc
deleted file mode 100644
index 2cf0cf8c..0000000
--- a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl_unittest.cc
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_reader_impl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "components/drive/chromeos/drive_test_util.h"
-#include "components/drive/chromeos/fake_file_system.h"
-#include "components/drive/chromeos/file_system_interface.h"
-#include "components/drive/file_system_core_util.h"
-#include "components/drive/service/fake_drive_service.h"
-#include "components/drive/service/test_util.h"
-#include "content/public/test/browser_task_environment.h"
-#include "google_apis/drive/drive_api_parser.h"
-#include "google_apis/drive/time_util.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/test_completion_callback.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace drive {
-namespace internal {
-
-class WebkitFileStreamReaderImplTest : public ::testing::Test {
- protected:
-  // Because the testee should live on IO thread, the main thread is
-  // reused as IO thread, and UI thread will be run on background.
-  WebkitFileStreamReaderImplTest()
-      : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) {}
-
-  void SetUp() override {
-    worker_thread_ =
-        std::make_unique<base::Thread>("WebkitFileStreamReaderImplTest");
-    ASSERT_TRUE(worker_thread_->Start());
-
-    // Initialize FakeDriveService.
-    fake_drive_service_ = std::make_unique<FakeDriveService>();
-    ASSERT_TRUE(test_util::SetUpTestEntries(fake_drive_service_.get()));
-
-    // Create a testee instance.
-    fake_file_system_ =
-        std::make_unique<test_util::FakeFileSystem>(fake_drive_service_.get());
-  }
-
-  FileSystemInterface* GetFileSystem() {
-    return fake_file_system_.get();
-  }
-
-  DriveFileStreamReader::FileSystemGetter GetFileSystemGetter() {
-    return base::Bind(&WebkitFileStreamReaderImplTest::GetFileSystem,
-                      base::Unretained(this));
-  }
-
-  content::BrowserTaskEnvironment task_environment_;
-
-  std::unique_ptr<base::Thread> worker_thread_;
-
-  std::unique_ptr<FakeDriveService> fake_drive_service_;
-  std::unique_ptr<test_util::FakeFileSystem> fake_file_system_;
-};
-
-TEST_F(WebkitFileStreamReaderImplTest, ReadThenGetLength) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(
-          GetFileSystemGetter(), worker_thread_->task_runner().get(),
-          kDriveFile,
-          0,               // offset
-          base::Time()));  // expected modification time
-
-  std::string content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &content));
-
-  net::TestInt64CompletionCallback callback;
-  int64_t length = reader->GetLength(callback.callback());
-  length = callback.GetResult(length);
-  EXPECT_EQ(content.size(), static_cast<size_t>(length));
-}
-
-TEST_F(WebkitFileStreamReaderImplTest, GetLengthThenRead) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(
-          GetFileSystemGetter(), worker_thread_->task_runner().get(),
-          kDriveFile,
-          0,               // offset
-          base::Time()));  // expected modification time
-
-  net::TestInt64CompletionCallback callback;
-  int64_t length = reader->GetLength(callback.callback());
-  length = callback.GetResult(length);
-
-  std::string content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &content));
-  EXPECT_EQ(content.size(), static_cast<size_t>(length));
-}
-
-TEST_F(WebkitFileStreamReaderImplTest, ReadWithOffset) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-  const int kOffset = 5;
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(
-          GetFileSystemGetter(), worker_thread_->task_runner().get(),
-          kDriveFile, kOffset,
-          base::Time()));  // expected modification time
-
-  std::string content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &content));
-
-  net::TestInt64CompletionCallback callback;
-  int64_t length = reader->GetLength(callback.callback());
-  length = callback.GetResult(length);
-  EXPECT_EQ(content.size() + kOffset, static_cast<size_t>(length));
-}
-
-TEST_F(WebkitFileStreamReaderImplTest, ReadError) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("non-existing.txt");
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(
-          GetFileSystemGetter(), worker_thread_->task_runner().get(),
-          kDriveFile,
-          0,               // offset
-          base::Time()));  // expected modification time
-
-  const int kBufferSize = 10;
-  scoped_refptr<net::IOBuffer> io_buffer =
-      base::MakeRefCounted<net::IOBuffer>(kBufferSize);
-  net::TestCompletionCallback callback;
-  int result = reader->Read(io_buffer.get(), kBufferSize, callback.callback());
-  result = callback.GetResult(result);
-  EXPECT_EQ(net::ERR_FILE_NOT_FOUND, result);
-}
-
-TEST_F(WebkitFileStreamReaderImplTest, GetLengthError) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("non-existing.txt");
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(
-          GetFileSystemGetter(), worker_thread_->task_runner().get(),
-          kDriveFile,
-          0,               // offset
-          base::Time()));  // expected modification time
-
-  net::TestInt64CompletionCallback callback;
-  int64_t result = reader->GetLength(callback.callback());
-  result = callback.GetResult(result);
-  EXPECT_EQ(net::ERR_FILE_NOT_FOUND, result);
-}
-
-TEST_F(WebkitFileStreamReaderImplTest, LastModification) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-
-  base::Time expected_modification_time;
-  ASSERT_TRUE(google_apis::util::GetTimeFromString(
-      "2011-12-14T00:40:47.330Z", &expected_modification_time));
-
-  FileError error = FILE_ERROR_FAILED;
-  std::unique_ptr<ResourceEntry> entry;
-  fake_file_system_->GetResourceEntry(
-      kDriveFile,
-      google_apis::test_util::CreateCopyResultCallback(&error, &entry));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(FILE_ERROR_OK, error);
-  ASSERT_TRUE(entry);
-
-  google_apis::DriveApiErrorCode status = google_apis::DRIVE_OTHER_ERROR;
-  std::unique_ptr<google_apis::FileResource> server_entry;
-  fake_drive_service_->UpdateResource(
-      entry->resource_id(),
-      std::string(),  // parent_resource_id
-      std::string(),  // title
-      expected_modification_time, base::Time(),
-      google_apis::drive::Properties(),
-      google_apis::test_util::CreateCopyResultCallback(&status, &server_entry));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(google_apis::HTTP_SUCCESS, status);
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(GetFileSystemGetter(),
-                                     worker_thread_->task_runner().get(),
-                                     kDriveFile,
-                                     0,  // offset
-                                     expected_modification_time));
-
-  net::TestInt64CompletionCallback callback;
-  int64_t result = reader->GetLength(callback.callback());
-  result = callback.GetResult(result);
-
-  std::string content;
-  ASSERT_EQ(net::OK, test_util::ReadAllData(reader.get(), &content));
-  EXPECT_GE(content.size(), static_cast<size_t>(result));
-}
-
-// TODO(hashimoto): Enable this test. crbug.com/346625
-TEST_F(WebkitFileStreamReaderImplTest, DISABLED_LastModificationError) {
-  const base::FilePath kDriveFile =
-      util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt");
-
-  std::unique_ptr<WebkitFileStreamReaderImpl> reader(
-      new WebkitFileStreamReaderImpl(GetFileSystemGetter(),
-                                     worker_thread_->task_runner().get(),
-                                     kDriveFile,
-                                     0,  // offset
-                                     base::Time::FromInternalValue(1)));
-
-  net::TestInt64CompletionCallback callback;
-  int64_t result = reader->GetLength(callback.callback());
-  result = callback.GetResult(result);
-  EXPECT_EQ(net::ERR_UPLOAD_FILE_CHANGED, result);
-}
-
-}  // namespace internal
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc
deleted file mode 100644
index 0e6d081..0000000
--- a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/task/post_task.h"
-#include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h"
-#include "components/drive/file_system_core_util.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "google_apis/drive/task_util.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "storage/browser/fileapi/file_stream_writer.h"
-
-using content::BrowserThread;
-
-namespace drive {
-namespace internal {
-namespace {
-
-// Creates a writable snapshot file of the |drive_path|.
-void CreateWritableSnapshotFile(
-    const WebkitFileStreamWriterImpl::FileSystemGetter& file_system_getter,
-    const base::FilePath& drive_path,
-    const fileapi_internal::CreateWritableSnapshotFileCallback& callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::PostTask(
-      FROM_HERE, {BrowserThread::UI},
-      base::BindOnce(
-          &fileapi_internal::RunFileSystemCallback, file_system_getter,
-          base::Bind(&fileapi_internal::CreateWritableSnapshotFile, drive_path,
-                     google_apis::CreateRelayCallback(callback)),
-          google_apis::CreateRelayCallback(
-              base::Bind(callback, base::File::FILE_ERROR_FAILED,
-                         base::FilePath(), base::Closure()))));
-}
-
-}  // namespace
-
-WebkitFileStreamWriterImpl::WebkitFileStreamWriterImpl(
-    const FileSystemGetter& file_system_getter,
-    base::TaskRunner* file_task_runner,
-    const base::FilePath& file_path,
-    int64_t offset)
-    : file_system_getter_(file_system_getter),
-      file_task_runner_(file_task_runner),
-      file_path_(file_path),
-      offset_(offset) {}
-
-WebkitFileStreamWriterImpl::~WebkitFileStreamWriterImpl() {
-  if (local_file_writer_) {
-    // If the file is opened, close it at destructor.
-    // It is necessary to close the local file in advance.
-    local_file_writer_.reset();
-    DCHECK(!close_callback_on_ui_thread_.is_null());
-    base::PostTask(FROM_HERE, {BrowserThread::UI},
-                   close_callback_on_ui_thread_);
-  }
-}
-
-int WebkitFileStreamWriterImpl::Write(net::IOBuffer* buf,
-                                      int buf_len,
-                                      net::CompletionOnceCallback callback) {
-  DCHECK(pending_write_callback_.is_null());
-  DCHECK(pending_cancel_callback_.is_null());
-  DCHECK(callback);
-
-  // If the local file is already available, just delegate to it.
-  if (local_file_writer_)
-    return local_file_writer_->Write(buf, buf_len, std::move(callback));
-
-  // The local file is not yet ready. Create the writable snapshot.
-  if (file_path_.empty())
-    return net::ERR_FILE_NOT_FOUND;
-
-  pending_write_callback_ = std::move(callback);
-  CreateWritableSnapshotFile(
-      file_system_getter_, file_path_,
-      base::Bind(
-          &WebkitFileStreamWriterImpl::WriteAfterCreateWritableSnapshotFile,
-          weak_ptr_factory_.GetWeakPtr(), base::RetainedRef(buf), buf_len));
-  return net::ERR_IO_PENDING;
-}
-
-int WebkitFileStreamWriterImpl::Cancel(net::CompletionOnceCallback callback) {
-  DCHECK(pending_cancel_callback_.is_null());
-  DCHECK(callback);
-
-  // If LocalFileWriter is already created, just delegate the cancel to it.
-  if (local_file_writer_)
-    return local_file_writer_->Cancel(std::move(callback));
-
-  // If file open operation is in-flight, wait for its completion and cancel
-  // further write operation in WriteAfterCreateWritableSnapshotFile.
-  if (!pending_write_callback_.is_null()) {
-    // Dismiss pending write callback immediately.
-    pending_write_callback_.Reset();
-    pending_cancel_callback_ = std::move(callback);
-    return net::ERR_IO_PENDING;
-  }
-
-  // Write() is not called yet.
-  return net::ERR_UNEXPECTED;
-}
-
-int WebkitFileStreamWriterImpl::Flush(net::CompletionOnceCallback callback) {
-  DCHECK(pending_cancel_callback_.is_null());
-  DCHECK(callback);
-
-  // If LocalFileWriter is already created, just delegate to it.
-  if (local_file_writer_)
-    return local_file_writer_->Flush(std::move(callback));
-
-  // There shouldn't be in-flight Write operation.
-  DCHECK(pending_write_callback_.is_null());
-
-  // Here is the case Flush() is called before any Write() invocation.
-  // Do nothing.
-  // Synchronization to the remote server is not done until the file is closed.
-  return net::OK;
-}
-
-void WebkitFileStreamWriterImpl::WriteAfterCreateWritableSnapshotFile(
-    net::IOBuffer* buf,
-    int buf_len,
-    base::File::Error open_result,
-    const base::FilePath& local_path,
-    const base::Closure& close_callback_on_ui_thread) {
-  DCHECK(!local_file_writer_);
-
-  if (!pending_cancel_callback_.is_null()) {
-    DCHECK(pending_write_callback_.is_null());
-    // Cancel() is called during the creation of the snapshot file.
-    // Don't write to the file.
-    if (open_result == base::File::FILE_OK) {
-      // Here the file is internally created. To revert the operation, close
-      // the file.
-      DCHECK(!close_callback_on_ui_thread.is_null());
-      base::PostTask(FROM_HERE, {BrowserThread::UI},
-                     close_callback_on_ui_thread);
-    }
-
-    std::move(pending_cancel_callback_).Run(net::OK);
-    return;
-  }
-
-  DCHECK(!pending_write_callback_.is_null());
-
-  if (open_result != base::File::FILE_OK) {
-    DCHECK(close_callback_on_ui_thread.is_null());
-    std::move(pending_write_callback_)
-        .Run(net::FileErrorToNetError(open_result));
-    return;
-  }
-
-  // Keep |close_callback| to close the file when the stream is destructed.
-  DCHECK(!close_callback_on_ui_thread.is_null());
-  close_callback_on_ui_thread_ = close_callback_on_ui_thread;
-  local_file_writer_ = storage::FileStreamWriter::CreateForLocalFile(
-      file_task_runner_.get(), local_path, offset_,
-      storage::FileStreamWriter::OPEN_EXISTING_FILE);
-  int result = local_file_writer_->Write(
-      buf, buf_len,
-      base::BindOnce(&WebkitFileStreamWriterImpl::OnWrite,
-                     weak_ptr_factory_.GetWeakPtr()));
-  if (result != net::ERR_IO_PENDING)
-    OnWrite(result);
-}
-
-void WebkitFileStreamWriterImpl::OnWrite(int result) {
-  std::move(pending_write_callback_).Run(result);
-}
-
-}  // namespace internal
-}  // namespace drive
diff --git a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.h b/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.h
deleted file mode 100644
index f73d0843..0000000
--- a/chrome/browser/chromeos/drive/fileapi/webkit_file_stream_writer_impl.h
+++ /dev/null
@@ -1,91 +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 CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_WEBKIT_FILE_STREAM_WRITER_IMPL_H_
-#define CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_WEBKIT_FILE_STREAM_WRITER_IMPL_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "storage/browser/fileapi/file_stream_writer.h"
-
-namespace base {
-class TaskRunner;
-}  // namespace base
-
-namespace net {
-class IOBuffer;
-}  // namespace net
-
-namespace drive {
-
-class FileSystemInterface;
-
-namespace internal {
-
-// The implementation of storage::FileStreamWriter for the Drive File System.
-class WebkitFileStreamWriterImpl : public storage::FileStreamWriter {
- public:
-  // Callback to return the FileSystemInterface instance. This is an
-  // injecting point for testing.
-  // Note that the callback will be copied between threads (IO and UI), and
-  // will be called on UI thread.
-  typedef base::Callback<FileSystemInterface*()> FileSystemGetter;
-
-  // Creates a writer for a file at |file_path| on FileSystem returned by
-  // |file_system_getter| that starts writing from |offset|.
-  // When invalid parameters are set, the first call to Write() method fails.
-  // Uses |file_task_runner| for local file operations.
-  WebkitFileStreamWriterImpl(const FileSystemGetter& file_system_getter,
-                             base::TaskRunner* file_task_runner,
-                             const base::FilePath& file_path,
-                             int64_t offset);
-  ~WebkitFileStreamWriterImpl() override;
-
-  // FileWriter override.
-  int Write(net::IOBuffer* buf,
-            int buf_len,
-            net::CompletionOnceCallback callback) override;
-  int Cancel(net::CompletionOnceCallback callback) override;
-  int Flush(net::CompletionOnceCallback callback) override;
-
- private:
-  // Part of Write(). Called after CreateWritableSnapshotFile is completed.
-  void WriteAfterCreateWritableSnapshotFile(
-      net::IOBuffer* buf,
-      int buf_len,
-      base::File::Error open_result,
-      const base::FilePath& local_path,
-      const base::Closure& close_callback_on_ui_thread);
-
-  // Part of Write(). Passed in to FileStreamWriter::Write().
-  void OnWrite(int result);
-
-  FileSystemGetter file_system_getter_;
-  scoped_refptr<base::TaskRunner> file_task_runner_;
-  const base::FilePath file_path_;
-  const int64_t offset_;
-
-  std::unique_ptr<storage::FileStreamWriter> local_file_writer_;
-  base::Closure close_callback_on_ui_thread_;
-  net::CompletionOnceCallback pending_write_callback_;
-  net::CompletionOnceCallback pending_cancel_callback_;
-
-  // Note: This should remain the last member so it'll be destroyed and
-  // invalidate the weak pointers before any other members are destroyed.
-  base::WeakPtrFactory<WebkitFileStreamWriterImpl> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(WebkitFileStreamWriterImpl);
-};
-
-}  // namespace internal
-}  // namespace drive
-
-#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILEAPI_WEBKIT_FILE_STREAM_WRITER_IMPL_H_
diff --git a/chrome/browser/chromeos/fileapi/file_system_backend.cc b/chrome/browser/chromeos/fileapi/file_system_backend.cc
index b197f17..81a9e859 100644
--- a/chrome/browser/chromeos/fileapi/file_system_backend.cc
+++ b/chrome/browser/chromeos/fileapi/file_system_backend.cc
@@ -62,7 +62,6 @@
 }
 
 FileSystemBackend::FileSystemBackend(
-    std::unique_ptr<FileSystemBackendDelegate> drive_delegate,
     std::unique_ptr<FileSystemBackendDelegate> file_system_provider_delegate,
     std::unique_ptr<FileSystemBackendDelegate> mtp_delegate,
     std::unique_ptr<FileSystemBackendDelegate> arc_content_delegate,
@@ -72,7 +71,6 @@
     storage::ExternalMountPoints* system_mount_points)
     : file_access_permissions_(new FileAccessPermissions()),
       local_file_util_(storage::AsyncFileUtil::CreateForLocalFileSystem()),
-      drive_delegate_(std::move(drive_delegate)),
       file_system_provider_delegate_(std::move(file_system_provider_delegate)),
       mtp_delegate_(std::move(mtp_delegate)),
       arc_content_delegate_(std::move(arc_content_delegate)),
@@ -278,8 +276,6 @@
 storage::AsyncFileUtil* FileSystemBackend::GetAsyncFileUtil(
     storage::FileSystemType type) {
   switch (type) {
-    case storage::kFileSystemTypeDrive:
-      return drive_delegate_->GetAsyncFileUtil(type);
     case storage::kFileSystemTypeProvided:
       return file_system_provider_delegate_->GetAsyncFileUtil(type);
     case storage::kFileSystemTypeNativeLocal:
@@ -406,9 +402,6 @@
     return std::unique_ptr<storage::FileStreamReader>();
 
   switch (url.type()) {
-    case storage::kFileSystemTypeDrive:
-      return drive_delegate_->CreateFileStreamReader(
-          url, offset, max_bytes_to_read, expected_modification_time, context);
     case storage::kFileSystemTypeProvided:
       return file_system_provider_delegate_->CreateFileStreamReader(
           url, offset, max_bytes_to_read, expected_modification_time, context);
@@ -447,8 +440,6 @@
     return std::unique_ptr<storage::FileStreamWriter>();
 
   switch (url.type()) {
-    case storage::kFileSystemTypeDrive:
-      return drive_delegate_->CreateFileStreamWriter(url, offset, context);
     case storage::kFileSystemTypeProvided:
       return file_system_provider_delegate_->CreateFileStreamWriter(
           url, offset, context);
@@ -489,9 +480,6 @@
     return callback.Run(GURL());
 
   switch (url.type()) {
-    case storage::kFileSystemTypeDrive:
-      drive_delegate_->GetRedirectURLForContents(url, callback);
-      return;
     case storage::kFileSystemTypeProvided:
       file_system_provider_delegate_->GetRedirectURLForContents(url,
                                                                   callback);
diff --git a/chrome/browser/chromeos/fileapi/file_system_backend.h b/chrome/browser/chromeos/fileapi/file_system_backend.h
index 13092f8f..10517a4 100644
--- a/chrome/browser/chromeos/fileapi/file_system_backend.h
+++ b/chrome/browser/chromeos/fileapi/file_system_backend.h
@@ -73,7 +73,6 @@
 
   // |system_mount_points| should outlive FileSystemBackend instance.
   FileSystemBackend(
-      std::unique_ptr<FileSystemBackendDelegate> drive_delegate,
       std::unique_ptr<FileSystemBackendDelegate> file_system_provider_delegate,
       std::unique_ptr<FileSystemBackendDelegate> mtp_delegate,
       std::unique_ptr<FileSystemBackendDelegate> arc_content_delegate,
@@ -150,9 +149,6 @@
   std::unique_ptr<FileAccessPermissions> file_access_permissions_;
   std::unique_ptr<storage::AsyncFileUtil> local_file_util_;
 
-  // The delegate instance for the drive file system related operations.
-  std::unique_ptr<FileSystemBackendDelegate> drive_delegate_;
-
   // The delegate instance for the provided file system related operations.
   std::unique_ptr<FileSystemBackendDelegate> file_system_provider_delegate_;
 
diff --git a/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc b/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc
index 2060402..1fcbfed5 100644
--- a/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc
+++ b/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc
@@ -41,7 +41,6 @@
   scoped_refptr<storage::ExternalMountPoints> mount_points(
       storage::ExternalMountPoints::CreateRefCounted());
   chromeos::FileSystemBackend backend(
-      nullptr,  // drive_delegate
       nullptr,  // file_system_provider_delegate
       nullptr,  // mtp_delegate
       nullptr,  // arc_content_delegate
@@ -70,7 +69,6 @@
       storage::ExternalMountPoints::CreateRefCounted());
 
   chromeos::FileSystemBackend backend(
-      nullptr,  // drive_delegate
       nullptr,  // file_system_provider_delegate
       nullptr,  // mtp_delegate
       nullptr,  // arc_content_delegate
@@ -117,7 +115,6 @@
   scoped_refptr<storage::ExternalMountPoints> system_mount_points(
       storage::ExternalMountPoints::CreateRefCounted());
   chromeos::FileSystemBackend backend(
-      nullptr,  // drive_delegate
       nullptr,  // file_system_provider_delegate
       nullptr,  // mtp_delegate
       nullptr,  // arc_content_delegate
@@ -188,7 +185,6 @@
   scoped_refptr<storage::ExternalMountPoints> system_mount_points(
       storage::ExternalMountPoints::CreateRefCounted());
   chromeos::FileSystemBackend backend(
-      nullptr,  // drive_delegate
       nullptr,  // file_system_provider_delegate
       nullptr,  // mtp_delegate
       nullptr,  // arc_content_delegate
diff --git a/chrome/browser/chromeos/fileapi/recent_drive_source.cc b/chrome/browser/chromeos/fileapi/recent_drive_source.cc
index b07323db..e85cfdb 100644
--- a/chrome/browser/chromeos/fileapi/recent_drive_source.cc
+++ b/chrome/browser/chromeos/fileapi/recent_drive_source.cc
@@ -27,32 +27,6 @@
 
 namespace chromeos {
 
-namespace {
-
-void OnGetMetadataOnIOThread(
-    storage::FileSystemOperation::GetMetadataCallback callback,
-    base::File::Error result,
-    const base::File::Info& info) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  base::PostTask(FROM_HERE, {BrowserThread::UI},
-                 base::BindOnce(std::move(callback), result, info));
-}
-
-void GetMetadataOnIOThread(
-    scoped_refptr<storage::FileSystemContext> file_system_context,
-    const storage::FileSystemURL& url,
-    int fields,
-    storage::FileSystemOperation::GetMetadataCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  file_system_context->operation_runner()->GetMetadata(
-      url, fields,
-      base::BindOnce(&OnGetMetadataOnIOThread, std::move(callback)));
-}
-
-}  // namespace
-
 const char RecentDriveSource::kLoadHistogramName[] =
     "FileBrowser.Recent.LoadDrive";
 
@@ -68,7 +42,6 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!params_.has_value());
   DCHECK(files_.empty());
-  DCHECK_EQ(0, num_inflight_stats_);
   DCHECK(build_start_time_.is_null());
 
   params_.emplace(std::move(params));
@@ -79,18 +52,10 @@
       drive::util::GetIntegrationServiceByProfile(profile_);
   if (!integration_service) {
     // |integration_service| is nullptr if Drive is disabled.
-    OnSearchMetadata(drive::FILE_ERROR_FAILED, nullptr);
+    OnComplete();
     return;
   }
 
-  if (integration_service->file_system()) {
-    integration_service->file_system()->SearchMetadata(
-        "" /* query */, drive::SEARCH_METADATA_EXCLUDE_DIRECTORIES,
-        params_.value().max_files(), drive::MetadataSearchOrder::LAST_MODIFIED,
-        base::BindOnce(&RecentDriveSource::OnSearchMetadata,
-                       weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
   auto query_params = drivefs::mojom::QueryParameters::New();
   query_params->page_size = params_->max_files();
   query_params->query_source =
@@ -105,67 +70,9 @@
       &RecentDriveSource::GotSearchResults, weak_ptr_factory_.GetWeakPtr()));
 }
 
-void RecentDriveSource::OnSearchMetadata(
-    drive::FileError error,
-    std::unique_ptr<drive::MetadataSearchResultVector> results) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(params_.has_value());
-  DCHECK(files_.empty());
-  DCHECK_EQ(0, num_inflight_stats_);
-  DCHECK(!build_start_time_.is_null());
-
-  if (error != drive::FILE_ERROR_OK) {
-    OnComplete();
-    return;
-  }
-
-  DCHECK(results.get());
-
-  std::string extension_id = params_.value().origin().host();
-
-  for (const auto& result : *results) {
-    if (result.is_directory)
-      continue;
-
-    base::FilePath virtual_path =
-        file_manager::util::ConvertDrivePathToRelativeFileSystemPath(
-            profile_, extension_id, result.path);
-    storage::FileSystemURL url =
-        params_.value().file_system_context()->CreateCrackedFileSystemURL(
-            params_.value().origin(), storage::kFileSystemTypeExternal,
-            virtual_path);
-    ++num_inflight_stats_;
-    base::PostTask(
-        FROM_HERE, {BrowserThread::IO},
-        base::BindOnce(
-            &GetMetadataOnIOThread,
-            base::WrapRefCounted(params_.value().file_system_context()), url,
-            storage::FileSystemOperation::GET_METADATA_FIELD_LAST_MODIFIED,
-            base::BindOnce(&RecentDriveSource::OnGetMetadata,
-                           weak_ptr_factory_.GetWeakPtr(), url)));
-  }
-
-  if (num_inflight_stats_ == 0)
-    OnComplete();
-}
-
-void RecentDriveSource::OnGetMetadata(const storage::FileSystemURL& url,
-                                      base::File::Error result,
-                                      const base::File::Info& info) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  if (result == base::File::FILE_OK)
-    files_.emplace_back(url, info.last_modified);
-
-  --num_inflight_stats_;
-  if (num_inflight_stats_ == 0)
-    OnComplete();
-}
-
 void RecentDriveSource::OnComplete() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(params_.has_value());
-  DCHECK_EQ(0, num_inflight_stats_);
   DCHECK(!build_start_time_.is_null());
 
   UMA_HISTOGRAM_TIMES(kLoadHistogramName,
@@ -179,7 +86,6 @@
 
   DCHECK(!params_.has_value());
   DCHECK(files_.empty());
-  DCHECK_EQ(0, num_inflight_stats_);
   DCHECK(build_start_time_.is_null());
 
   std::move(params.callback()).Run(std::move(files));
diff --git a/chrome/browser/chromeos/fileapi/recent_drive_source.h b/chrome/browser/chromeos/fileapi/recent_drive_source.h
index e95119c..011b2a48 100644
--- a/chrome/browser/chromeos/fileapi/recent_drive_source.h
+++ b/chrome/browser/chromeos/fileapi/recent_drive_source.h
@@ -16,17 +16,10 @@
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/fileapi/recent_source.h"
 #include "chromeos/components/drivefs/mojom/drivefs.mojom.h"
-#include "components/drive/chromeos/file_system_interface.h"
 #include "components/drive/file_errors.h"
 
 class Profile;
 
-namespace storage {
-
-class FileSystemURL;
-
-}  // namespace storage
-
 namespace chromeos {
 
 class RecentFile;
@@ -47,12 +40,6 @@
  private:
   static const char kLoadHistogramName[];
 
-  void OnSearchMetadata(
-      drive::FileError error,
-      std::unique_ptr<drive::MetadataSearchResultVector> results);
-  void OnGetMetadata(const storage::FileSystemURL& url,
-                     base::File::Error result,
-                     const base::File::Info& info);
   void OnComplete();
 
   void GotSearchResults(
@@ -66,7 +53,6 @@
 
   base::TimeTicks build_start_time_;
 
-  int num_inflight_stats_ = 0;
   std::vector<RecentFile> files_;
 
   drivefs::mojom::SearchQueryPtr search_query_;
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen.cc b/chrome/browser/chromeos/login/screens/hid_detection_screen.cc
index 4f7704d..e0fac86 100644
--- a/chrome/browser/chromeos/login/screens/hid_detection_screen.cc
+++ b/chrome/browser/chromeos/login/screens/hid_detection_screen.cc
@@ -59,8 +59,7 @@
     const base::RepeatingClosure& exit_callback)
     : BaseScreen(HIDDetectionView::kScreenId),
       view_(view),
-      exit_callback_(exit_callback),
-      binding_(this) {
+      exit_callback_(exit_callback) {
   if (view_)
     view_->Bind(this);
 
@@ -524,12 +523,9 @@
 }
 
 void HIDDetectionScreen::GetInputDevicesList() {
-  device::mojom::InputDeviceManagerClientAssociatedPtrInfo client;
-  binding_.Bind(mojo::MakeRequest(&client));
-
   DCHECK(input_device_manager_);
   input_device_manager_->GetDevicesAndSetClient(
-      std::move(client),
+      receiver_.BindNewEndpointAndPassRemote(),
       base::BindOnce(&HIDDetectionScreen::OnGetInputDevicesList,
                      weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen.h b/chrome/browser/chromeos/login/screens/hid_detection_screen.h
index 032465e..9911aa0 100644
--- a/chrome/browser/chromeos/login/screens/hid_detection_screen.h
+++ b/chrome/browser/chromeos/login/screens/hid_detection_screen.h
@@ -20,7 +20,7 @@
 #include "device/bluetooth/bluetooth_adapter.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_discovery_session.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/input_service.mojom.h"
 
@@ -201,7 +201,8 @@
 
   mojo::Remote<device::mojom::InputDeviceManager> input_device_manager_;
 
-  mojo::AssociatedBinding<device::mojom::InputDeviceManagerClient> binding_;
+  mojo::AssociatedReceiver<device::mojom::InputDeviceManagerClient> receiver_{
+      this};
 
   // Save the connected input devices.
   DeviceMap devices_;
diff --git a/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc b/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
index 92e595e..072670a 100644
--- a/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
+++ b/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
@@ -17,6 +17,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/post_task.h"
+#include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/login/existing_user_controller.h"
@@ -1029,7 +1030,13 @@
   DVLOG(1) << "Loaded page at the end : " << title;
 }
 
-IN_PROC_BROWSER_TEST_P(MergeSessionTest, XHRThrottle) {
+// TODO(crbug.com/1005084) Disabled on Chrome OS due to timeouts
+#if defined(OS_CHROMEOS)
+#define MAYBE_XHRThrottle DISABLED_XHRThrottle
+#else
+#define MAYBE_XHRThrottle XHRThrottle
+#endif
+IN_PROC_BROWSER_TEST_P(MergeSessionTest, MAYBE_XHRThrottle) {
   StartNewUserSession(/*wait_for_merge=*/false,
                       /*is_under_advanced_protection=*/false);
 
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc
index 2d7ab72d..27343f1 100644
--- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc
+++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_browsertest.cc
@@ -25,7 +25,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_test_utils.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
@@ -85,18 +84,6 @@
   return response;
 }
 
-std::unique_ptr<net::test_server::HttpResponse> CreateDRPResponseWithHeader(
-    const net::test_server::HttpRequest& request) {
-  auto response = std::make_unique<net::test_server::BasicHttpResponse>();
-  const auto chrome_proxy_header = request.headers.find("chrome-proxy");
-  if (chrome_proxy_header != request.headers.end())
-    response->set_content(chrome_proxy_header->second);
-  response->set_content_type("text/html");
-  response->AddCustomHeader("chrome-proxy", "ofcl=10");
-  response->AddCustomHeader("via", "1.1 Chrome-Compression-Proxy");
-  return response;
-}
-
 std::unique_ptr<net::test_server::HttpResponse> IncrementRequestCount(
     const std::string& relative_url,
     int* request_count,
@@ -202,9 +189,7 @@
                                     config_server_.base_url().spec());
   }
 
-  void SetUp() override {
-    InProcessBrowserTest::SetUp();
-  }
+  void SetUp() override { InProcessBrowserTest::SetUp(); }
 
   void SetUpOnMainThread() override {
     // Make sure the favicon doesn't mess with the tests.
@@ -951,73 +936,6 @@
   net::EmbeddedTestServer secondary_server_;
 };
 
-class TestDataReductionProxyPingbackClient
-    : public DataReductionProxyPingbackClient {
- public:
-  bool received_valid_pingback() const { return received_valid_pingback_; }
-  uint64_t received_page_id() const { return received_page_id_; }
-
- private:
-  void SendPingback(const DataReductionProxyData& data,
-                    const DataReductionProxyPageLoadTiming& timing) override {
-    EXPECT_TRUE(data.used_data_reduction_proxy());
-    EXPECT_EQ(kSessionKey, data.session_key());
-    EXPECT_GT(*data.page_id(), 0U);
-    received_valid_pingback_ = true;
-    received_page_id_ = *data.page_id();
-  }
-
-  void SetPingbackReportingFraction(
-      float pingback_reporting_fraction) override {}
-
-  bool received_valid_pingback_ = false;
-  uint64_t received_page_id_ = 0;
-};
-
-IN_PROC_BROWSER_TEST_F(DataReductionProxyBrowsertest, PingbackSent) {
-  net::EmbeddedTestServer primary_server;
-  primary_server.RegisterRequestHandler(
-      base::BindRepeating(&CreateDRPResponseWithHeader));
-  ASSERT_TRUE(primary_server.Start());
-  SetConfig(CreateConfigForServer(primary_server));
-  // A network change forces the config to be fetched.
-  SimulateNetworkChange(network::mojom::ConnectionType::CONNECTION_3G);
-  WaitForConfig();
-
-  // Pingback client is owned by the DRP service.
-  TestDataReductionProxyPingbackClient* pingback_client =
-      new TestDataReductionProxyPingbackClient();
-  DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
-      browser()->profile())
-      ->data_reduction_proxy_service()
-      ->SetPingbackClientForTesting(pingback_client);
-
-  // Proxy will be used, so it shouldn't matter if the host cannot be resolved.
-  ui_test_utils::NavigateToURL(
-      browser(), GURL("http://does.not.resolve.com/echo_chromeproxy_header"));
-  std::string body = GetBody();
-
-  // Navigate away for the metrics to be recorded.
-  ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
-
-  EXPECT_TRUE(pingback_client->received_valid_pingback());
-  EXPECT_THAT(body, HasSubstr(base::StringPrintf("s=%s,", kSessionKey)));
-  EXPECT_THAT(body, HasSubstr("pid="));
-
-  // Parse the page ID from chrom-proxy request header and compare with page ID
-  // sent in pingback.
-  uint64_t request_page_id = 0;
-  base::StringPairs kv_pairs;
-  EXPECT_TRUE(base::SplitStringIntoKeyValuePairs(body, '=', ',', &kv_pairs));
-  for (const auto& kv_pair : kv_pairs) {
-    if (kv_pair.first == "pid")
-      EXPECT_TRUE(base::HexStringToUInt64(kv_pair.second, &request_page_id));
-  }
-
-  EXPECT_NE(0u, request_page_id);
-  EXPECT_EQ(pingback_client->received_page_id(), request_page_id);
-}
-
 IN_PROC_BROWSER_TEST_F(DataReductionProxyFallbackBrowsertest,
                        FallbackProxyUsedOnNetError) {
   SetResponseHook(
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
index 9a212d1..9a2f84a 100644
--- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
+++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/pref_names.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
@@ -188,8 +187,7 @@
 }
 
 DataReductionProxyChromeSettings::DataReductionProxyChromeSettings()
-    : data_reduction_proxy::DataReductionProxySettings(),
-      profile_(nullptr) {}
+    : data_reduction_proxy::DataReductionProxySettings(), profile_(nullptr) {}
 
 DataReductionProxyChromeSettings::~DataReductionProxyChromeSettings() {}
 
@@ -228,10 +226,6 @@
   std::unique_ptr<data_reduction_proxy::DataReductionProxyService> service =
       std::make_unique<data_reduction_proxy::DataReductionProxyService>(
           this, profile_prefs, url_loader_factory, std::move(store),
-          std::make_unique<
-              data_reduction_proxy::DataReductionProxyPingbackClientImpl>(
-              url_loader_factory,
-              version_info::GetChannelString(chrome::GetChannel())),
           g_browser_process->network_quality_tracker(),
           content::GetNetworkConnectionTracker(),
           data_use_measurement::ChromeDataUseMeasurement::GetInstance(),
diff --git a/chrome/browser/extensions/api/cookies/cookies_helpers.cc b/chrome/browser/extensions/api/cookies/cookies_helpers.cc
index f4dfc24..386592c 100644
--- a/chrome/browser/extensions/api/cookies/cookies_helpers.cc
+++ b/chrome/browser/extensions/api/cookies/cookies_helpers.cc
@@ -103,7 +103,6 @@
   cookie.secure = canonical_cookie.IsSecure();
   cookie.http_only = canonical_cookie.IsHttpOnly();
 
-  DCHECK(net::IsValidSameSiteValue(canonical_cookie.SameSite()));
   switch (canonical_cookie.SameSite()) {
     case net::CookieSameSite::NO_RESTRICTION:
       cookie.same_site = api::cookies::SAME_SITE_STATUS_NO_RESTRICTION;
@@ -118,8 +117,6 @@
     case net::CookieSameSite::UNSPECIFIED:
       cookie.same_site = api::cookies::SAME_SITE_STATUS_UNSPECIFIED;
       break;
-    default:
-      NOTREACHED();
   }
 
   cookie.session = !canonical_cookie.IsPersistent();
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 7d6d747..7ebbb05 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -3150,6 +3150,116 @@
   }
 }
 
+// Test that the badge text for extensions will update correctly for
+// removeHeader rules.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest,
+                       RemoveHeadersBadgeText) {
+  auto referer_url = embedded_test_server()->GetURL(
+      "example.com", "/set-header?referer: none");
+  auto set_cookie_url =
+      embedded_test_server()->GetURL("example.com", "/set-cookie?a=b");
+
+  // Navigates frame with name |frame_name| to |url|.
+  auto navigate_frame = [this](const std::string& frame_name, const GURL& url,
+                               bool use_frame_referrer) {
+    content::TestNavigationObserver navigation_observer(
+        web_contents(), 1 /*number_of_navigations*/);
+
+    const char* referrer_policy = use_frame_referrer ? "origin" : "no-referrer";
+
+    ASSERT_TRUE(content::ExecuteScript(
+        GetMainFrame(),
+        base::StringPrintf(R"(
+          document.getElementsByName('%s')[0].referrerPolicy = '%s';
+          document.getElementsByName('%s')[0].src = '%s';)",
+                           frame_name.c_str(), referrer_policy,
+                           frame_name.c_str(), url.spec().c_str())));
+    navigation_observer.Wait();
+  };
+
+  const std::string kFrameName1 = "frame1";
+  const GURL page_url = embedded_test_server()->GetURL(
+      "nomatch.com", "/page_with_two_frames.html");
+
+  // Create an extension with a rule to remove the Set-Cookie header, and get
+  // the ExtensionAction for it.
+  TestRule rule1 = CreateGenericRule();
+  rule1.id = kMinValidID;
+  rule1.condition->url_filter = "example.com";
+  rule1.condition->resource_types = std::vector<std::string>({"sub_frame"});
+  rule1.action->type = "removeHeaders";
+  rule1.action->remove_headers_list = std::vector<std::string>({"setCookie"});
+
+  ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule1}, "extension_1", {}));
+
+  const ExtensionId remove_set_cookie_ext_id = last_loaded_extension_id();
+  ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText(
+      remove_set_cookie_ext_id, true);
+
+  ExtensionAction* remove_set_cookie_action =
+      ExtensionActionManager::Get(web_contents()->GetBrowserContext())
+          ->GetExtensionAction(*extension_registry()->GetExtensionById(
+              remove_set_cookie_ext_id,
+              extensions::ExtensionRegistry::ENABLED));
+
+  // Create an extension with a rule to remove the referer header, and get the
+  // ExtensionAction for it.
+  TestRule rule2 = CreateGenericRule();
+  rule2.id = kMinValidID;
+  rule2.condition->url_filter = "example.com";
+  rule2.condition->resource_types = std::vector<std::string>({"sub_frame"});
+  rule2.action->type = "removeHeaders";
+  rule2.action->remove_headers_list = std::vector<std::string>({"referer"});
+
+  ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule2}, "extension_2", {}));
+
+  const ExtensionId remove_referer_ext_id = last_loaded_extension_id();
+  ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText(
+      remove_referer_ext_id, true);
+
+  ExtensionAction* remove_referer_action =
+      ExtensionActionManager::Get(web_contents()->GetBrowserContext())
+          ->GetExtensionAction(*extension_registry()->GetExtensionById(
+              remove_referer_ext_id, extensions::ExtensionRegistry::ENABLED));
+
+  struct {
+    GURL url;
+    bool use_referrer;
+    std::string expected_remove_referer_badge_text;
+    std::string expected_remove_set_cookie_badge_text;
+  } test_cases[] = {
+      // This request only has a Set-Cookie header. Only the badge text for the
+      // extension with a remove Set-Cookie header rule should be incremented.
+      {set_cookie_url, false, "0", "1"},
+      // This request only has a Referer header. Only the badge text for the
+      // extension with a remove Referer header rule should be incremented.
+      {referer_url, true, "1", "1"},
+      // This request has both a Referer and a Set-Cookie header. The badge text
+      // for both extensions should be incremented.
+      {set_cookie_url, true, "2", "2"},
+  };
+
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  ASSERT_TRUE(WasFrameWithScriptLoaded(GetMainFrame()));
+
+  int first_tab_id = ExtensionTabUtil::GetTabId(web_contents());
+  EXPECT_EQ("0", remove_set_cookie_action->GetDisplayBadgeText(first_tab_id));
+  EXPECT_EQ("0", remove_referer_action->GetDisplayBadgeText(first_tab_id));
+
+  for (const auto& test_case : test_cases) {
+    SCOPED_TRACE(base::StringPrintf("Testing URL: %s, using referrer: %s",
+                                    test_case.url.spec().c_str(),
+                                    test_case.use_referrer ? "true" : "false"));
+
+    navigate_frame(kFrameName1, test_case.url, test_case.use_referrer);
+    EXPECT_EQ(test_case.expected_remove_set_cookie_badge_text,
+              remove_set_cookie_action->GetDisplayBadgeText(first_tab_id));
+
+    EXPECT_EQ(test_case.expected_remove_referer_badge_text,
+              remove_referer_action->GetDisplayBadgeText(first_tab_id));
+  }
+}
+
 // Test fixture to verify that host permissions for the request url and the
 // request initiator are properly checked when redirecting requests. Loads an
 // example.com url with four sub-frames named frame_[1..4] from hosts
diff --git a/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc b/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
index 808d1b5..b8f7407 100644
--- a/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc
@@ -133,6 +133,24 @@
     return info;
   }
 
+  // Returns renderer-initiated request params for the given |url| and
+  // |request_headers| request headers.
+  WebRequestInfoInitParams GetRequestParamsForURLWithHeaders(
+      base::StringPiece url,
+      const std::vector<std::string>& request_headers) {
+    const int kRendererId = 1;
+    WebRequestInfoInitParams info;
+    info.url = GURL(url);
+    info.render_process_id = kRendererId;
+
+    net::HttpRequestHeaders extra_request_headers;
+    for (const auto& header : request_headers)
+      extra_request_headers.SetHeaderIfMissing(header, "foo");
+
+    info.extra_request_headers = extra_request_headers;
+    return info;
+  }
+
   RulesetManager* manager() { return manager_.get(); }
 
  private:
@@ -157,7 +175,7 @@
 
   auto should_block_request = [this](const WebRequestInfo& request) {
     return manager()->EvaluateRequest(request,
-                                      false /*is_incognito_context*/) ==
+                                      false /*is_incognito_context*/)[0] ==
            Action(ActionType::BLOCK);
   };
 
@@ -228,28 +246,32 @@
   // incognito contexts should not be evaluated.
   EXPECT_FALSE(util::IsIncognitoEnabled(last_loaded_extension()->id(),
                                         browser_context()));
-  EXPECT_EQ(
-      Action(ActionType::NONE),
-      manager()->EvaluateRequest(request_info, true /*is_incognito_context*/));
-  request_info.dnr_action.reset();
-  EXPECT_EQ(
-      Action(ActionType::BLOCK),
-      manager()->EvaluateRequest(request_info, false /*is_incognito_context*/));
-  request_info.dnr_action.reset();
+
+  manager()->EvaluateRequest(request_info, true /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_info.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::NONE), request_info.dnr_actions[0]);
+  request_info.dnr_actions.clear();
+
+  manager()->EvaluateRequest(request_info, false /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_info.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::BLOCK), request_info.dnr_actions[0]);
+  request_info.dnr_actions.clear();
 
   // Enabling the extension in incognito mode, should cause requests from
   // incognito contexts to also be evaluated.
   SetIncognitoEnabled(last_loaded_extension(), true /*incognito_enabled*/);
   EXPECT_TRUE(util::IsIncognitoEnabled(last_loaded_extension()->id(),
                                        browser_context()));
-  EXPECT_EQ(
-      Action(ActionType::BLOCK),
-      manager()->EvaluateRequest(request_info, true /*is_incognito_context*/));
-  request_info.dnr_action.reset();
-  EXPECT_EQ(
-      Action(ActionType::BLOCK),
-      manager()->EvaluateRequest(request_info, false /*is_incognito_context*/));
-  request_info.dnr_action.reset();
+
+  manager()->EvaluateRequest(request_info, true /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_info.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::BLOCK), request_info.dnr_actions[0]);
+  request_info.dnr_actions.clear();
+
+  manager()->EvaluateRequest(request_info, false /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_info.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::BLOCK), request_info.dnr_actions[0]);
+  request_info.dnr_actions.clear();
 }
 
 // Tests that
@@ -265,15 +287,18 @@
       "Extensions.DeclarativeNetRequest.EvaluateRequestTime.AllExtensions2";
   {
     base::HistogramTester tester;
-    EXPECT_EQ(
-        Action(ActionType::NONE),
-        manager()->EvaluateRequest(example_com_request, is_incognito_context));
-    EXPECT_EQ(
-        Action(ActionType::NONE),
-        manager()->EvaluateRequest(google_com_request, is_incognito_context));
+
+    manager()->EvaluateRequest(example_com_request, is_incognito_context);
+    ASSERT_EQ(1u, example_com_request.dnr_actions.size());
+    EXPECT_EQ(Action(ActionType::NONE), example_com_request.dnr_actions[0]);
+
+    manager()->EvaluateRequest(google_com_request, is_incognito_context);
+    ASSERT_EQ(1u, google_com_request.dnr_actions.size());
+    EXPECT_EQ(Action(ActionType::NONE), google_com_request.dnr_actions[0]);
+
     tester.ExpectTotalCount(kHistogramName, 0);
-    example_com_request.dnr_action.reset();
-    google_com_request.dnr_action.reset();
+    example_com_request.dnr_actions.clear();
+    google_com_request.dnr_actions.clear();
   }
 
   // Add an extension ruleset which blocks requests to "example.com".
@@ -287,16 +312,20 @@
 
   {
     base::HistogramTester tester;
-    EXPECT_EQ(
-        Action(ActionType::BLOCK),
-        manager()->EvaluateRequest(example_com_request, is_incognito_context));
+
+    manager()->EvaluateRequest(example_com_request, is_incognito_context);
+    ASSERT_EQ(1u, example_com_request.dnr_actions.size());
+    EXPECT_EQ(Action(ActionType::BLOCK), example_com_request.dnr_actions[0]);
+
     tester.ExpectTotalCount(kHistogramName, 1);
-    EXPECT_EQ(
-        Action(ActionType::NONE),
-        manager()->EvaluateRequest(google_com_request, is_incognito_context));
+
+    manager()->EvaluateRequest(google_com_request, is_incognito_context);
+    ASSERT_EQ(1u, google_com_request.dnr_actions.size());
+    EXPECT_EQ(Action(ActionType::NONE), google_com_request.dnr_actions[0]);
+
     tester.ExpectTotalCount(kHistogramName, 2);
-    example_com_request.dnr_action.reset();
-    google_com_request.dnr_action.reset();
+    example_com_request.dnr_actions.clear();
+    google_com_request.dnr_actions.clear();
   }
 }
 
@@ -323,28 +352,32 @@
   Action expected_redirect_action(ActionType::REDIRECT);
   expected_redirect_action.redirect_url = GURL("http://google.com");
   WebRequestInfo request_1(GetRequestParamsForURL(kExampleURL, base::nullopt));
-  EXPECT_EQ(expected_redirect_action,
-            manager()->EvaluateRequest(request_1, is_incognito_context));
+  manager()->EvaluateRequest(request_1, is_incognito_context);
+  ASSERT_EQ(1u, request_1.dnr_actions.size());
+  EXPECT_EQ(expected_redirect_action, request_1.dnr_actions[0]);
 
   // Change the initiator to "xyz.com". It should not be redirected since we
   // don't have host permissions to the request initiator.
   WebRequestInfo request_2(GetRequestParamsForURL(
       kExampleURL, url::Origin::Create(GURL("http://xyz.com"))));
-  EXPECT_EQ(Action(ActionType::NONE),
-            manager()->EvaluateRequest(request_2, is_incognito_context));
+  manager()->EvaluateRequest(request_2, is_incognito_context);
+  ASSERT_EQ(1u, request_2.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::NONE), request_2.dnr_actions[0]);
 
   // Change the initiator to "abc.com". It should be redirected since we have
   // the required host permissions.
   WebRequestInfo request_3(GetRequestParamsForURL(
       kExampleURL, url::Origin::Create(GURL("http://abc.com"))));
-  EXPECT_EQ(expected_redirect_action,
-            manager()->EvaluateRequest(request_3, is_incognito_context));
+  manager()->EvaluateRequest(request_3, is_incognito_context);
+  ASSERT_EQ(1u, request_3.dnr_actions.size());
+  EXPECT_EQ(expected_redirect_action, request_3.dnr_actions[0]);
 
   // Ensure web-socket requests are not redirected.
   WebRequestInfo request_4(
       GetRequestParamsForURL("ws://example.com", base::nullopt));
-  EXPECT_EQ(Action(ActionType::NONE),
-            manager()->EvaluateRequest(request_4, is_incognito_context));
+  manager()->EvaluateRequest(request_4, is_incognito_context);
+  ASSERT_EQ(1u, request_4.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::NONE), request_4.dnr_actions[0]);
 }
 
 // Tests that an extension can't block or redirect resources on the chrome-
@@ -390,9 +423,9 @@
   // Ensure that "http://example.com" will be blocked (with blocking taking
   // priority over redirection).
   WebRequestInfo request_1(GetRequestParamsForURL("http://example.com"));
-  EXPECT_EQ(
-      Action(ActionType::BLOCK),
-      manager()->EvaluateRequest(request_1, false /*is_incognito_context*/));
+  manager()->EvaluateRequest(request_1, false /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_1.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::BLOCK), request_1.dnr_actions[0]);
 
   // Ensure that the background page for |extension_1| won't be blocked or
   // redirected.
@@ -400,9 +433,9 @@
   EXPECT_TRUE(!background_page_url_1.is_empty());
   WebRequestInfo request_2(
       GetRequestParamsForURL(background_page_url_1.spec()));
-  EXPECT_EQ(
-      Action(ActionType::NONE),
-      manager()->EvaluateRequest(request_2, false /*is_incognito_context*/));
+  manager()->EvaluateRequest(request_2, false /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_2.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::NONE), request_2.dnr_actions[0]);
 
   // Ensure that the background page for |extension_2| won't be blocked or
   // redirected.
@@ -410,17 +443,91 @@
   EXPECT_TRUE(!background_page_url_2.is_empty());
   WebRequestInfo request_3(
       GetRequestParamsForURL(background_page_url_2.spec()));
-  EXPECT_EQ(
-      Action(ActionType::NONE),
-      manager()->EvaluateRequest(request_3, false /*is_incognito_context*/));
+  manager()->EvaluateRequest(request_3, false /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_3.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::NONE), request_3.dnr_actions[0]);
 
   // Also ensure that an arbitrary url on the chrome extension scheme is also
   // not blocked or redirected.
   WebRequestInfo request_4(GetRequestParamsForURL(base::StringPrintf(
       "%s://%s/%s", kExtensionScheme, "extension_id", "path")));
-  EXPECT_EQ(
-      Action(ActionType::NONE),
-      manager()->EvaluateRequest(request_4, false /*is_incognito_context*/));
+  manager()->EvaluateRequest(request_4, false /*is_incognito_context*/);
+  ASSERT_EQ(1u, request_4.dnr_actions.size());
+  EXPECT_EQ(Action(ActionType::NONE), request_4.dnr_actions[0]);
+}
+
+// Test that headers to be removed in removeHeaders rules are attributed to the
+// correct extension.
+TEST_P(RulesetManagerTest, RemoveHeaders) {
+  const Extension* extension_1 = nullptr;
+  const Extension* extension_2 = nullptr;
+  // Add an extension with a background page which removes the "cookie" and
+  // "setCookie" headers.
+  {
+    std::unique_ptr<CompositeMatcher> matcher;
+    TestRule rule = CreateGenericRule();
+    rule.condition->url_filter = std::string("*");
+    rule.action->type = std::string("removeHeaders");
+    rule.action->remove_headers_list =
+        std::vector<std::string>({"cookie", "setCookie"});
+
+    ASSERT_NO_FATAL_FAILURE(
+        CreateMatcherForRules({rule}, "test extension", &matcher));
+    extension_1 = last_loaded_extension();
+    manager()->AddRuleset(extension_1->id(), std::move(matcher),
+                          URLPatternSet());
+  }
+
+  // Add another extension with a background page which removes the "cookie" and
+  // "referer" headers.
+  {
+    std::unique_ptr<CompositeMatcher> matcher;
+    TestRule rule = CreateGenericRule();
+    rule.condition->url_filter = std::string("*");
+    rule.action->type = std::string("removeHeaders");
+    rule.action->remove_headers_list =
+        std::vector<std::string>({"cookie", "referer"});
+
+    ASSERT_NO_FATAL_FAILURE(
+        CreateMatcherForRules({rule}, "test extension 2", &matcher));
+    extension_2 = last_loaded_extension();
+    manager()->AddRuleset(extension_2->id(), std::move(matcher),
+                          URLPatternSet());
+  }
+
+  EXPECT_EQ(2u, manager()->GetMatcherCountForTest());
+
+  // Create a request with the "cookie" and "referer" request headers, and the
+  // "set-cookie" response header.
+  WebRequestInfo request_1(GetRequestParamsForURLWithHeaders(
+      "http://example.com", std::vector<std::string>({"cookie", "referer"})));
+  request_1.response_headers = base::MakeRefCounted<net::HttpResponseHeaders>(
+      net::HttpUtil::AssembleRawHeaders("HTTP/1.1 200 OK\r\n"
+                                        "Content-Type: text/plain; UTF-8\r\n"
+                                        "Set-Cookie: custom/value\r\n"));
+
+  const std::vector<Action>& actual_actions =
+      manager()->EvaluateRequest(request_1, false /*is_incognito_context*/);
+  ASSERT_EQ(2u, actual_actions.size());
+
+  // Removal of the cookie header should be attributed to |extension_2| because
+  // it was installed later than |extension_1| and thus has more priority.
+  Action expected_action_1(ActionType::REMOVE_HEADERS);
+  expected_action_1.request_headers_to_remove.push_back(
+      net::HttpRequestHeaders::kCookie);
+
+  // Removal of the referer header should be attributed to |extension_2|.
+  expected_action_1.request_headers_to_remove.push_back(
+      net::HttpRequestHeaders::kReferer);
+
+  Action expected_action_2(ActionType::REMOVE_HEADERS);
+  expected_action_2.response_headers_to_remove.push_back("set-cookie");
+
+  EXPECT_EQ(expected_action_1, actual_actions[0]);
+  EXPECT_EQ(extension_2->id(), actual_actions[0].extension_id.value());
+
+  EXPECT_EQ(expected_action_2, actual_actions[1]);
+  EXPECT_EQ(extension_1->id(), actual_actions[1].extension_id.value());
 }
 
 TEST_P(RulesetManagerTest, PageAllowingAPI) {
@@ -576,7 +683,7 @@
                                  : Action(ActionType::NONE);
     EXPECT_EQ(expected_action,
               manager()->EvaluateRequest(WebRequestInfo(std::move(params)),
-                                         false /*is_incognito_context*/));
+                                         false /*is_incognito_context*/)[0]);
   }
 }
 
@@ -649,8 +756,9 @@
     WebRequestInfo request(GetRequestParamsForURL(url, initiator));
 
     bool is_incognito_context = false;
-    EXPECT_EQ(expected_action,
-              manager()->EvaluateRequest(request, is_incognito_context));
+    manager()->EvaluateRequest(request, is_incognito_context);
+    ASSERT_EQ(1u, request.dnr_actions.size());
+    EXPECT_EQ(expected_action, request.dnr_actions[0]);
   };
 
   // Test redirect extension.
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index 8a9c143..f094c57 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -293,6 +293,44 @@
   }
 }
 
+void SafeBrowsingPrivateEventRouter::OnDangerousDownloadWarning(
+    const GURL& url,
+    const std::string& file_name,
+    const std::string& download_digest_sha256,
+    const std::string& threat_type) {
+  if (!client_)
+    return;
+
+  // Create a real-time event dictionary and report it.
+  base::Value event(base::Value::Type::DICTIONARY);
+  event.SetStringKey(kKeyUrl, url.spec());
+  event.SetStringKey(kKeyFileName, file_name);
+  event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+  event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+  event.SetStringKey(kKeyThreatType, threat_type);
+  event.SetBoolKey(kKeyClickedThrough, false);
+  ReportRealtimeEvent(kKeyDangerousDownloadEvent, std::move(event));
+}
+
+void SafeBrowsingPrivateEventRouter::OnDangerousDownloadWarningBypassed(
+    const GURL& url,
+    const std::string& file_name,
+    const std::string& download_digest_sha256,
+    const std::string& threat_type) {
+  if (!client_)
+    return;
+
+  // Create a real-time event dictionary and report it.
+  base::Value event(base::Value::Type::DICTIONARY);
+  event.SetStringKey(kKeyUrl, url.spec());
+  event.SetStringKey(kKeyFileName, file_name);
+  event.SetStringKey(kKeyDownloadDigestSha256, download_digest_sha256);
+  event.SetStringKey(kKeyProfileUserName, GetProfileUserName());
+  event.SetStringKey(kKeyThreatType, threat_type);
+  event.SetBoolKey(kKeyClickedThrough, true);
+  ReportRealtimeEvent(kKeyDangerousDownloadEvent, std::move(event));
+}
+
 void SafeBrowsingPrivateEventRouter::SetCloudPolicyClientForTesting(
     std::unique_ptr<policy::CloudPolicyClient> client) {
   DCHECK_EQ(nullptr, client_.get());
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
index a73f124..5771a928 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
@@ -112,6 +112,27 @@
                                  const std::string& file_name,
                                  const std::string& download_digest_sha256);
 
+  // Notifies listeners that the user saw a download warning.
+  // - |url| is the download URL
+  // - |file_name| is the path on disk
+  // - |download_digest_sha256| is the hex-encoded SHA256
+  // - |threat_type| is the danger type of the download.
+  void OnDangerousDownloadWarning(const GURL& url,
+                                  const std::string& file_name,
+                                  const std::string& download_digest_sha256,
+                                  const std::string& threat_type);
+
+  // Notifies listeners that the user bypassed a download warning.
+  // - |url| is the download URL
+  // - |file_name| is the path on disk
+  // - |download_digest_sha256| is the hex-encoded SHA256
+  // - |threat_type| is the danger type of the download.
+  void OnDangerousDownloadWarningBypassed(
+      const GURL& url,
+      const std::string& file_name,
+      const std::string& download_digest_sha256,
+      const std::string& threat_type);
+
   void SetCloudPolicyClientForTesting(
       std::unique_ptr<policy::CloudPolicyClient> client);
 
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
index 2e416ee7..ac1dce0 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -771,7 +771,7 @@
   headers0.MergeFrom(base_headers);
   WebRequestInfoInitParams info_params;
   WebRequestInfo info(std::move(info_params));
-  info.dnr_action.emplace(Action::Type::NONE);
+  info.dnr_actions.emplace_back(Action::Type::NONE);
   MergeOnBeforeSendHeadersResponses(info, deltas, &headers0, &ignored_actions,
                                     &ignore1, &ignore2,
                                     &request_headers_modified0);
@@ -879,8 +879,10 @@
   bool request_headers_modified4 = false;
   net::HttpRequestHeaders headers4;
   headers4.MergeFrom(base_headers);
-  info.dnr_action.emplace(Action::Type::REMOVE_HEADERS);
-  info.dnr_action->request_headers_to_remove = {"key5"};
+
+  Action remove_headers_action(Action::Type::REMOVE_HEADERS);
+  remove_headers_action.request_headers_to_remove = {"key5"};
+  info.dnr_actions.push_back(std::move(remove_headers_action));
   MergeOnBeforeSendHeadersResponses(info, deltas, &headers4, &ignored_actions,
                                     &ignore1, &ignore2,
                                     &request_headers_modified4);
@@ -927,7 +929,7 @@
 
   WebRequestInfoInitParams info_params;
   WebRequestInfo info(std::move(info_params));
-  info.dnr_action.emplace(Action::Type::NONE);
+  info.dnr_actions.emplace_back(Action::Type::NONE);
   helpers::IgnoredActions ignored_actions;
   std::set<std::string> removed_headers, set_headers;
   bool request_headers_modified = false;
@@ -1270,7 +1272,7 @@
   WebRequestInfoInitParams info_params;
   info_params.url = GURL(kExampleUrl);
   WebRequestInfo info(std::move(info_params));
-  info.dnr_action.emplace(Action::Type::NONE);
+  info.dnr_actions.emplace_back(Action::Type::NONE);
 
   MergeOnHeadersReceivedResponses(info, deltas, base_headers.get(),
                                   &new_headers0, &allowed_unsafe_redirect_url0,
@@ -1350,8 +1352,10 @@
 
   // Ensure headers removed by Declarative Net Request API can't be added by web
   // request extensions and result in a conflict.
-  info.dnr_action.emplace(Action::Type::REMOVE_HEADERS);
-  info.dnr_action->response_headers_to_remove = {"key3"};
+  Action remove_headers_action(Action::Type::REMOVE_HEADERS);
+  remove_headers_action.response_headers_to_remove = {"key3"};
+  info.dnr_actions.push_back(std::move(remove_headers_action));
+
   ignored_actions.clear();
   bool response_headers_modified3 = false;
   scoped_refptr<net::HttpResponseHeaders> new_headers3;
@@ -1406,7 +1410,7 @@
   WebRequestInfoInitParams info_params;
   info_params.url = GURL(kExampleUrl);
   WebRequestInfo info(std::move(info_params));
-  info.dnr_action.emplace(Action::Type::NONE);
+  info.dnr_actions.emplace_back(Action::Type::NONE);
 
   MergeOnHeadersReceivedResponses(info, deltas, base_headers.get(),
                                   &new_headers1, &allowed_unsafe_redirect_url1,
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc
index d895f59a..f916e4e 100644
--- a/chrome/browser/notifications/notification_platform_bridge_linux.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc
@@ -657,8 +657,7 @@
       actions.push_back(kDefaultButtonId);
       actions.push_back("Activate");
       // Always add a settings button for web notifications.
-      if (notification_type != NotificationHandler::Type::EXTENSION &&
-          notification_type != NotificationHandler::Type::SEND_TAB_TO_SELF) {
+      if (notification->should_show_settings_button()) {
         actions.push_back(kSettingsButtonId);
         actions.push_back(
             l10n_util::GetStringUTF8(IDS_NOTIFICATION_BUTTON_SETTINGS));
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc b/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc
index 3dde644..7da9e50 100644
--- a/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc
@@ -33,6 +33,7 @@
 
 using message_center::ButtonInfo;
 using message_center::Notification;
+using message_center::SettingsButtonHandler;
 using testing::_;
 using testing::ByMove;
 using testing::Return;
@@ -55,7 +56,9 @@
                       GURL(),
                       message_center::NotifierId(GURL()),
                       message_center::RichNotificationData(),
-                      new message_center::NotificationDelegate()) {}
+                      new message_center::NotificationDelegate()) {
+    notification_.set_settings_button_handler(SettingsButtonHandler::DELEGATE);
+  }
 
   Notification GetResult() { return notification_; }
 
@@ -90,6 +93,11 @@
     return *this;
   }
 
+  NotificationBuilder& SetSettingsButtonHandler(SettingsButtonHandler handler) {
+    notification_.set_settings_button_handler(handler);
+    return *this;
+  }
+
   NotificationBuilder& SetSilent(bool silent) {
     notification_.set_silent(silent);
     return *this;
@@ -771,6 +779,27 @@
       NotificationBuilder("").GetResult(), nullptr);
 }
 
+TEST_F(NotificationPlatformBridgeLinuxTest, NoSettingsButton) {
+  EXPECT_CALL(*mock_notification_proxy_.get(),
+              CallMethodAndBlock(Calls("Notify"), _))
+      .WillOnce(OnNotify(
+          [](const NotificationRequest& request) {
+            ASSERT_EQ(1UL, request.actions.size());
+            EXPECT_EQ("default", request.actions[0].id);
+            EXPECT_EQ("Activate", request.actions[0].label);
+          },
+          1));
+
+  CreateNotificationBridgeLinux(
+      TestParams().SetServerName("cinnamon").SetServerVersion("3.8.0"));
+  notification_bridge_linux_->Display(
+      NotificationHandler::Type::WEB_PERSISTENT, profile(),
+      NotificationBuilder("")
+          .SetSettingsButtonHandler(SettingsButtonHandler::NONE)
+          .GetResult(),
+      nullptr);
+}
+
 TEST_F(NotificationPlatformBridgeLinuxTest, DefaultButtonForwards) {
   EXPECT_CALL(*mock_notification_proxy_.get(),
               CallMethodAndBlock(Calls("Notify"), _))
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm
index f4e30466..e9c5566d 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
@@ -249,11 +249,7 @@
     [builder setIcon:notification.icon().ToNSImage()];
   }
 
-  [builder
-      setShowSettingsButton:(notification_type !=
-                                 NotificationHandler::Type::EXTENSION &&
-                             notification_type !=
-                                 NotificationHandler::Type::SEND_TAB_TO_SELF)];
+  [builder setShowSettingsButton:(notification.should_show_settings_button())];
   std::vector<message_center::ButtonInfo> buttons = notification.buttons();
   if (!buttons.empty()) {
     DCHECK_LE(buttons.size(), blink::kWebNotificationMaxActions);
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm b/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
index 7d9a9f4..02ca05e 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
@@ -83,7 +83,8 @@
                                              const char* button1,
                                              const char* button2) {
     return CreateNotification(title, subtitle, origin, button1, button2,
-                              false /* require_interaction */);
+                              /*require_interaction=*/false,
+                              /*show_settings_button=*/true);
   }
 
   std::unique_ptr<Notification> CreateAlert(const char* title,
@@ -92,7 +93,8 @@
                                             const char* button1,
                                             const char* button2) {
     return CreateNotification(title, subtitle, origin, button1, button2,
-                              true /* require_interaction */);
+                              /*require_interaction=*/true,
+                              /*show_settings_button=*/true);
   }
 
   std::unique_ptr<Notification> CreateNotification(const char* title,
@@ -100,7 +102,8 @@
                                                    const char* origin,
                                                    const char* button1,
                                                    const char* button2,
-                                                   bool require_interaction) {
+                                                   bool require_interaction,
+                                                   bool show_settings_button) {
     message_center::RichNotificationData optional_fields;
     if (button1) {
       optional_fields.buttons.push_back(
@@ -110,6 +113,10 @@
             message_center::ButtonInfo(base::UTF8ToUTF16(button2)));
       }
     }
+    if (show_settings_button) {
+      optional_fields.settings_button_handler =
+          message_center::SettingsButtonHandler::DELEGATE;
+    }
 
     GURL url = GURL(origin);
 
@@ -230,6 +237,28 @@
   EXPECT_NSEQ(@"Settings", [delivered_notification actionButtonTitle]);
 }
 
+TEST_F(NotificationPlatformBridgeMacTest, TestDisplayNoSettings) {
+  std::unique_ptr<Notification> notification = CreateNotification(
+      "Title", "Context", "https://gmail.com", nullptr, nullptr,
+      /*require_interaction=*/false, /*show_settings_button=*/false);
+
+  std::unique_ptr<NotificationPlatformBridgeMac> bridge(
+      new NotificationPlatformBridgeMac(notification_center(),
+                                        alert_dispatcher()));
+  bridge->Display(NotificationHandler::Type::WEB_PERSISTENT, profile(),
+                  *notification, nullptr);
+  NSArray* notifications = [notification_center() deliveredNotifications];
+
+  EXPECT_EQ(1u, [notifications count]);
+
+  NSUserNotification* delivered_notification = [notifications objectAtIndex:0];
+  EXPECT_NSEQ(@"Title", [delivered_notification title]);
+  EXPECT_NSEQ(@"Context", [delivered_notification informativeText]);
+  EXPECT_NSEQ(@"gmail.com", [delivered_notification subtitle]);
+  EXPECT_NSEQ(@"Close", [delivered_notification otherButtonTitle]);
+  EXPECT_FALSE([delivered_notification hasActionButton]);
+}
+
 TEST_F(NotificationPlatformBridgeMacTest, TestDisplayOneButton) {
   std::unique_ptr<Notification> notification = CreateBanner(
       "Title", "Context", "https://gmail.com", "Button 1", nullptr);
diff --git a/chrome/browser/notifications/win/notification_template_builder.cc b/chrome/browser/notifications/win/notification_template_builder.cc
index 4edfc292..043a127 100644
--- a/chrome/browser/notifications/win/notification_template_builder.cc
+++ b/chrome/browser/notifications/win/notification_template_builder.cc
@@ -390,12 +390,17 @@
   if (!notification.buttons().empty())
     AddActions(&xml_writer, image_retainer, notification, launch_id);
   EnsureReminderHasButton(&xml_writer, notification, launch_id);
-  if (context_menu_label_override) {
-    AddContextMenu(&xml_writer, launch_id, context_menu_label_override);
+  if (notification.should_show_settings_button()) {
+    if (context_menu_label_override) {
+      AddContextMenu(&xml_writer, launch_id, context_menu_label_override);
+    } else {
+      AddContextMenu(&xml_writer, launch_id,
+                     l10n_util::GetStringUTF8(
+                         IDS_WIN_NOTIFICATION_SETTINGS_CONTEXT_MENU_ITEM_NAME));
+    }
   } else {
-    AddContextMenu(&xml_writer, launch_id,
-                   l10n_util::GetStringUTF8(
-                       IDS_WIN_NOTIFICATION_SETTINGS_CONTEXT_MENU_ITEM_NAME));
+    DCHECK(!context_menu_label_override)
+        << "Must show custom settings button label";
   }
   EndActionsElement(&xml_writer);
 
diff --git a/chrome/browser/notifications/win/notification_template_builder_unittest.cc b/chrome/browser/notifications/win/notification_template_builder_unittest.cc
index be8eea3..e29c84c 100644
--- a/chrome/browser/notifications/win/notification_template_builder_unittest.cc
+++ b/chrome/browser/notifications/win/notification_template_builder_unittest.cc
@@ -70,6 +70,8 @@
         NotifierId(origin_url), RichNotificationData(), nullptr /* delegate */);
     // Set a fixed timestamp, to avoid having to test against current timestamp.
     notification.set_timestamp(FixedTime());
+    notification.set_settings_button_handler(
+        message_center::SettingsButtonHandler::DELEGATE);
     return notification;
   }
 
@@ -481,3 +483,28 @@
 
   ASSERT_NO_FATAL_FAILURE(VerifyXml(notification, kExpectedXml));
 }
+
+TEST_F(NotificationTemplateBuilderTest, NoSettings) {
+  message_center::Notification notification = BuildNotification();
+
+  // Disable overriding context menu label.
+  SetContextMenuLabelForTesting(nullptr);
+
+  notification.set_settings_button_handler(
+      message_center::SettingsButtonHandler::NONE);
+
+  const wchar_t kExpectedXml[] =
+      LR"(<toast launch="0|0|Default|0|https://example.com/|notification_id" displayTimestamp="1998-09-04T01:02:03Z">
+ <visual>
+  <binding template="ToastGeneric">
+   <text>My Title</text>
+   <text>My Message</text>
+   <text placement="attribution">example.com</text>
+  </binding>
+ </visual>
+ <actions/>
+</toast>
+)";
+
+  ASSERT_NO_FATAL_FAILURE(VerifyXml(notification, kExpectedXml));
+}
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc
index cf3a769e..0a3c63c4 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.cc
@@ -21,12 +21,9 @@
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
 #include "chrome/browser/previews/previews_ui_tab_helper.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
-#include "components/data_reduction_proxy/proto/pageload_metrics.pb.h"
 #include "components/page_load_metrics/common/page_load_timing.h"
 #include "components/previews/content/previews_user_data.h"
 #include "content/public/browser/browser_context.h"
@@ -46,32 +43,6 @@
 
 namespace {
 
-PageloadMetrics_PageEndReason ConvertPLMPageEndReasonToProto(
-    page_load_metrics::PageEndReason reason) {
-  switch (reason) {
-    case page_load_metrics::END_NONE:
-      return PageloadMetrics_PageEndReason_END_NONE;
-    case page_load_metrics::END_RELOAD:
-      return PageloadMetrics_PageEndReason_END_RELOAD;
-    case page_load_metrics::END_FORWARD_BACK:
-      return PageloadMetrics_PageEndReason_END_FORWARD_BACK;
-    case page_load_metrics::END_CLIENT_REDIRECT:
-      return PageloadMetrics_PageEndReason_END_CLIENT_REDIRECT;
-    case page_load_metrics::END_NEW_NAVIGATION:
-      return PageloadMetrics_PageEndReason_END_NEW_NAVIGATION;
-    case page_load_metrics::END_STOP:
-      return PageloadMetrics_PageEndReason_END_STOP;
-    case page_load_metrics::END_CLOSE:
-      return PageloadMetrics_PageEndReason_END_CLOSE;
-    case page_load_metrics::END_PROVISIONAL_LOAD_FAILED:
-      return PageloadMetrics_PageEndReason_END_PROVISIONAL_LOAD_FAILED;
-    case page_load_metrics::END_RENDER_PROCESS_GONE:
-      return PageloadMetrics_PageEndReason_END_RENDER_PROCESS_GONE;
-    default:
-      return PageloadMetrics_PageEndReason_END_OTHER;
-  }
-}
-
 uint64_t ComputeDataReductionProxyUUID(
     data_reduction_proxy::DataReductionProxyData* data) {
   if (!data || data->session_key().empty() || !data->page_id().has_value() ||
@@ -107,13 +78,7 @@
       insecure_network_bytes_(0),
       secure_network_bytes_(0),
       insecure_cached_bytes_(0),
-      secure_cached_bytes_(0),
-      process_id_(base::kNullProcessId),
-      renderer_memory_usage_kb_(0),
-      render_process_host_id_(content::ChildProcessHost::kInvalidUniqueID),
-      touch_count_(0),
-      scroll_count_(0),
-      redirect_count_(0) {}
+      secure_cached_bytes_(0) {}
 
 DataReductionProxyMetricsObserverBase::
     ~DataReductionProxyMetricsObserverBase() {}
@@ -133,26 +98,9 @@
   // called in WebContents destructor.
   browser_context_ = navigation_handle->GetWebContents()->GetBrowserContext();
 
-  process_id_ = navigation_handle->GetWebContents()
-                    ->GetMainFrame()
-                    ->GetProcess()
-                    ->GetProcess()
-                    .Pid();
-  render_process_host_id_ = navigation_handle->GetWebContents()
-                                ->GetMainFrame()
-                                ->GetProcess()
-                                ->GetID();
-
   return OnCommitCalled(navigation_handle, source_id);
 }
 
-page_load_metrics::PageLoadMetricsObserver::ObservePolicy
-DataReductionProxyMetricsObserverBase::OnRedirect(
-    content::NavigationHandle* navigation_handle) {
-  redirect_count_++;
-  return CONTINUE_OBSERVING;
-}
-
 // Check if the NavigationData indicates anything about the DataReductionProxy.
 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
 DataReductionProxyMetricsObserverBase::OnCommitCalled(
@@ -209,9 +157,8 @@
   // FlushMetricsOnAppEnterBackground is invoked on Android in cases where the
   // app is about to be backgrounded, as part of the Activity.onPause()
   // flow. After this method is invoked, Chrome may be killed without further
-  // notification, so we send a pingback with data collected up to this point.
+  // notification, so we record UKM with data collected up to this point.
   if (GetDelegate().DidCommit()) {
-    SendPingback(timing, true /* app_background_occurred */);
     RecordUKM();
   }
   return STOP_OBSERVING;
@@ -220,7 +167,6 @@
 void DataReductionProxyMetricsObserverBase::OnComplete(
     const page_load_metrics::mojom::PageLoadTiming& timing) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  SendPingback(timing, false /* app_background_occurred */);
   RecordUKM();
 }
 
@@ -254,146 +200,6 @@
   builder.Record(ukm::UkmRecorder::Get());
 }
 
-void DataReductionProxyMetricsObserverBase::SendPingback(
-    const page_load_metrics::mojom::PageLoadTiming& timing,
-    bool app_background_occurred) {
-  // TODO(ryansturm): Move to OnFirstBackgroundEvent to handle some fast
-  // shutdown cases. crbug.com/618072
-  if (!browser_context_ || !data_)
-    return;
-  // Only consider timing events that happened before the first background
-  // event.
-  base::Optional<base::TimeDelta> response_start;
-  base::Optional<base::TimeDelta> load_event_start;
-  base::Optional<base::TimeDelta> first_image_paint;
-  base::Optional<base::TimeDelta> first_contentful_paint;
-  base::Optional<base::TimeDelta> experimental_first_meaningful_paint;
-  base::Optional<base::TimeDelta> first_input_delay;
-  base::Optional<base::TimeDelta> parse_blocked_on_script_load_duration;
-  base::Optional<base::TimeDelta> parse_stop;
-  base::Optional<base::TimeDelta> page_end_time;
-  base::Optional<base::TimeDelta> main_frame_fetch_start;
-
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.response_start, GetDelegate())) {
-    response_start = timing.response_start;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.document_timing->load_event_start, GetDelegate())) {
-    load_event_start = timing.document_timing->load_event_start;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.paint_timing->first_image_paint, GetDelegate())) {
-    first_image_paint = timing.paint_timing->first_image_paint;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.paint_timing->first_contentful_paint, GetDelegate())) {
-    first_contentful_paint = timing.paint_timing->first_contentful_paint;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.paint_timing->first_meaningful_paint, GetDelegate())) {
-    experimental_first_meaningful_paint =
-        timing.paint_timing->first_meaningful_paint;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.interactive_timing->first_input_delay, GetDelegate())) {
-    first_input_delay = timing.interactive_timing->first_input_delay;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.parse_timing->parse_blocked_on_script_load_duration,
-          GetDelegate())) {
-    parse_blocked_on_script_load_duration =
-        timing.parse_timing->parse_blocked_on_script_load_duration;
-  }
-  if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
-          timing.parse_timing->parse_stop, GetDelegate())) {
-    parse_stop = timing.parse_timing->parse_stop;
-  }
-  if (GetDelegate().DidCommit() && main_frame_fetch_start_) {
-    main_frame_fetch_start =
-        main_frame_fetch_start_.value() - GetDelegate().GetNavigationStart();
-  }
-  if (GetDelegate().StartedInForeground() &&
-      GetDelegate().GetPageEndTime().has_value()) {
-    // This should be reported even when the app goes into the background which
-    // is excluded in
-    // |page_load_metrics::WasStartedInForegroundOptionalEventInForeground|.
-    page_end_time = GetDelegate().GetPageEndTime();
-  } else if (GetDelegate().StartedInForeground()) {
-    page_end_time = base::TimeTicks::Now() - GetDelegate().GetNavigationStart();
-  }
-
-  // If a crash happens, report the host |render_process_host_id_| to the
-  // pingback client. Otherwise report kInvalidUniqueID.
-  int host_id = content::ChildProcessHost::kInvalidUniqueID;
-  if (GetDelegate().GetPageEndReason() ==
-      page_load_metrics::PageEndReason::END_RENDER_PROCESS_GONE) {
-    host_id = render_process_host_id_;
-  }
-
-  const int64_t original_network_bytes =
-      insecure_original_network_bytes_ +
-      ExponentiallyBucketBytes(secure_original_network_bytes_);
-  const int64_t network_bytes =
-      insecure_network_bytes_ + ExponentiallyBucketBytes(secure_network_bytes_);
-  const int64_t total_page_size_bytes =
-      insecure_network_bytes_ + insecure_cached_bytes_ +
-      ExponentiallyBucketBytes(secure_network_bytes_ + secure_cached_bytes_);
-
-  // Recording cached bytes can be done with raw data, but the end result must
-  // be bucketed in 50 linear buckets between 0% - 100%.
-  const int64_t cached_bytes = insecure_cached_bytes_ + secure_cached_bytes_;
-  const int64_t total_bytes =
-      cached_bytes + insecure_network_bytes_ + secure_network_bytes_;
-  int cached_percentage;
-  if (total_bytes <= 0) {
-    cached_percentage = 0;
-  } else {
-    cached_percentage =
-        static_cast<int>(std::lround(static_cast<float>(cached_bytes) /
-                                     static_cast<float>(total_bytes) * 100.0));
-  }
-  DCHECK_GE(cached_percentage, 0);
-  DCHECK_LE(cached_percentage, 100);
-  cached_percentage = cached_percentage - (cached_percentage % 2);
-  const float cached_fraction = static_cast<float>(cached_percentage) / 100.0;
-
-  DataReductionProxyPageLoadTiming data_reduction_proxy_timing(
-      timing.navigation_start, response_start, load_event_start,
-      first_image_paint, first_contentful_paint,
-      experimental_first_meaningful_paint, first_input_delay,
-      parse_blocked_on_script_load_duration, parse_stop, page_end_time,
-      lite_page_redirect_penalty_, lite_page_redirect_status_,
-      main_frame_fetch_start, network_bytes, original_network_bytes,
-      total_page_size_bytes, cached_fraction, app_background_occurred,
-      opted_out_, renderer_memory_usage_kb_, host_id,
-      ConvertPLMPageEndReasonToProto(GetDelegate().GetPageEndReason()),
-      touch_count_, scroll_count_, redirect_count_);
-  GetPingbackClient()->SendPingback(*data_, data_reduction_proxy_timing);
-}
-
-void DataReductionProxyMetricsObserverBase::OnLoadEventStart(
-    const page_load_metrics::mojom::PageLoadTiming& timing) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (process_id_ != base::kNullProcessId) {
-    auto callback = base::BindRepeating(
-        &DataReductionProxyMetricsObserverBase::ProcessMemoryDump,
-        weak_ptr_factory_.GetWeakPtr());
-    RequestProcessDump(process_id_, callback);
-  }
-}
-
-void DataReductionProxyMetricsObserverBase::OnLoadedResource(
-    const page_load_metrics::ExtraRequestCompleteInfo&
-        extra_request_complete_info) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (extra_request_complete_info.resource_type ==
-      content::ResourceType::kMainFrame) {
-    main_frame_fetch_start_ =
-        extra_request_complete_info.load_timing_info->request_start;
-  }
-}
-
 void DataReductionProxyMetricsObserverBase::OnResourceDataUseObserved(
     content::RenderFrameHost* rfh,
     const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>&
@@ -437,14 +243,6 @@
   }
 }
 
-DataReductionProxyPingbackClient*
-DataReductionProxyMetricsObserverBase::GetPingbackClient() const {
-  return DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
-             browser_context_)
-      ->data_reduction_proxy_service()
-      ->pingback_client();
-}
-
 void DataReductionProxyMetricsObserverBase::OnEventOccurred(
     const void* const event_key) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -452,48 +250,4 @@
     opted_out_ = true;
 }
 
-void DataReductionProxyMetricsObserverBase::OnUserInput(
-    const blink::WebInputEvent& event,
-    const page_load_metrics::mojom::PageLoadTiming& timing) {
-  if (event.GetType() == blink::WebInputEvent::kMouseDown ||
-      event.GetType() == blink::WebInputEvent::kGestureTap) {
-    touch_count_++;
-  }
-
-  if (event.GetType() == blink::WebInputEvent::kMouseWheel ||
-      event.GetType() == blink::WebInputEvent::kGestureScrollUpdate ||
-      event.GetType() == blink::WebInputEvent::kGestureFlingStart) {
-    scroll_count_++;
-  }
-}
-
-void DataReductionProxyMetricsObserverBase::ProcessMemoryDump(
-    bool success,
-    std::unique_ptr<memory_instrumentation::GlobalMemoryDump> memory_dump) {
-  if (!success || !memory_dump)
-    return;
-  // There should only be one process in the dump.
-  DCHECK_EQ(1, std::distance(memory_dump->process_dumps().begin(),
-                             memory_dump->process_dumps().end()));
-
-  auto process_dump_it = memory_dump->process_dumps().begin();
-  if (process_dump_it == memory_dump->process_dumps().end())
-    return;
-
-  // We want to catch this in debug but not crash in release.
-  DCHECK_EQ(process_id_, process_dump_it->pid());
-  if (process_dump_it->pid() != process_id_)
-    return;
-  renderer_memory_usage_kb_ =
-      static_cast<int64_t>(process_dump_it->os_dump().private_footprint_kb);
-}
-
-void DataReductionProxyMetricsObserverBase::RequestProcessDump(
-    base::ProcessId pid,
-    memory_instrumentation::MemoryInstrumentation::RequestGlobalDumpCallback
-        callback) {
-  memory_instrumentation::MemoryInstrumentation::GetInstance()
-      ->RequestPrivateMemoryFootprint(pid, std::move(callback));
-}
-
 }  // namespace data_reduction_proxy
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.h b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.h
index b63fb250..026dd39 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.h
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base.h
@@ -11,12 +11,9 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "base/process/process_handle.h"
 #include "base/sequence_checker.h"
-#include "base/time/time.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "components/previews/core/previews_lite_page_redirect.h"
-#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
 
 namespace content {
 class BrowserContext;
@@ -25,7 +22,6 @@
 
 namespace data_reduction_proxy {
 class DataReductionProxyData;
-class DataReductionProxyPingbackClient;
 
 // Observer responsible for recording core page load metrics relevant to
 // DataReductionProxy's pingback.
@@ -39,24 +35,15 @@
   ObservePolicy OnStart(content::NavigationHandle* navigation_handle,
                         const GURL& currently_committed_url,
                         bool started_in_foreground) override;
-  ObservePolicy OnRedirect(
-      content::NavigationHandle* navigation_handle) override;
   ObservePolicy FlushMetricsOnAppEnterBackground(
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
   void OnComplete(
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
-  void OnLoadEventStart(
-      const page_load_metrics::mojom::PageLoadTiming& timing) override;
-  void OnLoadedResource(const page_load_metrics::ExtraRequestCompleteInfo&
-                            extra_request_compelte_info) override;
   void OnResourceDataUseObserved(
       content::RenderFrameHost* rfh,
       const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>&
           resources) override;
   void OnEventOccurred(const void* const event_key) override;
-  void OnUserInput(
-      const blink::WebInputEvent& event,
-      const page_load_metrics::mojom::PageLoadTiming& timing) override;
 
   // Exponentially bucket the number of bytes for privacy-implicated resources.
   // Input below 10KB returns 0.
@@ -73,9 +60,6 @@
   void set_data(std::unique_ptr<DataReductionProxyData> data) {
     data_ = std::move(data);
   }
-  void set_lite_page_redirect_penalty(base::TimeDelta penalty) {
-    lite_page_redirect_penalty_ = penalty;
-  }
   void set_lite_page_redirect_status(previews::ServerLitePageStatus status) {
     lite_page_redirect_status_ = status;
   }
@@ -104,25 +88,6 @@
   // Records UKM for the data_reduction_proxy event.
   void RecordUKM() const;
 
-  // Sends the page load information to the pingback client.
-  void SendPingback(const page_load_metrics::mojom::PageLoadTiming& timing,
-                    bool app_background_occurred);
-
-  // Gets the default DataReductionProxyPingbackClient. Overridden in testing.
-  virtual DataReductionProxyPingbackClient* GetPingbackClient() const;
-
-  // Used as a callback to getting a memory dump of the related renderer
-  // process.
-  void ProcessMemoryDump(
-      bool success,
-      std::unique_ptr<memory_instrumentation::GlobalMemoryDump> memory_dump);
-
-  // Gets the memory coordinator for Chrome. Virtual for testing.
-  virtual void RequestProcessDump(
-      base::ProcessId pid,
-      memory_instrumentation::MemoryInstrumentation::RequestGlobalDumpCallback
-          callback);
-
   // Data related to this navigation.
   std::unique_ptr<DataReductionProxyData> data_;
 
@@ -162,33 +127,6 @@
   // The total cached bytes used for HTTPS resources.
   int64_t secure_cached_bytes_;
 
-  // The process ID of the main frame renderer during OnCommit.
-  base::ProcessId process_id_;
-
-  // The memory usage of the main frame renderer shortly after OnLoadEventStart.
-  // Available after ProcessMemoryDump is called. 0 before that point.
-  int64_t renderer_memory_usage_kb_;
-
-  // A unique identifier to the child process of the render frame, stored in
-  // case of a renderer crash.
-  // Set at navigation commit time.
-  int render_process_host_id_;
-
-  // The number of touch events on the page.
-  uint32_t touch_count_;
-
-  // The number of scroll events on the page.
-  uint32_t scroll_count_;
-
-  // The number of main frame redirects that occurred before commit.
-  uint32_t redirect_count_;
-
-  // The time of the fetchStart of the main page HTML.
-  base::Optional<base::TimeTicks> main_frame_fetch_start_;
-
-  // The penalty of navigating to a lite page redirect preview.
-  base::Optional<base::TimeDelta> lite_page_redirect_penalty_;
-
   // The status of an attempted lite page redirect preview.
   base::Optional<previews::ServerLitePageStatus> lite_page_redirect_status_;
 
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base_unittest.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base_unittest.cc
index 7a85150..8e11433 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_base_unittest.cc
@@ -20,8 +20,6 @@
 #include "chrome/browser/page_load_metrics/page_load_tracker.h"
 #include "chrome/browser/previews/previews_ui_tab_helper.h"
 #include "chrome/test/base/testing_browser_process.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "components/page_load_metrics/common/page_load_timing.h"
@@ -42,14 +40,12 @@
 namespace {
 
 // DataReductionProxyMetricsObserver responsible for modifying data about the
-// navigation in OnCommit. It is also responsible for using a passed in
-// DataReductionProxyPingbackClient instead of the default.
+// navigation in OnCommit.
 class TestDataReductionProxyMetricsObserverBase
     : public DataReductionProxyMetricsObserverBase {
  public:
   TestDataReductionProxyMetricsObserverBase(
       content::WebContents* web_contents,
-      TestPingbackClient* pingback_client,
       bool data_reduction_proxy_used,
       bool cached_data_reduction_proxy_used,
       bool lite_page_used,
@@ -57,7 +53,6 @@
       std::string session_key,
       uint64_t page_id)
       : web_contents_(web_contents),
-        pingback_client_(pingback_client),
         data_reduction_proxy_used_(data_reduction_proxy_used),
         cached_data_reduction_proxy_used_(cached_data_reduction_proxy_used),
         lite_page_used_(lite_page_used),
@@ -91,33 +86,8 @@
         navigation_handle, source_id);
   }
 
-  DataReductionProxyPingbackClient* GetPingbackClient() const override {
-    return pingback_client_;
-  }
-
-  void RequestProcessDump(
-      base::ProcessId pid,
-      memory_instrumentation::MemoryInstrumentation::RequestGlobalDumpCallback
-          callback) override {
-    memory_instrumentation::mojom::GlobalMemoryDumpPtr global_dump(
-        memory_instrumentation::mojom::GlobalMemoryDump::New());
-
-    memory_instrumentation::mojom::ProcessMemoryDumpPtr pmd(
-        memory_instrumentation::mojom::ProcessMemoryDump::New());
-    pmd->pid = pid;
-    pmd->process_type = memory_instrumentation::mojom::ProcessType::RENDERER;
-    pmd->os_dump = memory_instrumentation::mojom::OSMemDump::New();
-    pmd->os_dump->private_footprint_kb = kMemoryKb;
-
-    global_dump->process_dumps.push_back(std::move(pmd));
-    std::move(callback).Run(true,
-                            memory_instrumentation::GlobalMemoryDump::MoveFrom(
-                                std::move(global_dump)));
-  }
-
  private:
   content::WebContents* web_contents_;
-  TestPingbackClient* pingback_client_;
   bool data_reduction_proxy_used_;
   bool cached_data_reduction_proxy_used_;
   bool lite_page_used_;
@@ -158,7 +128,7 @@
   void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
     tracker->AddObserver(
         std::make_unique<TestDataReductionProxyMetricsObserverBase>(
-            web_contents(), pingback_client(), data_reduction_proxy_used(),
+            web_contents(), data_reduction_proxy_used(),
             cached_data_reduction_proxy_used(), is_using_lite_page(),
             black_listed(), session_key(), page_id()));
   }
@@ -166,224 +136,6 @@
 
 }  // namespace
 
-TEST_F(DataReductionProxyMetricsObserverBaseTest, OnCompletePingback) {
-  ResetTest();
-  // Verify that when data reduction proxy was used the correct timing
-  // information is sent to SendPingback.
-  RunTestAndNavigateToUntrackedUrl(true, false, false);
-  ValidateTimes();
-
-  ResetTest();
-  // Verify that when data reduction proxy was used but first image paint is
-  // unset, the correct timing information is sent to SendPingback.
-  timing()->paint_timing->first_image_paint = base::nullopt;
-  RunTestAndNavigateToUntrackedUrl(true, false, false);
-  ValidateTimes();
-
-  ResetTest();
-  // Verify that when data reduction proxy was used but first contentful paint
-  // is unset, SendPingback is not called.
-  timing()->paint_timing->first_contentful_paint = base::nullopt;
-  RunTestAndNavigateToUntrackedUrl(true, false, false);
-  ValidateTimes();
-
-  ResetTest();
-  // Verify that when data reduction proxy was used but first meaningful paint
-  // is unset, SendPingback is not called.
-  timing()->paint_timing->first_meaningful_paint = base::nullopt;
-  RunTestAndNavigateToUntrackedUrl(true, false, false);
-  ValidateTimes();
-
-  ResetTest();
-  // Verify that when data reduction proxy was used but load event start is
-  // unset, SendPingback is not called.
-  timing()->document_timing->load_event_start = base::nullopt;
-  RunTestAndNavigateToUntrackedUrl(true, false, false);
-  ValidateTimes();
-
-  ResetTest();
-  // Verify that when an opt out occurs, that it is reported in the pingback.
-  timing()->document_timing->load_event_start = base::nullopt;
-  RunTest(true, true, true, false);
-  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
-  NavigateToUntrackedUrl();
-  ValidateTimes();
-
-  ResetTest();
-  RunTest(true, false, false, true);
-  NavigateToUntrackedUrl();
-  ValidateBlackListInPingback(true);
-
-  ResetTest();
-  // Verify that when data reduction proxy was not used, SendPingback is not
-  // called.
-  RunTestAndNavigateToUntrackedUrl(false, false, false);
-  EXPECT_FALSE(pingback_client_->send_pingback_called());
-
-  ResetTest();
-  cached_data_reduction_proxy_used_ = true;
-  RunTestAndNavigateToUntrackedUrl(false, false, false);
-  EXPECT_TRUE(pingback_client_->send_pingback_called());
-  cached_data_reduction_proxy_used_ = false;
-
-  ResetTest();
-  // Verify that when the holdback experiment is enabled, a pingback is sent.
-  base::FieldTrialList field_trial_list(nullptr);
-  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
-      "DataCompressionProxyHoldback", "Enabled"));
-  RunTestAndNavigateToUntrackedUrl(true, false, false);
-  EXPECT_TRUE(pingback_client_->send_pingback_called());
-}
-
-TEST_F(DataReductionProxyMetricsObserverBaseTest, TouchScrollEventCount) {
-  struct TestCase {
-    std::vector<FakeInputEvent> events;
-    uint32_t want_touch;
-    uint32_t want_scroll;
-  };
-  const TestCase test_cases[] = {
-      {
-          // Test zero value.
-          {},
-          0 /* want_touch */,
-          0 /* want_scroll */,
-      },
-      {
-          // Test all inputs, should only count the ones we care about.
-          {
-              FakeInputEvent(blink::WebInputEvent::kMouseDown),
-              FakeInputEvent(blink::WebInputEvent::kMouseUp),
-              FakeInputEvent(blink::WebInputEvent::kMouseMove),
-              FakeInputEvent(blink::WebInputEvent::kMouseEnter),
-              FakeInputEvent(blink::WebInputEvent::kMouseLeave),
-              FakeInputEvent(blink::WebInputEvent::kContextMenu),
-              FakeInputEvent(blink::WebInputEvent::kMouseWheel),
-              FakeInputEvent(blink::WebInputEvent::kRawKeyDown),
-              FakeInputEvent(blink::WebInputEvent::kKeyDown),
-              FakeInputEvent(blink::WebInputEvent::kKeyUp),
-              FakeInputEvent(blink::WebInputEvent::kChar),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollEnd),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate),
-              FakeInputEvent(blink::WebInputEvent::kGestureFlingStart),
-              FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel),
-              FakeInputEvent(blink::WebInputEvent::kGesturePinchBegin),
-              FakeInputEvent(blink::WebInputEvent::kGesturePinchEnd),
-              FakeInputEvent(blink::WebInputEvent::kGesturePinchUpdate),
-              FakeInputEvent(blink::WebInputEvent::kGestureTapDown),
-              FakeInputEvent(blink::WebInputEvent::kGestureShowPress),
-              FakeInputEvent(blink::WebInputEvent::kGestureTap),
-              FakeInputEvent(blink::WebInputEvent::kGestureTapCancel),
-              FakeInputEvent(blink::WebInputEvent::kGestureLongPress),
-              FakeInputEvent(blink::WebInputEvent::kGestureLongTap),
-              FakeInputEvent(blink::WebInputEvent::kGestureTwoFingerTap),
-              FakeInputEvent(blink::WebInputEvent::kGestureTapUnconfirmed),
-              FakeInputEvent(blink::WebInputEvent::kGestureDoubleTap),
-              FakeInputEvent(blink::WebInputEvent::kTouchStart),
-              FakeInputEvent(blink::WebInputEvent::kTouchMove),
-              FakeInputEvent(blink::WebInputEvent::kTouchEnd),
-              FakeInputEvent(blink::WebInputEvent::kTouchCancel),
-              FakeInputEvent(blink::WebInputEvent::kTouchScrollStarted),
-              FakeInputEvent(blink::WebInputEvent::kPointerDown),
-              FakeInputEvent(blink::WebInputEvent::kPointerUp),
-              FakeInputEvent(blink::WebInputEvent::kPointerMove),
-              FakeInputEvent(blink::WebInputEvent::kPointerCancel),
-              FakeInputEvent(blink::WebInputEvent::kPointerCausedUaAction),
-
-          },
-          2 /* want_touch */,
-          3 /* want_scroll */,
-      },
-      {
-          // Test all inputs, with the ones we care about repeated.
-          {
-              FakeInputEvent(blink::WebInputEvent::kMouseDown),
-              FakeInputEvent(blink::WebInputEvent::kMouseUp),
-              FakeInputEvent(blink::WebInputEvent::kMouseMove),
-              FakeInputEvent(blink::WebInputEvent::kMouseEnter),
-              FakeInputEvent(blink::WebInputEvent::kMouseLeave),
-              FakeInputEvent(blink::WebInputEvent::kContextMenu),
-              FakeInputEvent(blink::WebInputEvent::kMouseWheel),
-              FakeInputEvent(blink::WebInputEvent::kRawKeyDown),
-              FakeInputEvent(blink::WebInputEvent::kKeyDown),
-              FakeInputEvent(blink::WebInputEvent::kKeyUp),
-              FakeInputEvent(blink::WebInputEvent::kChar),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollEnd),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate),
-              FakeInputEvent(blink::WebInputEvent::kGestureFlingStart),
-              FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel),
-              FakeInputEvent(blink::WebInputEvent::kGesturePinchBegin),
-              FakeInputEvent(blink::WebInputEvent::kGesturePinchEnd),
-              FakeInputEvent(blink::WebInputEvent::kGesturePinchUpdate),
-              FakeInputEvent(blink::WebInputEvent::kGestureTapDown),
-              FakeInputEvent(blink::WebInputEvent::kGestureShowPress),
-              FakeInputEvent(blink::WebInputEvent::kGestureTap),
-              FakeInputEvent(blink::WebInputEvent::kGestureTapCancel),
-              FakeInputEvent(blink::WebInputEvent::kGestureLongPress),
-              FakeInputEvent(blink::WebInputEvent::kGestureLongTap),
-              FakeInputEvent(blink::WebInputEvent::kGestureTwoFingerTap),
-              FakeInputEvent(blink::WebInputEvent::kGestureTapUnconfirmed),
-              FakeInputEvent(blink::WebInputEvent::kGestureDoubleTap),
-              FakeInputEvent(blink::WebInputEvent::kTouchStart),
-              FakeInputEvent(blink::WebInputEvent::kTouchMove),
-              FakeInputEvent(blink::WebInputEvent::kTouchEnd),
-              FakeInputEvent(blink::WebInputEvent::kTouchCancel),
-              FakeInputEvent(blink::WebInputEvent::kTouchScrollStarted),
-              FakeInputEvent(blink::WebInputEvent::kPointerDown),
-              FakeInputEvent(blink::WebInputEvent::kPointerUp),
-              FakeInputEvent(blink::WebInputEvent::kPointerMove),
-              FakeInputEvent(blink::WebInputEvent::kPointerCancel),
-              FakeInputEvent(blink::WebInputEvent::kPointerCausedUaAction),
-              // Repeat.
-              FakeInputEvent(blink::WebInputEvent::kMouseDown),
-              FakeInputEvent(blink::WebInputEvent::kGestureTap),
-              FakeInputEvent(blink::WebInputEvent::kMouseWheel),
-              FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate),
-              FakeInputEvent(blink::WebInputEvent::kGestureFlingStart),
-          },
-          4 /* want_touch */,
-          6 /* want_scroll */,
-      },
-  };
-
-  for (const TestCase& test_case : test_cases) {
-    ResetTest();
-    RunTest(true, false, false, false);
-
-    for (const blink::WebInputEvent& event : test_case.events)
-      SimulateInputEvent(event);
-
-    NavigateToUntrackedUrl();
-    EXPECT_EQ(pingback_client_->timing()->touch_count, test_case.want_touch);
-    EXPECT_EQ(pingback_client_->timing()->scroll_count, test_case.want_scroll);
-  }
-}
-
-TEST_F(DataReductionProxyMetricsObserverBaseTest,
-       ProcessIdSentOnRendererCrash) {
-  ResetTest();
-  RunTest(true, false, false, false);
-  std::unique_ptr<DataReductionProxyData> data =
-      std::make_unique<DataReductionProxyData>();
-  data->set_used_data_reduction_proxy(true);
-  data->set_request_url(GURL(kDefaultTestUrl));
-  SimulateRendererCrash();
-
-  // When the renderer crashes, the pingback should report that.
-  ValidateRendererCrash(true);
-
-  ResetTest();
-  RunTest(true, false, false, false);
-  data = std::make_unique<DataReductionProxyData>();
-  data->set_used_data_reduction_proxy(true);
-  data->set_request_url(GURL(kDefaultTestUrl));
-  NavigateToUntrackedUrl();
-
-  // When the renderer does not crash, the pingback should report that.
-  ValidateRendererCrash(false);
-}
-
 TEST_F(DataReductionProxyMetricsObserverBaseTest,
        ValidateUKM_DataSaverNotUsed) {
   ResetTest();
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc
index 9ba5d09..b9a4c9e9 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.cc
@@ -44,36 +44,9 @@
   return resource_data_update;
 }
 
-TestPingbackClient::TestPingbackClient()
-    : DataReductionProxyPingbackClientImpl(nullptr,
-                                           "unknown"),
-      send_pingback_called_(false) {}
-
-TestPingbackClient::~TestPingbackClient() {}
-
-void TestPingbackClient::SendPingback(
-    const DataReductionProxyData& data,
-    const DataReductionProxyPageLoadTiming& timing) {
-  timing_.reset(new DataReductionProxyPageLoadTiming(timing));
-  send_pingback_called_ = true;
-  data_ = data.DeepCopy();
-}
-
-void TestPingbackClient::Reset() {
-  send_pingback_called_ = false;
-  timing_.reset();
-}
-
-FakeInputEvent::FakeInputEvent(blink::WebInputEvent::Type type)
-    : WebInputEvent(sizeof(FakeInputEvent),
-                    type,
-                    blink::WebInputEvent::kNoModifiers,
-                    base::TimeTicks::Now()) {}
-
 DataReductionProxyMetricsObserverTestBase::
     DataReductionProxyMetricsObserverTestBase()
-    : pingback_client_(new TestPingbackClient()),
-      data_reduction_proxy_used_(false),
+    : data_reduction_proxy_used_(false),
       is_using_lite_page_(false),
       opt_out_expected_(false),
       black_listed_(false) {}
@@ -111,7 +84,6 @@
   black_listed_ = black_listed;
   NavigateAndCommit(GURL(kDefaultTestUrl));
   SimulateTimingUpdate(timing_);
-  pingback_client_->Reset();
 }
 
 void DataReductionProxyMetricsObserverTestBase::
@@ -130,12 +102,6 @@
   ect_ = ect;
   NavigateAndCommit(GURL(kDefaultTestUrl));
   SimulateTimingUpdate(timing_);
-  pingback_client_->Reset();
-}
-
-void DataReductionProxyMetricsObserverTestBase::SimulateRendererCrash() {
-  observer()->RenderProcessGone(
-      base::TerminationStatus::TERMINATION_STATUS_ABNORMAL_TERMINATION);
 }
 
 // Verify that, if expected and actual are set, their values are equal.
@@ -151,58 +117,6 @@
   }
 }
 
-void DataReductionProxyMetricsObserverTestBase::ValidateTimes() {
-  EXPECT_TRUE(pingback_client_->send_pingback_called());
-  EXPECT_EQ(timing_.navigation_start,
-            pingback_client_->timing()->navigation_start);
-  EXPECT_GT(pingback_client_->timing()->page_end_time, base::TimeDelta());
-  ExpectEqualOrUnset(timing_.paint_timing->first_contentful_paint,
-                     pingback_client_->timing()->first_contentful_paint);
-  ExpectEqualOrUnset(
-      timing_.paint_timing->first_meaningful_paint,
-      pingback_client_->timing()->experimental_first_meaningful_paint);
-  ExpectEqualOrUnset(timing_.response_start,
-                     pingback_client_->timing()->response_start);
-  ExpectEqualOrUnset(timing_.document_timing->load_event_start,
-                     pingback_client_->timing()->load_event_start);
-  ExpectEqualOrUnset(timing_.paint_timing->first_image_paint,
-                     pingback_client_->timing()->first_image_paint);
-  EXPECT_EQ(opt_out_expected_, pingback_client_->timing()->opt_out_occurred);
-  EXPECT_EQ(timing_.document_timing->load_event_start
-                ? static_cast<int64_t>(kMemoryKb)
-                : 0,
-            pingback_client_->timing()->renderer_memory_usage_kb);
-}
-
-void DataReductionProxyMetricsObserverTestBase::ValidateBlackListInPingback(
-    bool black_listed) {
-  EXPECT_TRUE(pingback_client_->send_pingback_called());
-  EXPECT_EQ(black_listed, pingback_client_->data().black_listed());
-}
-
-void DataReductionProxyMetricsObserverTestBase::
-    ValidatePreviewsStateInPingback() {
-  EXPECT_EQ(!!preview_info_, pingback_client_->send_pingback_called());
-  if (preview_info_) {
-    EXPECT_EQ(preview_info_->drp_session_key,
-              pingback_client_->data().session_key());
-    EXPECT_EQ(preview_info_->page_id, pingback_client_->data().page_id());
-    EXPECT_EQ(ect_, pingback_client_->data().effective_connection_type());
-    EXPECT_EQ(preview_info_->status,
-              pingback_client_->timing()->lite_page_redirect_status.value());
-    // This is tested better in PreviewsLitePageRedirectMetricsObserverTest.
-    EXPECT_GT(pingback_client_->timing()->lite_page_redirect_penalty.value(),
-              base::TimeDelta());
-  }
-}
-
-void DataReductionProxyMetricsObserverTestBase::ValidateRendererCrash(
-    bool renderer_crashed) {
-  EXPECT_TRUE(pingback_client_->send_pingback_called());
-  EXPECT_EQ(renderer_crashed, pingback_client_->timing()->host_id !=
-                                  content::ChildProcessHost::kInvalidUniqueID);
-}
-
 void DataReductionProxyMetricsObserverTestBase::SetUp() {
   page_load_metrics::PageLoadMetricsObserverTestHarness::SetUp();
   PreviewsUITabHelper::CreateForWebContents(web_contents());
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h
index 7f8d99f..c992088 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h
@@ -15,8 +15,6 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
 #include "components/page_load_metrics/common/page_load_timing.h"
 #include "components/page_load_metrics/common/test/page_load_metrics_test_util.h"
 #include "components/previews/content/previews_user_data.h"
@@ -26,7 +24,6 @@
 namespace data_reduction_proxy {
 
 const char kDefaultTestUrl[] = "http://google.com";
-const int kMemoryKb = 1024;
 
 // Attaches a new |PreviewsUserData| to the given |navigation_handle|.
 previews::PreviewsUserData* PreviewsDataForNavigationHandle(
@@ -39,40 +36,8 @@
                                  bool proxy_used,
                                  double compression_ratio = 1.0);
 
-// Pingback client responsible for recording the timing information it receives
-// from a SendPingback call.
-class TestPingbackClient : public DataReductionProxyPingbackClientImpl {
- public:
-  TestPingbackClient();
-  ~TestPingbackClient() override;
-
-  // Mocks sending a pingback. |data_| and |timing_| are set to |data| and
-  // |timing|.
-  void SendPingback(const DataReductionProxyData& data,
-                    const DataReductionProxyPageLoadTiming& timing) override;
-
-  // Resets the internal state of |this|.
-  void Reset();
-
-  DataReductionProxyPageLoadTiming* timing() const { return timing_.get(); }
-  const DataReductionProxyData& data() const { return *data_; }
-  bool send_pingback_called() const { return send_pingback_called_; }
-
- private:
-  std::unique_ptr<DataReductionProxyPageLoadTiming> timing_;
-  std::unique_ptr<DataReductionProxyData> data_;
-  bool send_pingback_called_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestPingbackClient);
-};
-
-class FakeInputEvent : public blink::WebInputEvent {
- public:
-  explicit FakeInputEvent(blink::WebInputEvent::Type type);
-};
-
 // This base test class does all the test support and validation associated with
-// the DRP pingbacks.
+// the DRP metrics.
 class DataReductionProxyMetricsObserverTestBase
     : public page_load_metrics::PageLoadMetricsObserverTestHarness {
  public:
@@ -100,30 +65,14 @@
                                         bool is_using_lite_page,
                                         bool opt_out_expected);
 
-  // Mocks a renderer crash.
-  void SimulateRendererCrash();
-
   // Verify that, if expected and actual are set, their values are equal.
   // Otherwise, verify that both are unset.
   void ExpectEqualOrUnset(const base::Optional<base::TimeDelta>& expected,
                           const base::Optional<base::TimeDelta>& actual);
 
-  // Validates the times in the pingback.
-  void ValidateTimes();
-
-  // Validates the blacklist state in the pingback.
-  void ValidateBlackListInPingback(bool black_listed);
-
-  // Validates the lite page redirect preview state in the pingback.
-  void ValidatePreviewsStateInPingback();
-
-  // Validates the renderer crash state in the pingback.
-  void ValidateRendererCrash(bool renderer_crashed);
-
   // Set ups test state.
   void SetUp() override;
 
-  TestPingbackClient* pingback_client() const { return pingback_client_.get(); }
   page_load_metrics::mojom::PageLoadTimingPtr timing() {
     return timing_.Clone();
   }
@@ -142,7 +91,6 @@
   uint64_t page_id() const { return page_id_; }
 
  protected:
-  std::unique_ptr<TestPingbackClient> pingback_client_;
   page_load_metrics::mojom::PageLoadTiming timing_;
   bool cached_data_reduction_proxy_used_ = false;
   std::string session_key_;
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
index 610ccc8..4dbf401 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h"
 #include "chrome/browser/page_load_metrics/observers/histogram_suffixes.h"
 #include "chrome/browser/page_load_metrics/page_load_tracker.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
 #include "components/previews/content/previews_user_data.h"
 #include "content/public/browser/web_contents.h"
@@ -23,19 +22,16 @@
 namespace data_reduction_proxy {
 
 // DataReductionProxyMetricsObserver responsible for modifying data about the
-// navigation in OnCommit. It is also responsible for using a passed in
-// DataReductionProxyPingbackClient instead of the default.
+// navigation in OnCommit.
 class TestDataReductionProxyMetricsObserver
     : public DataReductionProxyMetricsObserver {
  public:
   TestDataReductionProxyMetricsObserver(content::WebContents* web_contents,
-                                        TestPingbackClient* pingback_client,
                                         bool data_reduction_proxy_used,
                                         bool cached_data_reduction_proxy_used,
                                         bool lite_page_used,
                                         bool black_listed)
       : web_contents_(web_contents),
-        pingback_client_(pingback_client),
         data_reduction_proxy_used_(data_reduction_proxy_used),
         cached_data_reduction_proxy_used_(cached_data_reduction_proxy_used),
         lite_page_used_(lite_page_used),
@@ -65,33 +61,8 @@
                                                              source_id);
   }
 
-  DataReductionProxyPingbackClient* GetPingbackClient() const override {
-    return pingback_client_;
-  }
-
-  void RequestProcessDump(
-      base::ProcessId pid,
-      memory_instrumentation::MemoryInstrumentation::RequestGlobalDumpCallback
-          callback) override {
-    memory_instrumentation::mojom::GlobalMemoryDumpPtr global_dump(
-        memory_instrumentation::mojom::GlobalMemoryDump::New());
-
-    memory_instrumentation::mojom::ProcessMemoryDumpPtr pmd(
-        memory_instrumentation::mojom::ProcessMemoryDump::New());
-    pmd->pid = pid;
-    pmd->process_type = memory_instrumentation::mojom::ProcessType::RENDERER;
-    pmd->os_dump = memory_instrumentation::mojom::OSMemDump::New();
-    pmd->os_dump->private_footprint_kb = kMemoryKb;
-
-    global_dump->process_dumps.push_back(std::move(pmd));
-    std::move(callback).Run(true,
-                            memory_instrumentation::GlobalMemoryDump::MoveFrom(
-                                std::move(global_dump)));
-  }
-
  private:
   content::WebContents* web_contents_;
-  TestPingbackClient* pingback_client_;
   bool data_reduction_proxy_used_;
   bool cached_data_reduction_proxy_used_;
   bool lite_page_used_;
@@ -238,7 +209,7 @@
   void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
     tracker->AddObserver(
         std::make_unique<TestDataReductionProxyMetricsObserver>(
-            web_contents(), pingback_client(), data_reduction_proxy_used(),
+            web_contents(), data_reduction_proxy_used(),
             cached_data_reduction_proxy_used(), is_using_lite_page(),
             black_listed()));
   }
diff --git a/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc
index 22070632..f3cdf06 100644
--- a/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.cc
@@ -57,15 +57,9 @@
   data->set_used_data_reduction_proxy(true);
   data->set_was_cached_data_reduction_proxy_response(false);
 
-  base::TimeDelta penalty =
-      handle->NavigationStart() - info->original_navigation_start;
-  // If this preview was attempted, we always expect that the navigation was
-  // canceled and restarted, so there should be a penalty.
-  DCHECK_GE(penalty, base::TimeDelta::FromSeconds(0));
   DCHECK_NE(info->status, previews::ServerLitePageStatus::kUnknown);
 
   set_data(std::move(data));
-  set_lite_page_redirect_penalty(penalty);
   set_lite_page_redirect_status(info->status);
 
   return CONTINUE_OBSERVING;
diff --git a/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer_unittest.cc
deleted file mode 100644
index 00fc0c9..0000000
--- a/chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer_unittest.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer.h"
-
-#include <memory>
-
-#include "chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h"
-#include "chrome/browser/page_load_metrics/page_load_tracker.h"
-#include "chrome/browser/previews/previews_ui_tab_helper.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
-#include "components/previews/content/previews_user_data.h"
-
-const base::TimeDelta kNavigationPenalty = base::TimeDelta::FromMinutes(1);
-
-class TestPreviewsLitePageRedirectMetricsObserver
-    : public PreviewsLitePageRedirectMetricsObserver {
- public:
-  TestPreviewsLitePageRedirectMetricsObserver(
-      content::WebContents* web_contents,
-      data_reduction_proxy::TestPingbackClient* pingback_client,
-      previews::PreviewsUserData::ServerLitePageInfo* preview_info,
-      net::EffectiveConnectionType ect)
-      : web_contents_(web_contents),
-        pingback_client_(pingback_client),
-        preview_info_(preview_info),
-        ect_(ect) {}
-
-  ~TestPreviewsLitePageRedirectMetricsObserver() override {}
-
-  // PreviewsLitePageRedirectMetricsObserver:
-  ObservePolicy OnCommitCalled(content::NavigationHandle* navigation_handle,
-                               ukm::SourceId source_id) override {
-    previews::PreviewsUserData* data =
-        PreviewsUITabHelper::FromWebContents(web_contents_)
-            ->CreatePreviewsUserDataForNavigationHandle(navigation_handle, 0u);
-
-    if (preview_info_) {
-      preview_info_->original_navigation_start =
-          navigation_handle->NavigationStart() - kNavigationPenalty;
-
-      data->set_server_lite_page_info(preview_info_->Clone());
-      data->set_navigation_ect(ect_);
-    }
-
-    return PreviewsLitePageRedirectMetricsObserver::OnCommitCalled(
-        navigation_handle, source_id);
-  }
-
-  data_reduction_proxy::DataReductionProxyPingbackClient* GetPingbackClient()
-      const override {
-    return pingback_client_;
-  }
-
-  void RequestProcessDump(
-      base::ProcessId pid,
-      memory_instrumentation::MemoryInstrumentation::RequestGlobalDumpCallback
-          callback) override {
-    memory_instrumentation::mojom::GlobalMemoryDumpPtr global_dump(
-        memory_instrumentation::mojom::GlobalMemoryDump::New());
-
-    memory_instrumentation::mojom::ProcessMemoryDumpPtr pmd(
-        memory_instrumentation::mojom::ProcessMemoryDump::New());
-    pmd->pid = pid;
-    pmd->process_type = memory_instrumentation::mojom::ProcessType::RENDERER;
-    pmd->os_dump = memory_instrumentation::mojom::OSMemDump::New();
-    pmd->os_dump->private_footprint_kb = data_reduction_proxy::kMemoryKb;
-
-    global_dump->process_dumps.push_back(std::move(pmd));
-    std::move(callback).Run(true,
-                            memory_instrumentation::GlobalMemoryDump::MoveFrom(
-                                std::move(global_dump)));
-  }
-
- private:
-  content::WebContents* web_contents_;
-  data_reduction_proxy::TestPingbackClient* pingback_client_;
-  previews::PreviewsUserData::ServerLitePageInfo* preview_info_;
-  net::EffectiveConnectionType ect_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestPreviewsLitePageRedirectMetricsObserver);
-};
-
-class PreviewsLitePageRedirectMetricsObserverTest
-    : public data_reduction_proxy::DataReductionProxyMetricsObserverTestBase {
- public:
-  PreviewsLitePageRedirectMetricsObserverTest() {}
-  ~PreviewsLitePageRedirectMetricsObserverTest() override {}
-
- protected:
-  void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
-    tracker->AddObserver(
-        std::make_unique<TestPreviewsLitePageRedirectMetricsObserver>(
-            web_contents(), pingback_client(), preview_info(), ect()));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PreviewsLitePageRedirectMetricsObserverTest);
-};
-
-TEST_F(PreviewsLitePageRedirectMetricsObserverTest, TestPingbackSent) {
-  previews::PreviewsUserData::ServerLitePageInfo info;
-  info.drp_session_key = "meow";
-  info.page_id = 1337U;
-  info.status = previews::ServerLitePageStatus::kSuccess;
-
-  ResetTest();
-  RunLitePageRedirectTest(&info, net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
-  NavigateToUntrackedUrl();
-  ValidatePreviewsStateInPingback();
-  ValidateTimes();
-
-  EXPECT_EQ(pingback_client()->timing()->lite_page_redirect_penalty.value(),
-            kNavigationPenalty);
-  EXPECT_EQ(pingback_client()->timing()->lite_page_redirect_status.value(),
-            previews::ServerLitePageStatus::kSuccess);
-}
-
-TEST_F(PreviewsLitePageRedirectMetricsObserverTest, TestPingbackNotSent) {
-  ResetTest();
-  RunLitePageRedirectTest(nullptr, net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
-  NavigateToUntrackedUrl();
-  ValidatePreviewsStateInPingback();
-}
diff --git a/chrome/browser/platform_util_unittest.cc b/chrome/browser/platform_util_unittest.cc
index 3baf050a..3704d421 100644
--- a/chrome/browser/platform_util_unittest.cc
+++ b/chrome/browser/platform_util_unittest.cc
@@ -58,8 +58,7 @@
     // New FileSystemBackend that uses our MockSpecialStoragePolicy.
     additional_backends->push_back(
         std::make_unique<chromeos::FileSystemBackend>(
-            nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-            external_mount_points,
+            nullptr, nullptr, nullptr, nullptr, nullptr, external_mount_points,
             storage::ExternalMountPoints::GetSystemInstance()));
   }
 };
diff --git a/chrome/browser/previews/previews_browsertest.cc b/chrome/browser/previews/previews_browsertest.cc
index 9623d75..c7b6bd7 100644
--- a/chrome/browser/previews/previews_browsertest.cc
+++ b/chrome/browser/previews/previews_browsertest.cc
@@ -175,7 +175,6 @@
         FROM_HERE, {content::BrowserThread::UI},
         base::BindOnce(&PreviewsBrowserTest::MonitorResourceRequestOnUIThread,
                        base::Unretained(this), request));
-    base::RunLoop().RunUntilIdle();
   }
 
   void MonitorResourceRequestOnUIThread(
@@ -312,12 +311,17 @@
                          PreviewsNoScriptBrowserTest,
                          testing::Bool());
 
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
+#define DISABLE_ON_WIN_MAC_CHROMESOS(x) DISABLED_##x
+#else
+#define DISABLE_ON_WIN_MAC_CHROMESOS(x) x
+#endif
+
 // Loads a webpage that has both script and noscript tags and also requests
 // a script resource. Verifies that the noscript tag is evaluated and the
 // script resource is not loaded.
-// TODO(crbug.com/1004245): Fix and re-enable the test.
 IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
-                       DISABLED_NoScriptPreviewsEnabled) {
+                       DISABLE_ON_WIN_MAC_CHROMESOS(NoScriptPreviewsEnabled)) {
   GURL url = https_url();
 
   // Whitelist NoScript for https_hint_setup_url()'s' host.
@@ -335,9 +339,9 @@
                                      "Previews.PreviewShown.NoScript", 1);
 }
 
-// TODO(crbug.com/1004245): Fix and re-enable the test.
-IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
-                       DISABLED_NoScriptPreviewsEnabledButHttpRequest) {
+IN_PROC_BROWSER_TEST_P(
+    PreviewsNoScriptBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(NoScriptPreviewsEnabledButHttpRequest)) {
   GURL url = http_url();
 
   // Whitelist NoScript for http_hint_setup_url() host.
@@ -350,10 +354,9 @@
   EXPECT_FALSE(noscript_css_requested());
 }
 
-// TODO(crbug.com/1004245): Fix and re-enable the test.
-IN_PROC_BROWSER_TEST_P(
-    PreviewsNoScriptBrowserTest,
-    DISABLED_NoScriptPreviewsEnabledButNoTransformDirective) {
+IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
+                       DISABLE_ON_WIN_MAC_CHROMESOS(
+                           NoScriptPreviewsEnabledButNoTransformDirective)) {
   GURL url = https_no_transform_url();
 
   // Whitelist NoScript for https_hint_setup_url()'s' host.
@@ -370,9 +373,9 @@
       "Previews.CacheControlNoTransform.BlockedPreview", 5 /* NoScript */, 1);
 }
 
-// TODO(crbug.com/1004245): Fix and re-enable the test.
-IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
-                       DISABLED_NoScriptPreviewsEnabledHttpRedirectToHttps) {
+IN_PROC_BROWSER_TEST_P(
+    PreviewsNoScriptBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(NoScriptPreviewsEnabledHttpRedirectToHttps)) {
   GURL url = redirect_url();
 
   // Whitelist NoScript for http_hint_setup_url() host.
@@ -390,9 +393,9 @@
                                      "Previews.PreviewShown.NoScript", 1);
 }
 
-// TODO(crbug.com/1004245): Fix and re-enable the test.
-IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
-                       DISABLED_NoScriptPreviewsRecordsOptOut) {
+IN_PROC_BROWSER_TEST_P(
+    PreviewsNoScriptBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(NoScriptPreviewsRecordsOptOut)) {
   GURL url = redirect_url();
 
   // Whitelist NoScript for http_hint_setup_url()'s' host.
@@ -417,9 +420,9 @@
                                      1);
 }
 
-// TODO(crbug.com/1004245): Fix and re-enable the test.
-IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
-                       DISABLED_NoScriptPreviewsEnabledByWhitelist) {
+IN_PROC_BROWSER_TEST_P(
+    PreviewsNoScriptBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(NoScriptPreviewsEnabledByWhitelist)) {
   GURL url = https_url();
 
   // Whitelist NoScript for https_hint_setup_url()'s' host.
@@ -432,9 +435,9 @@
   EXPECT_FALSE(noscript_js_requested());
 }
 
-// TODO(crbug.com/1004245): Fix and re-enable the test.
-IN_PROC_BROWSER_TEST_P(PreviewsNoScriptBrowserTest,
-                       DISABLED_NoScriptPreviewsNotEnabledByWhitelist) {
+IN_PROC_BROWSER_TEST_P(
+    PreviewsNoScriptBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(NoScriptPreviewsNotEnabledByWhitelist)) {
   GURL url = https_url();
 
   // Whitelist random site for NoScript.
diff --git a/chrome/browser/previews/previews_lite_page_browsertest.cc b/chrome/browser/previews/previews_lite_page_browsertest.cc
index c9b5b3f3..35e5c95 100644
--- a/chrome/browser/previews/previews_lite_page_browsertest.cc
+++ b/chrome/browser/previews/previews_lite_page_browsertest.cc
@@ -48,7 +48,6 @@
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_test_utils.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
@@ -191,7 +190,6 @@
     cmd->AppendSwitchASCII("force-effective-connection-type", "Slow-2G");
     cmd->AppendSwitchASCII("force-variation-ids", "42");
     cmd->AppendSwitchASCII("host-rules", "MAP * 127.0.0.1");
-    cmd->AppendSwitch("enable-data-reduction-proxy-force-pingback");
     cmd->AppendSwitch("ignore-litepage-redirect-optimization-blacklist");
   }
 
@@ -290,14 +288,6 @@
     slow_http_url_ = slow_http_server_->GetURL(kOriginHost, "/");
     ASSERT_TRUE(slow_http_url_.SchemeIs(url::kHttpScheme));
 
-    pingback_server_ = std::make_unique<net::EmbeddedTestServer>(
-        net::EmbeddedTestServer::TYPE_HTTPS);
-
-    pingback_server_->RegisterRequestHandler(base::BindRepeating(
-        &BasePreviewsLitePageServerBrowserTest::HandlePingbackRequest,
-        base::Unretained(this)));
-    ASSERT_TRUE(pingback_server_->Start());
-
     std::map<std::string, std::string> feature_parameters = {
         {"previews_host", previews_server_url().spec()},
         {"full_probe_url", previews_server_url().spec()},
@@ -312,9 +302,6 @@
         {"should_probe_origin", "true"},
         {"origin_probe_timeout_ms", "500"},
     };
-    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-        "data-reduction-proxy-pingback-url",
-        pingback_server_->GetURL("pingback.com", "/").spec());
 
     scoped_parameterized_feature_list_.InitAndEnableFeatureWithParameters(
         previews::features::kLitePageServerPreviews, feature_parameters);
@@ -675,12 +662,6 @@
     return previews_server_connections_.size();
   }
 
-  void WaitForPingback() {
-    base::RunLoop run_loop;
-    waiting_for_pingback_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
   void WaitForInterventionReport() {
     if (!intervention_report_content_.empty())
       return;
@@ -764,19 +745,6 @@
     return std::move(response);
   }
 
-  std::unique_ptr<net::test_server::HttpResponse> HandlePingbackRequest(
-      const net::test_server::HttpRequest& request) {
-    std::unique_ptr<net::test_server::BasicHttpResponse> response =
-        std::make_unique<net::test_server::BasicHttpResponse>();
-    response->set_code(net::HTTP_OK);
-
-    if (!waiting_for_pingback_closure_.is_null()) {
-      std::move(waiting_for_pingback_closure_).Run();
-    }
-
-    return response;
-  }
-
   std::unique_ptr<net::test_server::HttpResponse> HandleResourceRequest(
       const net::test_server::HttpRequest& request) {
     std::unique_ptr<net::test_server::BasicHttpResponse> response =
@@ -974,7 +942,6 @@
   std::unique_ptr<net::EmbeddedTestServer> https_server_;
   std::unique_ptr<net::EmbeddedTestServer> http_server_;
   std::unique_ptr<net::EmbeddedTestServer> slow_http_server_;
-  std::unique_ptr<net::EmbeddedTestServer> pingback_server_;
   GURL https_url_;
   GURL blacklisted_https_url_;
   GURL base_https_lite_page_url_;
@@ -995,7 +962,6 @@
   int subresources_requested_ = 0;
   std::unordered_set<std::string> previews_server_connections_;
   std::string intervention_report_content_;
-  base::OnceClosure waiting_for_pingback_closure_;
   base::OnceClosure waiting_for_report_closure_;
 };
 
@@ -1666,16 +1632,6 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_P(PreviewsLitePageServerBrowserTest,
-                       DISABLE_ON_WIN_MAC_CHROMESOS(LitePageCreatesPingback)) {
-  ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
-  VerifyPreviewLoaded();
-
-  // Starting a new page load will send a pingback for the previous page load.
-  GetWebContents()->GetController().Reload(content::ReloadType::NORMAL, false);
-  WaitForPingback();
-}
-
 IN_PROC_BROWSER_TEST_P(
     PreviewsLitePageServerBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMESOS(LitePageSendsInterventionReport)) {
@@ -1706,81 +1662,6 @@
   EXPECT_EQ(expected, ParsedInterventionReport());
 }
 
-class TestDataReductionProxyPingbackClient
-    : public data_reduction_proxy::DataReductionProxyPingbackClient {
- public:
-  void WaitForPingback() {
-    base::RunLoop run_loop;
-    wait_for_pingback_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
-  data_reduction_proxy::DataReductionProxyData* data() { return data_.get(); }
-
- private:
-  void SendPingback(
-      const data_reduction_proxy::DataReductionProxyData& data,
-      const data_reduction_proxy::DataReductionProxyPageLoadTiming& timing)
-      override {
-    data_ = data.DeepCopy();
-    if (wait_for_pingback_closure_)
-      std::move(wait_for_pingback_closure_).Run();
-  }
-
-  void SetPingbackReportingFraction(
-      float pingback_reporting_fraction) override {}
-
-  base::OnceClosure wait_for_pingback_closure_;
-  std::unique_ptr<data_reduction_proxy::DataReductionProxyData> data_;
-};
-
-IN_PROC_BROWSER_TEST_P(PreviewsLitePageServerBrowserTest,
-                       DISABLE_ON_WIN_MAC_CHROMESOS(PingbackContent)) {
-  TestDataReductionProxyPingbackClient* pingback_client =
-      new TestDataReductionProxyPingbackClient();
-  DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
-      browser()->profile())
-      ->data_reduction_proxy_service()
-      ->SetPingbackClientForTesting(pingback_client);
-
-  // This test should pass whether or not
-  // |kDataReductionProxyPopulatePreviewsPageIDToPingback| is enabled.
-  for (const bool drp_pageid_feature_enabled : {false, true}) {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatureState(
-        data_reduction_proxy::features::
-            kDataReductionProxyPopulatePreviewsPageIDToPingback,
-        drp_pageid_feature_enabled);
-
-    ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
-    VerifyPreviewLoaded();
-
-    PreviewsUITabHelper* ui_tab_helper =
-        PreviewsUITabHelper::FromWebContents(GetWebContents());
-    previews::PreviewsUserData* previews_data =
-        ui_tab_helper->previews_user_data();
-    // Grab the page id and session now because they may change after the
-    // reload.
-    uint64_t expected_page_id = previews_data->server_lite_page_info()->page_id;
-    std::string expected_session_key =
-        previews_data->server_lite_page_info()->drp_session_key;
-
-    // Starting a new page load will send a pingback for the previous page load.
-    GetWebContents()->GetController().Reload(content::ReloadType::NORMAL,
-                                             false);
-    pingback_client->WaitForPingback();
-
-    data_reduction_proxy::DataReductionProxyData* data =
-        pingback_client->data();
-    EXPECT_TRUE(data->used_data_reduction_proxy());
-    EXPECT_TRUE(data->lite_page_received());
-    EXPECT_FALSE(data->was_cached_data_reduction_proxy_response());
-    EXPECT_EQ(data->page_id().value(), expected_page_id);
-    EXPECT_EQ(data->page_id().value(), got_page_id());
-    EXPECT_EQ(data->session_key(), expected_session_key);
-  }
-}
-
 class PreviewsLitePageServerTimeoutBrowserTest
     : public PreviewsLitePageServerBrowserTest {
  public:
diff --git a/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc b/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc
new file mode 100644
index 0000000..2a0e530
--- /dev/null
+++ b/chrome/browser/printing/pdf_nup_converter_client_browsertest.cc
@@ -0,0 +1,191 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/files/file_util.h"
+#include "base/optional.h"
+#include "base/path_service.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_restrictions.h"
+#include "chrome/browser/printing/pdf_nup_converter_client.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 "pdf/pdf.h"
+
+namespace printing {
+
+namespace {
+
+void ResultCallbackImpl(mojom::PdfNupConverter::Status* status_out,
+                        base::ReadOnlySharedMemoryRegion* nup_pdf_region_out,
+                        bool* called,
+                        base::OnceClosure quit_closure,
+                        mojom::PdfNupConverter::Status status_in,
+                        base::ReadOnlySharedMemoryRegion nup_pdf_region_in) {
+  *status_out = status_in;
+  *nup_pdf_region_out = std::move(nup_pdf_region_in);
+  *called = true;
+  std::move(quit_closure).Run();
+}
+
+base::FilePath GetTestDir() {
+  base::FilePath dir;
+  base::PathService::Get(chrome::DIR_TEST_DATA, &dir);
+  if (!dir.empty())
+    dir = dir.AppendASCII("printing");
+  return dir;
+}
+
+base::MappedReadOnlyRegion GetPdfRegion(const char* file_name) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::MappedReadOnlyRegion pdf_region;
+
+  base::FilePath test_data_dir = GetTestDir();
+  if (test_data_dir.empty())
+    return pdf_region;
+
+  base::FilePath pdf_file = test_data_dir.AppendASCII(file_name);
+  std::string pdf_str;
+  if (!base::ReadFileToString(pdf_file, &pdf_str) || pdf_str.empty())
+    return pdf_region;
+
+  pdf_region = base::ReadOnlySharedMemoryRegion::Create(pdf_str.size());
+  if (!pdf_region.IsValid())
+    return pdf_region;
+
+  memcpy(pdf_region.mapping.memory(), pdf_str.data(), pdf_str.size());
+  return pdf_region;
+}
+
+base::MappedReadOnlyRegion GetBadDataRegion() {
+  static const char kBadData[] = "BADDATA";
+  base::MappedReadOnlyRegion pdf_region =
+      base::ReadOnlySharedMemoryRegion::Create(base::size(kBadData));
+  if (!pdf_region.IsValid())
+    return pdf_region;
+
+  memcpy(pdf_region.mapping.memory(), kBadData, base::size(kBadData));
+  return pdf_region;
+}
+
+}  // namespace
+
+class PdfNupConverterClientBrowserTest : public InProcessBrowserTest {
+ public:
+  PdfNupConverterClientBrowserTest() = default;
+  ~PdfNupConverterClientBrowserTest() override = default;
+
+  base::Optional<mojom::PdfNupConverter::Status> Convert(
+      base::ReadOnlySharedMemoryRegion pdf_region,
+      int pages_per_sheet,
+      base::ReadOnlySharedMemoryRegion* out_nup_pdf_region) {
+    mojom::PdfNupConverter::Status status;
+    base::ReadOnlySharedMemoryRegion nup_pdf_region;
+    bool called = false;
+    auto converter = std::make_unique<PdfNupConverterClient>(
+        browser()->tab_strip_model()->GetActiveWebContents());
+
+    {
+      base::RunLoop run_loop;
+      converter->DoNupPdfDocumentConvert(
+          /*document_cookie=*/8, pages_per_sheet,
+          /*page_size=*/gfx::Size(2550, 3300),
+          /*printable_area=*/gfx::Rect(2550, 3300), std::move(pdf_region),
+          base::BindOnce(&ResultCallbackImpl, &status, &nup_pdf_region, &called,
+                         run_loop.QuitClosure()));
+      run_loop.Run();
+    }
+
+    if (!called)
+      return base::nullopt;
+
+    *out_nup_pdf_region = std::move(nup_pdf_region);
+    return status;
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PdfNupConverterClientBrowserTest,
+                       DocumentConvert2UpSuccess) {
+  base::MappedReadOnlyRegion pdf_region =
+      GetPdfRegion("pdf_converter_basic.pdf");
+  ASSERT_TRUE(pdf_region.IsValid());
+
+  // Make sure pdf_converter_basic.pdf has 3 pages.
+  int num_pages;
+  double max_width_in_points;
+  ASSERT_TRUE(
+      chrome_pdf::GetPDFDocInfo(pdf_region.mapping.GetMemoryAsSpan<uint8_t>(),
+                                &num_pages, &max_width_in_points));
+  EXPECT_EQ(3, num_pages);
+  EXPECT_DOUBLE_EQ(612.0, max_width_in_points);
+
+  base::ReadOnlySharedMemoryRegion nup_pdf_region;
+  base::Optional<mojom::PdfNupConverter::Status> status = Convert(
+      std::move(pdf_region.region), /*pages_per_sheet=*/2, &nup_pdf_region);
+
+  ASSERT_TRUE(status.has_value());
+  EXPECT_EQ(mojom::PdfNupConverter::Status::SUCCESS, status.value());
+  base::ReadOnlySharedMemoryMapping nup_pdf_mapping = nup_pdf_region.Map();
+  ASSERT_TRUE(nup_pdf_mapping.IsValid());
+
+  // For 2-up, a 3 page portrait document fits on 2 landscape-oriented pages.
+  ASSERT_TRUE(
+      chrome_pdf::GetPDFDocInfo(nup_pdf_mapping.GetMemoryAsSpan<uint8_t>(),
+                                &num_pages, &max_width_in_points));
+  EXPECT_EQ(2, num_pages);
+  EXPECT_DOUBLE_EQ(3300.0, max_width_in_points);
+}
+
+IN_PROC_BROWSER_TEST_F(PdfNupConverterClientBrowserTest,
+                       DocumentConvert4UpSuccess) {
+  base::MappedReadOnlyRegion pdf_region =
+      GetPdfRegion("pdf_converter_basic.pdf");
+  ASSERT_TRUE(pdf_region.IsValid());
+
+  // Make sure pdf_converter_basic.pdf has 3 pages.
+  int num_pages;
+  double max_width_in_points;
+  ASSERT_TRUE(
+      chrome_pdf::GetPDFDocInfo(pdf_region.mapping.GetMemoryAsSpan<uint8_t>(),
+                                &num_pages, &max_width_in_points));
+  EXPECT_EQ(3, num_pages);
+  EXPECT_DOUBLE_EQ(612.0, max_width_in_points);
+
+  base::ReadOnlySharedMemoryRegion nup_pdf_region;
+  base::Optional<mojom::PdfNupConverter::Status> status = Convert(
+      std::move(pdf_region.region), /*pages_per_sheet=*/4, &nup_pdf_region);
+
+  ASSERT_TRUE(status.has_value());
+  EXPECT_EQ(mojom::PdfNupConverter::Status::SUCCESS, status.value());
+  base::ReadOnlySharedMemoryMapping nup_pdf_mapping = nup_pdf_region.Map();
+  ASSERT_TRUE(nup_pdf_mapping.IsValid());
+
+  // For 4-up, a 3 page portrait document fits on 1 landscape-oriented page.
+  ASSERT_TRUE(
+      chrome_pdf::GetPDFDocInfo(nup_pdf_mapping.GetMemoryAsSpan<uint8_t>(),
+                                &num_pages, &max_width_in_points));
+  EXPECT_EQ(1, num_pages);
+  EXPECT_DOUBLE_EQ(2550.0, max_width_in_points);
+}
+
+IN_PROC_BROWSER_TEST_F(PdfNupConverterClientBrowserTest,
+                       DocumentConvertBadData) {
+  base::MappedReadOnlyRegion pdf_region = GetBadDataRegion();
+  ASSERT_TRUE(pdf_region.IsValid());
+
+  base::ReadOnlySharedMemoryRegion nup_pdf_region;
+  base::Optional<mojom::PdfNupConverter::Status> status = Convert(
+      std::move(pdf_region.region), /*pages_per_sheet=*/2, &nup_pdf_region);
+
+  ASSERT_TRUE(status.has_value());
+  EXPECT_EQ(mojom::PdfNupConverter::Status::CONVERSION_FAILURE, status.value());
+  base::ReadOnlySharedMemoryMapping nup_pdf_mapping = nup_pdf_region.Map();
+  EXPECT_FALSE(nup_pdf_mapping.IsValid());
+}
+
+}  // namespace printing
diff --git a/chrome/browser/resources/bluetooth_internals/BUILD.gn b/chrome/browser/resources/bluetooth_internals/BUILD.gn
index 7ab5c80..aac6bd3 100644
--- a/chrome/browser/resources/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/resources/bluetooth_internals/BUILD.gn
@@ -17,6 +17,7 @@
     "adapter_page.js",
     "bluetooth_internals.js",
     "characteristic_list.js",
+    "debug_log_page.js",
     "descriptor_list.js",
     "device_broker.js",
     "device_collection.js",
@@ -33,6 +34,7 @@
 
   deps = [
     "//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings_js_library_for_compile",
+    "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
     "//ui/webui/resources/js:cr",
     "//ui/webui/resources/js:util",
     "//ui/webui/resources/js/cr/ui:array_data_model",
diff --git a/chrome/browser/resources/bluetooth_internals/adapter_broker.js b/chrome/browser/resources/bluetooth_internals/adapter_broker.js
index 0da84a77..1ca5ea6 100644
--- a/chrome/browser/resources/bluetooth_internals/adapter_broker.js
+++ b/chrome/browser/resources/bluetooth_internals/adapter_broker.js
@@ -154,15 +154,18 @@
 
   /**
    * Initializes an AdapterBroker if one doesn't exist.
+   * @param {!mojom.BluetoothInternalsHandlerRemote=}
+   *     opt_bluetoothInternalsHandler
    * @return {!Promise<!adapter_broker.AdapterBroker>} resolves with
    *     AdapterBroker, rejects if Bluetooth is not supported.
    */
-  function getAdapterBroker() {
+  function getAdapterBroker(opt_bluetoothInternalsHandler) {
     if (adapterBroker) {
       return Promise.resolve(adapterBroker);
     }
 
-    const bluetoothInternalsHandler =
+    const bluetoothInternalsHandler = opt_bluetoothInternalsHandler ?
+        opt_bluetoothInternalsHandler :
         mojom.BluetoothInternalsHandler.getRemote();
 
     // Get an Adapter service.
diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html
index fdd34a71..a7946d5 100644
--- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html
+++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html
@@ -10,6 +10,7 @@
   <link rel="stylesheet" href="chrome://resources/css/spinner.css">
   <link rel="stylesheet" href="bluetooth_internals.css">
 
+  <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
   <link rel="import" href="chrome://resources/html/action_link.html">
   <link rel="import" href="chrome://resources/html/cr/ui.html">
   <link rel="import" href="chrome://resources/html/cr/event_target.html">
@@ -39,6 +40,7 @@
   <script src="service_list.js"></script>
   <script src="descriptor_list.js"></script>
   <script src="adapter_page.js"></script>
+  <script src="debug_log_page.js"></script>
   <script src="device_collection.js"></script>
   <script src="device_details_page.js"></script>
   <script src="device_table.js"></script>
@@ -63,6 +65,9 @@
         <button id="scan-btn">Start Scan</button>
       </div>
     </section>
+    <section id="debug" hidden>
+      <div class="header-extras" id="debug-container"></div>
+    </section>
   </div>
   <div id="snackbar-container"></div>
   <aside id="sidebar">
@@ -79,6 +84,9 @@
           <li data-page-name="devices">
             <button class="custom-appearance">Devices</button>
           </li>
+          <li data-page-name="debug" data-page-name="debug">
+            <button class="custom-appearance">Debug Logs</button>
+          </li>
         </ul>
       </nav>
     </section>
diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js
index de4b6d0..e146a8e 100644
--- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js
+++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js
@@ -19,6 +19,7 @@
   const AdapterPage = adapter_page.AdapterPage;
   const DeviceDetailsPage = device_details_page.DeviceDetailsPage;
   const DevicesPage = devices_page.DevicesPage;
+  const DebugLogPage = debug_log_page.DebugLogPage;
   const PageManager = cr.ui.pageManager.PageManager;
   const Snackbar = snackbar.Snackbar;
   const SnackbarType = snackbar.SnackbarType;
@@ -29,6 +30,8 @@
   let adapterPage = null;
   /** @type {devices_page.DevicesPage} */
   let devicesPage = null;
+  /** @type {debug_log_page.DebugLogPage} */
+  let debugLogPage = null;
 
   /** @type {bluetooth.mojom.DiscoverySessionRemote} */
   let discoverySession = null;
@@ -36,6 +39,9 @@
   /** @type {boolean} */
   let userRequestedScanStop = false;
 
+  /** @type {!mojom.BluetoothInternalsHandlerRemote} */
+  const bluetoothInternalsHandler = mojom.BluetoothInternalsHandler.getRemote();
+
   /**
    * Observer for page changes. Used to update page title header.
    * @constructor
@@ -258,6 +264,8 @@
     PageManager.register(devicesPage);
     adapterPage = new AdapterPage();
     PageManager.register(adapterPage);
+    debugLogPage = new DebugLogPage(bluetoothInternalsHandler);
+    PageManager.register(debugLogPage);
 
     // Set up hash-based navigation.
     window.addEventListener('hashchange', function() {
diff --git a/chrome/browser/resources/bluetooth_internals/debug_log_page.js b/chrome/browser/resources/bluetooth_internals/debug_log_page.js
new file mode 100644
index 0000000..e300cbf
--- /dev/null
+++ b/chrome/browser/resources/bluetooth_internals/debug_log_page.js
@@ -0,0 +1,67 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * Javascript for DebugLogPage, served from chrome://bluetooth-internals/.
+ */
+cr.define('debug_log_page', function() {
+  /** @const {string} */
+  const LOGS_NOT_SUPPORTED_STRING = 'Debug logs not supported';
+
+  /**
+   * Page that allows user to enable/disable debug logs.
+   */
+  class DebugLogPage extends cr.ui.pageManager.Page {
+    /**
+     * @param {!mojom.BluetoothInternalsHandlerRemote} bluetoothInternalsHandler
+     */
+    constructor(bluetoothInternalsHandler) {
+      super('debug', 'Debug Logs', 'debug');
+
+      /**
+       * @private {?mojom.DebugLogsChangeHandlerRemote}
+       */
+      this.debugLogsChangeHandler_ = null;
+
+      /** @private {?CrToggleElement} */
+      this.toggleElement_ = null;
+
+      /** @private {!HTMLDivElement} */
+      this.debugContainer_ =
+          /** @type {!HTMLDivElement} */ ($('debug-container'));
+
+      bluetoothInternalsHandler.getDebugLogsChangeHandler().then((params) => {
+        if (params.handler) {
+          this.setUpToggle(params.handler, params.initialToggleValue);
+        } else {
+          this.debugContainer_.textContent = LOGS_NOT_SUPPORTED_STRING;
+        }
+      });
+    }
+
+    /**
+     * @param {!mojom.DebugLogsChangeHandlerRemote} handler
+     * @param {boolean} initialToggleValue
+     */
+    setUpToggle(handler, initialToggleValue) {
+      this.debugLogsChangeHandler_ = handler;
+
+      this.toggleElement_ =
+          /** @type {!CrToggleElement} */ (document.createElement('cr-toggle'));
+      this.toggleElement_.checked = initialToggleValue;
+      this.toggleElement_.addEventListener(
+          'change', this.onToggleChange.bind(this));
+      this.debugContainer_.appendChild(this.toggleElement_);
+    }
+
+    onToggleChange() {
+      this.debugLogsChangeHandler_.changeDebugLogsState(
+          this.toggleElement_.checked);
+    }
+  }
+
+  return {
+    DebugLogPage: DebugLogPage,
+  };
+});
diff --git a/chrome/browser/resources/bluetooth_internals/resources.grd b/chrome/browser/resources/bluetooth_internals/resources.grd
index 786dc15..8ea0c93 100644
--- a/chrome/browser/resources/bluetooth_internals/resources.grd
+++ b/chrome/browser/resources/bluetooth_internals/resources.grd
@@ -29,6 +29,10 @@
                file="adapter_page.js"
                type="BINDATA"
                compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEBUG_LOG_PAGE_JS"
+               file="debug_log_page.js"
+               type="BINDATA"
+               compress="gzip" />
       <include name="IDR_BLUETOOTH_INTERNALS_CHARACTERISTIC_LIST_JS"
                file="characteristic_list.js"
                type="BINDATA"
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fil.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fil.xtb
index faf616d..6da0425 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_fil.xtb
@@ -19,6 +19,7 @@
 <translation id="2501953888035679275">Kumuha ng mga larawan at mag-record ng mga video gamit ang iyong camera.</translation>
 <translation id="2549985041256363841">Simulang mag-record</translation>
 <translation id="2599796128805996109">Camera sa likod</translation>
+<translation id="2912439424121107408">Hindi sinusuportahan sa device na ito ang Expert mode</translation>
 <translation id="2968794441791257519">Ililipat sa folder na Mga Download ang mga larawan at video na kinunan gamit ang camera. Maa-access mo ang mga ito sa Mga File.
 
         Magkakaroon ng access sa iyong mga larawan at video ang mga app na may mga pahintulot sa storage.</translation>
@@ -41,10 +42,12 @@
         Pakitingnan kung maayos na nakakonekta ang camera.</translation>
 <translation id="5152121255775685072">Pumunta sa gallery</translation>
 <translation id="5671277269877808209">Parisukat</translation>
+<translation id="5775960006311140197">Expert mode</translation>
 <translation id="5869546221129391014">Grid</translation>
 <translation id="6040143037577758943">Isara</translation>
 <translation id="6073451960410192870">Ihinto ang pag-record</translation>
 <translation id="6165508094623778733">Matuto pa</translation>
+<translation id="6197807149213783179">I-save ang metadata</translation>
 <translation id="6233780560267770709">3 by 3</translation>
 <translation id="6243827288366940320">Golden ratio</translation>
 <translation id="6248749904681914629">External na camera</translation>
@@ -66,6 +69,7 @@
 <translation id="8261506727792406068">I-delete</translation>
 <translation id="8428213095426709021">Mga Setting</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8732462232047530626">I-preview ang metadata</translation>
 <translation id="8815966864175525708">Lumipat para kumuha ng portrait na larawan</translation>
 <translation id="8870695351537079478">Hindi masimulan ang pag-record</translation>
 <translation id="9045155556724273246">10 segundo</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hi.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hi.xtb
index 7b3c633..b15bce9 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_hi.xtb
@@ -19,6 +19,7 @@
 <translation id="2501953888035679275">अपने कैमरे से फ़ोटो खींचें और वीडियो रिकॉर्ड करें.</translation>
 <translation id="2549985041256363841">रिकॉर्ड करना शुरू करें</translation>
 <translation id="2599796128805996109">पीछे वाला कैमरा</translation>
+<translation id="2912439424121107408">इस डिवाइस पर एक्सपर्ट मोड काम नहीं करता</translation>
 <translation id="2968794441791257519">कैमरे से ली गई फ़ोटो और वीडियो को 'डाउनलोड' फ़ोल्डर में ले जाया जाएगा. आप उन्हें फ़ाइल में जाकर ऐक्सेस कर सकते हैं.
 
         मेमोरी की अनुमतियों वाले ऐप्लिकेशन आपकी फ़ोटो और वीडियो ऐक्सेस कर पाएंगे.</translation>
@@ -41,10 +42,12 @@
         कृपया देखें कि कैमरा ठीक तरह से कनेक्ट है या नहीं.</translation>
 <translation id="5152121255775685072">गैलरी में जाएं</translation>
 <translation id="5671277269877808209">वर्ग</translation>
+<translation id="5775960006311140197">एक्सपर्ट मोड</translation>
 <translation id="5869546221129391014">ग्रिड</translation>
 <translation id="6040143037577758943">बंद करें</translation>
 <translation id="6073451960410192870">रिकॉर्डिंग बंद करें</translation>
 <translation id="6165508094623778733">ज़्यादा जानें</translation>
+<translation id="6197807149213783179">मेटाडेटा सेव करें</translation>
 <translation id="6233780560267770709">3 गुणा 3</translation>
 <translation id="6243827288366940320">सबसे अच्छा अनुपात</translation>
 <translation id="6248749904681914629">बाहरी कैमरा</translation>
@@ -66,6 +69,7 @@
 <translation id="8261506727792406068">मिटाएं</translation>
 <translation id="8428213095426709021">सेटिंग</translation>
 <translation id="8687491812650032292">एचडी <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8732462232047530626">मेटाडेटा की झलक देखें</translation>
 <translation id="8815966864175525708">पोर्ट्रेट फ़ोटो खींचने के लिए स्विच करें</translation>
 <translation id="8870695351537079478">रिकॉर्डिंग शुरू नहीं की जा सकी</translation>
 <translation id="9045155556724273246">10 सेकंड</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ko.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ko.xtb
index 41a7016..1bc8507d 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ko.xtb
@@ -19,6 +19,7 @@
 <translation id="2501953888035679275">카메라로 사진을 찍고 동영상을 녹화합니다.</translation>
 <translation id="2549985041256363841">녹화 시작</translation>
 <translation id="2599796128805996109">후면 카메라</translation>
+<translation id="2912439424121107408">이 기기에서는 전문가 모드가 지원되지 않습니다.</translation>
 <translation id="2968794441791257519">카메라로 촬영된 사진 및 동영상은 다운로드 폴더로 이동됩니다. 파일 앱에서 이러한 사진 및 동영상에 액세스할 수 있습니다.
 
         저장용량 권한이 있는 앱은 사진 및 동영상에 액세스할 수 있습니다.</translation>
@@ -41,10 +42,12 @@
         카메라가 제대로 연결되어 있는지 확인하세요.</translation>
 <translation id="5152121255775685072">갤러리로 이동</translation>
 <translation id="5671277269877808209">정사각형</translation>
+<translation id="5775960006311140197">전문가 모드</translation>
 <translation id="5869546221129391014">격자</translation>
 <translation id="6040143037577758943">닫기</translation>
 <translation id="6073451960410192870">녹화 중지</translation>
 <translation id="6165508094623778733">자세히 알아보기</translation>
+<translation id="6197807149213783179">메타데이터 저장</translation>
 <translation id="6233780560267770709">3x3</translation>
 <translation id="6243827288366940320">황금 비율</translation>
 <translation id="6248749904681914629">외장 카메라</translation>
@@ -66,6 +69,7 @@
 <translation id="8261506727792406068">삭제</translation>
 <translation id="8428213095426709021">설정</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p(<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8732462232047530626">메타데이터 미리보기</translation>
 <translation id="8815966864175525708">세로 모드 사진 촬영으로 전환</translation>
 <translation id="8870695351537079478">녹화를 시작할 수 없습니다.</translation>
 <translation id="9045155556724273246">10초</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
index 79df6c86..f55151c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -233,6 +233,7 @@
 <translation id="27527859628328957">Lumaktaw sa susunod na napo-focus na item</translation>
 <translation id="2770781857296573485">Pumasok sa pag-explore ng pangkat</translation>
 <translation id="2777845298774924149">Lumabas</translation>
+<translation id="2783001728278437613">{COUNT,plural, =1{+#}one{+#}other{+#}}</translation>
 <translation id="2784959586797362050">Gaya ng nakasanayan, maaari kang direktang magpadala ng feedback sa amin sa pamamagitan ng pagpindot sa Paghahanap+a pagkatapos ay i. Nasasabik kaming may marinig mula sa iyo.</translation>
 <translation id="2800204403141299078">Wala nang mga naiibang elemento.</translation>
 <translation id="2800780099804980316">Walang nakaraang heading sa antas 1.</translation>
@@ -715,6 +716,7 @@
 <translation id="5956928062748260866">Dialog</translation>
 <translation id="5963413905009737549">Seksyon</translation>
 <translation id="5968607524793740041">Ipakita ang menu ng konteksto</translation>
+<translation id="597121107011153418">{COUNT,plural, =1{may # item}one{may # item}other{may # na item}}</translation>
 <translation id="5981446804259161541">Light Cyan</translation>
 <translation id="5983179082906765664">Paramihin ang granularity ng nabigasyon</translation>
 <translation id="5992285135956208197">Dokumento ng graphics</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
index 3b9d24b..785f337 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -233,6 +233,7 @@
 <translation id="27527859628328957">अगले फ़ोकस करने लायक आइटम पर जंप करें</translation>
 <translation id="2770781857296573485">समूह अन्‍वेषण डालें</translation>
 <translation id="2777845298774924149">बाहर हो गया</translation>
+<translation id="2783001728278437613">{COUNT,plural, =1{+#}one{+#}other{+#}}</translation>
 <translation id="2784959586797362050">आप हमेशा की तरह Search+a और उसके बाद i दबाकर हमें सीधे फ़ीडबैक भेज सकते हैं. हम आपके विचार जानने के लिए बेताब हैं.</translation>
 <translation id="2800204403141299078">कोई और भिन्‍न तत्‍व नहीं.</translation>
 <translation id="2800780099804980316">कोई पिछला लेवल 1 का शीर्षक नहीं.</translation>
@@ -715,6 +716,7 @@
 <translation id="5956928062748260866">डॉयलॉग</translation>
 <translation id="5963413905009737549">अनुभाग</translation>
 <translation id="5968607524793740041">संदर्भ मेन्यू दिखाएं</translation>
+<translation id="597121107011153418">{COUNT,plural, =1{# आइटम के साथ}one{# आइटम के साथ}other{# आइटम के साथ}}</translation>
 <translation id="5981446804259161541">हल्का हरा नीला</translation>
 <translation id="5983179082906765664">मार्गदर्शक विवरण का स्‍तर बढ़ाएं</translation>
 <translation id="5992285135956208197">ग्राफ़िक्स दस्तावेज़</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
index c7c68da..feae0fb 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -233,6 +233,7 @@
 <translation id="27527859628328957">다음 초점 가능 항목으로 이동</translation>
 <translation id="2770781857296573485">그룹 탐색 입력</translation>
 <translation id="2777845298774924149">종료함</translation>
+<translation id="2783001728278437613">{COUNT,plural, =1{#개 이상}other{#개 이상}}</translation>
 <translation id="2784959586797362050">언제나 그렇듯 Search+a를 누른 다음 i를 누르면 바로 Google에 의견을 보낼 수 있습니다. 여러분의 의견을 기다립니다.</translation>
 <translation id="2800204403141299078">더 이상 다른 요소가 없습니다.</translation>
 <translation id="2800780099804980316">이전 수준 1 제목이 없습니다.</translation>
@@ -715,6 +716,7 @@
 <translation id="5956928062748260866">대화상자</translation>
 <translation id="5963413905009737549">섹션</translation>
 <translation id="5968607524793740041">컨텍스트 메뉴 표시</translation>
+<translation id="597121107011153418">{COUNT,plural, =1{#개 항목 포함}other{#개 항목 포함}}</translation>
 <translation id="5981446804259161541">라이트 시안</translation>
 <translation id="5983179082906765664">탐색 세밀도 높이기</translation>
 <translation id="5992285135956208197">그래픽 문서</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
index 454fbae..96389d02 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -843,9 +843,9 @@
 <translation id="7039555289296502784">ऑलिव्ह हिरवा</translation>
 <translation id="7041173719775863268">निवड समाप्त करा</translation>
 <translation id="7043850226734279132">गडद खाकी</translation>
-<translation id="7048792632163898198">पुढील काही शॉर्टकट ChromeVox कमांड नाहीत, परंतु तरीही Chrome मधून बरेच काही मिळवण्यासाठी ते खूप उपयुक्त आहेत.
-बटणे आणि लिंक यांसारख्या कृती करण्यायोग्य आयटममधून पुढे नेव्हिगेट करण्यासाठी, Tab की दाबा. मागे नेव्हिगेट करण्यासाठी, Shift+Tab दाबा.
-Chrome ब्राउझरच्या, ऑम्निबॉक्स देखील म्हणवल्या जाणाऱ्या, अॅड्रेस बॉक्समध्ये अॅक्सेस करण्यासाठी Control + L दाबा.
+<translation id="7048792632163898198">पुढील काही शॉर्टकट ChromeVox कमांड नाहीत, परंतु तरीही Chromeमधून बरेच काही मिळवण्यासाठी ते खूप उपयुक्त आहेत.
+बटणे आणि लिंक यांसारख्या कृती करण्यायोग्य आयटममधून पुढे नेव्हिगेट करण्यासाठी, Tab की, दाबा. मागे नेव्हिगेट करण्यासाठी, Shift+Tab दाबा.
+Chrome ब्राउझरच्या, ऑम्निबॉक्स असेही म्हणवल्या जाणाऱ्या, अॅड्रेस बॉक्समध्ये अॅक्सेस करण्यासाठी Control + L दाबा.
 नवीन टॅब उघडण्यासाठी आणि त्यामध्ये आपोआप जाण्यासाठी, Control+T दाबा. तुमचा कर्सर ऑम्निबॉक्समध्ये असेल.
 टॅब बंद करण्यासाठी, Control+W दाबा.
 उघडलेल्या टॅबमध्ये पुढे जाण्यासाठी, Control+Tab वापरा.
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.html b/chrome/browser/resources/chromeos/network_ui/network_ui.html
index 6303311..33c153a5 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.html
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.html
@@ -100,6 +100,18 @@
     </tr>
   </table>
 
+  <h3>$i18n{ethernetEapNetworkLabel}</h3>
+  <table id="ethernet-eap-state-table" class="state-table">
+    <tr class="state-table-header">
+      <td></td>
+      <td></td>
+      <td>GUID</td>
+      <td>Name</td>
+      <td>Type</td>
+      <td>ONC Source</td>
+    </tr>
+  </table>
+
   <h3>$i18n{favoriteNetworksLabel}</h3>
   <table id="favorite-state-table" class="state-table">
     <tr class="state-table-header">
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js
index c126441..25e9371b 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -89,6 +89,22 @@
   };
 
   /**
+   * @param {string} key
+   * @param {number|string|undefined} value
+   * @return {string}
+   */
+  const getOncTypeString = function(key, value) {
+    if (value === undefined) {
+      return '';
+    }
+    if (key == 'type' && value == 'etherneteap') {
+      // Special case, not in production UI.
+      return 'EthernetEAP';
+    }
+    return /** @type {string}*/ (OncMojo.getTypeString(key, value));
+  };
+
+  /**
    * Returns the ONC data property for |state| associated with a key. Used
    * to access properties in the state by |key| which may may refer to a
    * nested property, e.g. 'WiFi.Security'. If any part of a nested key is
@@ -109,7 +125,7 @@
         return undefined;
     }
     const k = keys.shift();
-    return OncMojo.getTypeString(k, dict[k]);
+    return getOncTypeString(k, dict[k]);
   };
 
   /**
@@ -238,7 +254,7 @@
    * @return {string} A valid HTMLElement id.
    */
   const idFromType = function(type) {
-    return idFromTypeString(OncMojo.getNetworkTypeString(type));
+    return idFromTypeString(getOncTypeString('type', type));
   };
 
   /**
@@ -268,6 +284,12 @@
     createStateTable('device-state-table', DEVICE_STATE_FIELDS, states);
   };
 
+  /** @return {string} */
+  const getSelectedFormat = function() {
+    const formatSelect = $('get-property-format');
+    return formatSelect.options[formatSelect.selectedIndex].value;
+  };
+
   /**
    * Toggles the button state and add or remove a row displaying the complete
    * state information for a row.
@@ -309,12 +331,10 @@
     detailCell.className = 'state-table-expanded-cell';
     detailCell.colSpan = baseRow.childNodes.length - 1;
     expandedRow.appendChild(detailCell);
-    const selected = $('get-property-format').selectedIndex;
-    const selectedId = $('get-property-format').options[selected].value;
     if (guid)
-      handleNetworkDetail(guid, selectedId, detailCell);
+      handleNetworkDetail(guid, getSelectedFormat(), detailCell);
     else
-      handleDeviceDetail(state, selectedId, detailCell);
+      handleDeviceDetail(state, getSelectedFormat(), detailCell);
     return expandedRow;
   };
 
@@ -450,6 +470,19 @@
   };
 
   /**
+   * Callback invoked by Chrome after a getShillEthernetEAP call.
+   * @param {?Object} state The requested Shill properties. Will be null if no
+   *     EAP properties exist.
+   */
+  const getShillEthernetEAPResult = function(state) {
+    const states = [];
+    if (state) {
+      states.push(state);
+    }
+    createStateTable('ethernet-eap-state-table', FAVORITE_STATE_FIELDS, states);
+  };
+
+  /**
    * Callback invoked by Chrome after a openCellularActivationUi call.
    * @param {boolean} didOpenActivationUi Whether the activation UI was actually
    *     opened. If this value is false, it means that no cellular network was
@@ -500,6 +533,11 @@
     networkConfig.getDeviceStateList().then((responseParams) => {
       onDeviceStatesReceived(responseParams.result);
     });
+
+    // Only request EthernetEAP properties when the 'shill' format is selected.
+    if (getSelectedFormat() == 'shill') {
+      chrome.send('getShillEthernetEAP');
+    }
   };
 
   /**
@@ -570,6 +608,7 @@
     $('cellular-activation-button').onclick = openCellularActivationUi;
     $('add-new-wifi-button').onclick = showAddNewWifi;
     $('refresh').onclick = requestNetworks;
+    $('get-property-format').onchange = requestNetworks;
     init();
     requestNetworks();
     requestGlobalPolicy();
@@ -582,6 +621,7 @@
   return {
     getShillNetworkPropertiesResult: getShillNetworkPropertiesResult,
     getShillDevicePropertiesResult: getShillDevicePropertiesResult,
+    getShillEthernetEAPResult: getShillEthernetEAPResult,
     openCellularActivationUiResult: openCellularActivationUiResult
   };
 })();
diff --git a/chrome/browser/resources/print_preview/ui/sidebar.html b/chrome/browser/resources/print_preview/ui/sidebar.html
index 7e57392..b2270abe 100644
--- a/chrome/browser/resources/print_preview/ui/sidebar.html
+++ b/chrome/browser/resources/print_preview/ui/sidebar.html
@@ -48,6 +48,11 @@
         flex-direction: column;
       }
 
+      :host([new-print-preview-layout]) {
+        border-inline-end: none;
+        border-inline-start: var(--print-preview-settings-border);
+      }
+
       @media (prefers-color-scheme: dark) {
         :host {
           background-color: rgba(255, 255, 255, .04);
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_permission_view.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_permission_view.js
index 7a403ba..73934a89 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_permission_view.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_permission_view.js
@@ -30,11 +30,13 @@
   },
 
   /**
+   * @param {App} app
+   * @return {?string}
    * @private
    */
   getSelectedRouteId_: function(app) {
     if (!app) {
-      return;
+      return null;
     }
 
     const selectedAppType = app.type;
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js
index 4440bacf..43ed6509 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js
@@ -101,13 +101,19 @@
   },
 
   /**
-   * @param {string} newRouteId
+   * @param {?string} newRouteId
    */
   onRouteChanged_: function(newRouteId) {
     if (!this.instance_) {
       return;
     }
 
+    if (newRouteId === null) {
+      this.parentNode.removeChild(this.selectedChild_);
+      this.selectedChild_ = null;
+      return;
+    }
+
     const newSelectedChild = this.children_[newRouteId];
     assert(
         newSelectedChild,
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/reducers.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/reducers.js
index 3b9de903..61cc5eb8 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/reducers.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/reducers.js
@@ -31,7 +31,11 @@
    * @return {AppMap}
    */
   AppState.changeApp = function(apps, action) {
-    assert(apps[action.app.id]);
+    // If the app doesn't exist, that means that the app that has been changed
+    // does not need to be shown in App Management.
+    if (!apps[action.app.id]) {
+      return apps;
+    }
 
     const changedAppEntry = {};
     changedAppEntry[action.app.id] = action.app;
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
index 595328c..1015245 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
@@ -44,6 +44,9 @@
    * @private
    */
   iconUrlFromId_: function(app) {
+    if (!app) {
+      return '';
+    }
     return app_management.util.getAppIcon(app);
   },
 
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index d6a6eae3..da883086 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -465,8 +465,11 @@
         loadTimeData.getBoolean('showCrostini')) {
       r.CROSTINI = r.BASIC.createSection('/crostini', 'crostini');
       r.CROSTINI_DETAILS = r.CROSTINI.createChild('/crostini/details');
-      r.CROSTINI_EXPORT_IMPORT =
-          r.CROSTINI_DETAILS.createChild('/crostini/exportImport');
+      if (loadTimeData.valueExists('showCrostiniExportImport') &&
+          loadTimeData.getBoolean('showCrostiniExportImport')) {
+        r.CROSTINI_EXPORT_IMPORT =
+            r.CROSTINI_DETAILS.createChild('/crostini/exportImport');
+      }
       r.CROSTINI_SHARED_PATHS =
           r.CROSTINI_DETAILS.createChild('/crostini/sharedPaths');
       r.CROSTINI_SHARED_USB_DEVICES =
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
index b16da94c..5afb23a0 100644
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -159,6 +159,8 @@
         "download_protection/download_protection_service.h",
         "download_protection/download_protection_util.cc",
         "download_protection/download_protection_util.h",
+        "download_protection/download_reporter.cc",
+        "download_protection/download_reporter.h",
         "download_protection/download_url_sb_client.cc",
         "download_protection/download_url_sb_client.h",
         "download_protection/file_analyzer.cc",
diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
index 99c5a55..99470455 100644
--- a/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
@@ -257,12 +257,13 @@
     if (!profile)
       return;
 
+    const std::string& raw_digest_sha256 = item_->GetHash();
     auto request = std::make_unique<DownloadItemRequest>(
-        item_,
-        base::BindOnce(
-            &MaybeReportDownloadDeepScanningVerdict, profile, item_->GetURL(),
-            item_->GetTargetFilePath().AsUTF8Unsafe(),
-            base::HexEncode(item_->GetHash().data(), item_->GetHash().size())));
+        item_, base::BindOnce(&MaybeReportDownloadDeepScanningVerdict, profile,
+                              item_->GetURL(),
+                              item_->GetTargetFilePath().AsUTF8Unsafe(),
+                              base::HexEncode(raw_digest_sha256.data(),
+                                              raw_digest_sha256.size())));
 
     if (upload_for_dlp) {
       DlpDeepScanningClientRequest dlp_request;
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.h b/chrome/browser/safe_browsing/download_protection/download_protection_service.h
index 5c26099..4329e62 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service.h
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.h
@@ -26,6 +26,7 @@
 #include "chrome/browser/download/download_commands.h"
 #include "chrome/browser/safe_browsing/download_protection/binary_upload_service.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
+#include "chrome/browser/safe_browsing/download_protection/download_reporter.h"
 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h"
 #include "chrome/browser/safe_browsing/services_delegate.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
@@ -305,6 +306,9 @@
   // Rate of whitelisted downloads we sample to send out download ping.
   double whitelist_sample_rate_;
 
+  // DownloadReporter to send real time reports for dangerous download events.
+  DownloadReporter download_reporter_;
+
   DISALLOW_COPY_AND_ASSIGN(DownloadProtectionService);
 };
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection/download_reporter.cc b/chrome/browser/safe_browsing/download_protection/download_reporter.cc
new file mode 100644
index 0000000..e59ced2
--- /dev/null
+++ b/chrome/browser/safe_browsing/download_protection/download_reporter.cc
@@ -0,0 +1,170 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/safe_browsing/download_protection/download_reporter.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/download/simple_download_manager_coordinator_factory.h"
+#include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
+#include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/safe_browsing_service.h"
+#include "components/download/public/common/download_danger_type.h"
+#include "components/download/public/common/download_item.h"
+#include "components/download/public/common/simple_download_manager_coordinator.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/download_item_utils.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_service.h"
+
+namespace safe_browsing {
+
+namespace {
+
+bool DangerTypeIsDangerous(download::DownloadDangerType danger_type) {
+  return (danger_type == download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE ||
+          danger_type == download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL ||
+          danger_type == download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT ||
+          danger_type == download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT ||
+          danger_type == download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST ||
+          danger_type == download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED);
+}
+
+std::string DangerTypeToThreatType(download::DownloadDangerType danger_type) {
+  switch (danger_type) {
+    case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE:
+      return "DANGEROUS_FILE_TYPE";
+    case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
+      return "DANGEROUS_URL";
+    case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
+      return "DANGEROUS";
+    case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT:
+      return "UNCOMMON";
+    case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
+      return "DANGEROUS_HOST";
+    case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
+      return "POTENTIALLY_UNWANTED";
+    default:
+      // Expects to only be called with the dangerous threat types listed above.
+      NOTREACHED() << "Unexpected danger type: " << danger_type;
+      return "UNKNOWN";
+  }
+}
+
+void ReportDangerousDownloadWarning(download::DownloadItem* download) {
+  content::BrowserContext* browser_context =
+      content::DownloadItemUtils::GetBrowserContext(download);
+  Profile* profile = Profile::FromBrowserContext(browser_context);
+  if (profile) {
+    std::string raw_digest_sha256 = download->GetHash();
+    extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile)
+        ->OnDangerousDownloadWarning(
+            download->GetURL(), download->GetTargetFilePath().AsUTF8Unsafe(),
+            base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
+            DangerTypeToThreatType(download->GetDangerType()));
+  }
+}
+
+void ReportDangerousDownloadWarningBypassed(
+    download::DownloadItem* download,
+    download::DownloadDangerType original_danger_type) {
+  content::BrowserContext* browser_context =
+      content::DownloadItemUtils::GetBrowserContext(download);
+  Profile* profile = Profile::FromBrowserContext(browser_context);
+  if (profile) {
+    std::string raw_digest_sha256 = download->GetHash();
+    extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile)
+        ->OnDangerousDownloadWarningBypassed(
+            download->GetURL(), download->GetTargetFilePath().AsUTF8Unsafe(),
+            base::HexEncode(raw_digest_sha256.data(), raw_digest_sha256.size()),
+            DangerTypeToThreatType(original_danger_type));
+  }
+}
+
+}  // namespace
+
+DownloadReporter::DownloadReporter() {
+  profiles_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED,
+                          content::NotificationService::AllSources());
+  profiles_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
+                          content::NotificationService::AllSources());
+}
+
+DownloadReporter::~DownloadReporter() {
+  profiles_registrar_.RemoveAll();
+
+  for (download::SimpleDownloadManagerCoordinator* coordinator :
+       observed_coordinators_) {
+    coordinator->RemoveObserver(this);
+  }
+
+  for (download::DownloadItem* download_item : observed_downloads_) {
+    download_item->RemoveObserver(this);
+  }
+}
+
+void DownloadReporter::Observe(int type,
+                               const content::NotificationSource& source,
+                               const content::NotificationDetails& details) {
+  switch (type) {
+    case chrome::NOTIFICATION_PROFILE_CREATED: {
+      DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+      Profile* profile = content::Source<Profile>(source).ptr();
+      download::SimpleDownloadManagerCoordinator* coordinator =
+          SimpleDownloadManagerCoordinatorFactory::GetForKey(
+              profile->GetProfileKey());
+      coordinator->AddObserver(this);
+      observed_coordinators_.insert(coordinator);
+      break;
+    }
+    case chrome::NOTIFICATION_PROFILE_DESTROYED: {
+      DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+      Profile* profile = content::Source<Profile>(source).ptr();
+      download::SimpleDownloadManagerCoordinator* coordinator =
+          SimpleDownloadManagerCoordinatorFactory::GetForKey(
+              profile->GetProfileKey());
+      coordinator->RemoveObserver(this);
+      observed_coordinators_.erase(coordinator);
+      break;
+    }
+    default:
+      NOTREACHED();
+  }
+}
+
+void DownloadReporter::OnDownloadCreated(download::DownloadItem* download) {
+  danger_types_[download] = download->GetDangerType();
+  download->AddObserver(this);
+  observed_downloads_.insert(download);
+}
+
+void DownloadReporter::OnDownloadDestroyed(download::DownloadItem* download) {
+  download->RemoveObserver(this);
+  danger_types_.erase(download);
+  observed_downloads_.erase(download);
+}
+
+void DownloadReporter::OnDownloadUpdated(download::DownloadItem* download) {
+  // If the update isn't a change in danger type, we can ignore it.
+  if (danger_types_[download] == download->GetDangerType())
+    return;
+
+  download::DownloadDangerType old_danger_type = danger_types_[download];
+  download::DownloadDangerType current_danger_type = download->GetDangerType();
+
+  if (!DangerTypeIsDangerous(old_danger_type) &&
+      DangerTypeIsDangerous(current_danger_type)) {
+    ReportDangerousDownloadWarning(download);
+  }
+
+  if (DangerTypeIsDangerous(old_danger_type) &&
+      current_danger_type == download::DOWNLOAD_DANGER_TYPE_USER_VALIDATED) {
+    ReportDangerousDownloadWarningBypassed(download, old_danger_type);
+  }
+
+  danger_types_[download] = current_danger_type;
+}
+
+}  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection/download_reporter.h b/chrome/browser/safe_browsing/download_protection/download_reporter.h
new file mode 100644
index 0000000..ab2bb7b
--- /dev/null
+++ b/chrome/browser/safe_browsing/download_protection/download_reporter.h
@@ -0,0 +1,47 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_PROTECTION_DOWNLOAD_REPORTER_H_
+#define CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_PROTECTION_DOWNLOAD_REPORTER_H_
+
+#include "components/download/public/common/download_item.h"
+#include "components/download/public/common/simple_download_manager_coordinator.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+
+namespace safe_browsing {
+
+// This class is responsible for observing download events and reporting them as
+// appropriate.
+class DownloadReporter
+    : public download::DownloadItem::Observer,
+      public download::SimpleDownloadManagerCoordinator::Observer,
+      public content::NotificationObserver {
+ public:
+  DownloadReporter();
+  ~DownloadReporter() override;
+
+  // NotificationObserver implementation:
+  void Observe(int type,
+               const content::NotificationSource& source,
+               const content::NotificationDetails& details) override;
+
+  // SimpleDownloadManagerCoordinator::Observer implementation:
+  void OnDownloadCreated(download::DownloadItem* download) override;
+
+  // DownloadItem::Observer implementation:
+  void OnDownloadDestroyed(download::DownloadItem* download) override;
+  void OnDownloadUpdated(download::DownloadItem* download) override;
+
+ private:
+  content::NotificationRegistrar profiles_registrar_;
+  base::flat_map<download::DownloadItem*, download::DownloadDangerType>
+      danger_types_;
+  std::set<download::SimpleDownloadManagerCoordinator*> observed_coordinators_;
+  std::set<download::DownloadItem*> observed_downloads_;
+};
+
+}  // namespace safe_browsing
+
+#endif  // CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_PROTECTION_DOWNLOAD_REPORTER_H_
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 052db221..6222bb2 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -961,7 +961,6 @@
       "intent_picker_tab_helper.h",
       "layout_constants.cc",
       "layout_constants.h",
-      "location_bar/location_bar.cc",
       "location_bar/location_bar.h",
       "managed_ui.cc",
       "managed_ui.h",
@@ -1185,8 +1184,6 @@
       "webui/app_management/app_management_page_handler.h",
       "webui/app_management/app_management_shelf_delegate_chromeos.cc",
       "webui/app_management/app_management_shelf_delegate_chromeos.h",
-      "webui/app_management/app_management_ui.cc",
-      "webui/app_management/app_management_ui.h",
       "webui/bookmarks/bookmarks_message_handler.cc",
       "webui/bookmarks/bookmarks_message_handler.h",
       "webui/bookmarks/bookmarks_ui.cc",
@@ -1644,6 +1641,8 @@
       "webui/chromeos/cellular_setup/mobile_setup_ui.h",
       "webui/chromeos/certificate_manager_dialog_ui.cc",
       "webui/chromeos/certificate_manager_dialog_ui.h",
+      "webui/chromeos/crostini_installer/crostini_installer_dialog.cc",
+      "webui/chromeos/crostini_installer/crostini_installer_dialog.h",
       "webui/chromeos/crostini_installer/crostini_installer_page_handler.cc",
       "webui/chromeos/crostini_installer/crostini_installer_page_handler.h",
       "webui/chromeos/crostini_installer/crostini_installer_ui.cc",
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
index 2ea2d90..e4f7533 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -24,6 +24,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_command_line.h"
 #include "base/values.h"
+#include "build/build_config.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_support_host.h"
@@ -2166,7 +2167,13 @@
   EXPECT_TRUE(app_instance()->icon_requests().empty());
 }
 
-TEST_P(ArcAppModelIconTest, IconLoadNonSupportedScales) {
+// TODO(crbug.com/1005069) Disabled on Chrome OS due to flake
+#if defined(OS_CHROMEOS)
+#define MAYBE_IconLoadNonSupportedScales DISABLED_IconLoadNonSupportedScales
+#else
+#define MAYBE_IconLoadNonSupportedScales IconLoadNonSupportedScales
+#endif
+TEST_P(ArcAppModelIconTest, MAYBE_IconLoadNonSupportedScales) {
   ArcAppListPrefs* const prefs = ArcAppListPrefs::Get(profile_.get());
   ASSERT_TRUE(prefs);
 
diff --git a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
index 948d34a..82ba484 100644
--- a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
+++ b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
@@ -28,7 +28,6 @@
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
 #include "chrome/browser/chromeos/file_manager/open_util.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
 #include "chrome/browser/download/download_prefs.h"
@@ -41,7 +40,6 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
 #include "chromeos/login/login_state/login_state.h"
-#include "components/drive/chromeos/file_system_interface.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -121,19 +119,6 @@
                  base::BindOnce(&DecodeFileAndCopyToClipboard, png_data));
 }
 
-void ReadFileAndCopyToClipboardDrive(
-    drive::FileError error,
-    const base::FilePath& file_path,
-    std::unique_ptr<drive::ResourceEntry> entry) {
-  if (error != drive::FILE_ERROR_OK) {
-    LOG(ERROR) << "Failed to read the screenshot path on drive: "
-               << drive::FileErrorToString(error);
-    return;
-  }
-  base::PostTask(FROM_HERE, kBlockingTaskTraits,
-                 base::BindOnce(&ReadFileAndCopyToClipboardLocal, file_path));
-}
-
 // Delegate for a notification. This class has two roles: to implement callback
 // methods for notification, and to provide an identity of the associated
 // notification.
@@ -167,13 +152,6 @@
       case BUTTON_COPY_TO_CLIPBOARD: {
         // To avoid keeping the screenshot image in memory, re-read the
         // screenshot file and copy it to the clipboard.
-        if (drive::util::IsUnderDriveMountPoint(screenshot_path_)) {
-          drive::FileSystemInterface* file_system =
-              drive::util::GetFileSystemByProfile(profile_);
-          file_system->GetFile(drive::util::ExtractDrivePath(screenshot_path_),
-                               base::Bind(&ReadFileAndCopyToClipboardDrive));
-          return;
-        }
         base::PostTask(
             FROM_HERE, kBlockingTaskTraits,
             base::BindOnce(&ReadFileAndCopyToClipboardLocal, screenshot_path_));
@@ -229,36 +207,6 @@
   }
 }
 
-void PrepareWritableFileCallback(
-    const ChromeScreenshotGrabber::FileCallback& callback,
-    drive::FileError error,
-    const base::FilePath& local_path) {
-  callback.Run(error == drive::FILE_ERROR_OK
-                   ? ScreenshotFileResult::SUCCESS
-                   : ScreenshotFileResult::CREATE_FAILED,
-               local_path);
-}
-
-void EnsureDirectoryExistsCallback(
-    const ChromeScreenshotGrabber::FileCallback& callback,
-    Profile* profile,
-    const base::FilePath& path,
-    drive::FileError error) {
-  // It is okay to fail with FILE_ERROR_EXISTS since anyway the directory
-  // of the target file exists.
-  if (error == drive::FILE_ERROR_OK || error == drive::FILE_ERROR_EXISTS) {
-    drive::util::PrepareWritableFileAndRun(
-        profile, path, base::Bind(&PrepareWritableFileCallback, callback));
-  } else {
-    LOG(ERROR) << "Failed to ensure the existence of the specified directory "
-               << "in Google Drive: " << error;
-    base::PostTask(
-        FROM_HERE, kBlockingTaskTraits,
-        base::BindOnce(callback, ScreenshotFileResult::CHECK_DIR_FAILED,
-                       base::FilePath()));
-  }
-}
-
 bool ShouldUse24HourClock() {
   Profile* profile = ProfileManager::GetActiveUserProfile();
   if (profile)
@@ -498,14 +446,6 @@
 void ChromeScreenshotGrabber::PrepareFileAndRunOnBlockingPool(
     const base::FilePath& path,
     const FileCallback& callback) {
-  Profile* profile = ProfileManager::GetActiveUserProfile();
-  if (drive::util::IsUnderDriveMountPoint(path)) {
-    drive::util::EnsureDirectoryExists(
-        profile, path.DirName(),
-        base::Bind(&EnsureDirectoryExistsCallback, callback, profile, path));
-    return;
-  }
-
   base::PostTask(FROM_HERE,
                  {base::ThreadPool(), base::MayBlock(),
                   base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
@@ -538,69 +478,23 @@
   SYSLOG(INFO) << "Screenshot taken";
 #endif
 
-  if (drive::util::IsUnderDriveMountPoint(screenshot_path)) {
-    drive::FileSystemInterface* file_system =
-        drive::util::GetFileSystemByProfile(GetProfile());
-    if (!file_system) {
-      LOG(ERROR) << "Failed to get file system of current profile";
-
-      base::PostTask(
-          FROM_HERE, {content::BrowserThread::UI},
-          base::BindOnce(
-              &ChromeScreenshotGrabber::OnReadScreenshotFileForPreviewCompleted,
-              weak_factory_.GetWeakPtr(), result, screenshot_path,
-              gfx::Image()));
-      return;
-    }
-    file_system->GetFile(
-        drive::util::ExtractDrivePath(screenshot_path),
-        base::BindRepeating(
-            &ChromeScreenshotGrabber::ReadScreenshotFileForPreviewDrive,
-            weak_factory_.GetWeakPtr(), screenshot_path));
-  } else {
-    base::PostTask(
-        FROM_HERE, {content::BrowserThread::UI},
-        base::BindOnce(
-            &ChromeScreenshotGrabber::ReadScreenshotFileForPreviewLocal,
-            weak_factory_.GetWeakPtr(), screenshot_path, screenshot_path));
-  }
+  base::PostTask(
+      FROM_HERE, {content::BrowserThread::UI},
+      base::BindOnce(&ChromeScreenshotGrabber::ReadScreenshotFileForPreview,
+                     weak_factory_.GetWeakPtr(), screenshot_path));
 }
 
-void ChromeScreenshotGrabber::ReadScreenshotFileForPreviewLocal(
-    const base::FilePath& screenshot_path,
-    const base::FilePath& screenshot_cache_path) {
+void ChromeScreenshotGrabber::ReadScreenshotFileForPreview(
+    const base::FilePath& screenshot_path) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   base::PostTaskAndReplyWithResult(
       FROM_HERE, kBlockingTaskTraits,
-      base::BindOnce(&ReadFileToString, screenshot_cache_path),
+      base::BindOnce(&ReadFileToString, screenshot_path),
       base::BindOnce(&ChromeScreenshotGrabber::DecodeScreenshotFileForPreview,
                      weak_factory_.GetWeakPtr(), screenshot_path));
 }
 
-void ChromeScreenshotGrabber::ReadScreenshotFileForPreviewDrive(
-    const base::FilePath& screenshot_path,
-    drive::FileError error,
-    const base::FilePath& screenshot_cache_path,
-    std::unique_ptr<drive::ResourceEntry> entry) {
-  if (error != drive::FILE_ERROR_OK) {
-    LOG(ERROR) << "Failed to read the screenshot path on drive: "
-               << drive::FileErrorToString(error);
-    base::PostTask(
-        FROM_HERE, {content::BrowserThread::UI},
-        base::BindOnce(
-            &ChromeScreenshotGrabber::OnReadScreenshotFileForPreviewCompleted,
-            weak_factory_.GetWeakPtr(), ScreenshotResult::SUCCESS,
-            screenshot_path, gfx::Image()));
-    return;
-  }
-  base::PostTask(
-      FROM_HERE, {content::BrowserThread::UI},
-      base::BindOnce(
-          &ChromeScreenshotGrabber::ReadScreenshotFileForPreviewLocal,
-          weak_factory_.GetWeakPtr(), screenshot_path, screenshot_cache_path));
-}
-
 void ChromeScreenshotGrabber::DecodeScreenshotFileForPreview(
     const base::FilePath& screenshot_path,
     std::string image_data) {
diff --git a/chrome/browser/ui/ash/chrome_screenshot_grabber.h b/chrome/browser/ui/ash/chrome_screenshot_grabber.h
index 6b803b9..859e5ea 100644
--- a/chrome/browser/ui/ash/chrome_screenshot_grabber.h
+++ b/chrome/browser/ui/ash/chrome_screenshot_grabber.h
@@ -13,8 +13,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "build/build_config.h"
-#include "components/drive/chromeos/file_system_interface.h"
-#include "components/drive/drive.pb.h"
 #include "ui/gfx/image/image.h"
 #include "ui/message_center/public/cpp/notification.h"
 #include "ui/snapshot/screenshot_grabber.h"
@@ -78,9 +76,7 @@
   friend class ChromeScreenshotGrabberBrowserTest;
   friend class policy::PolicyTest;
 
-  // Prepares a writable file for |path|. If |path| is a non-local path (i.e.
-  // Google drive) and it is supported this will create a local cached copy of
-  // the remote file and call the callback with the local path.
+  // Prepares a writable file for |path|.
   void PrepareFileAndRunOnBlockingPool(const base::FilePath& path,
                                        const FileCallback& callback);
 
@@ -88,32 +84,9 @@
   void OnScreenshotCompleted(ui::ScreenshotResult result,
                              const base::FilePath& screenshot_path);
 
-  // Callback method of FileSystemInterface::GetFile().
-  // Runs ReadScreenshotFileForPreviewLocal if successful. Otherwise, runs
-  // OnReadScreenshotFileForPreviewCompleted to show notification without
-  // screenshot preview.
-  // One way to try screenshot saved to Drive is to change the download
-  // directory from Settings > Downloads > Location.
-  //
-  // |screenshot_path| is screenshot path on Drive.
-  // Parameters after |screenshot_path| is set by GetFile().
-  // |screenshot_cache_path| is a local cache of remote |screenshot_path|.
-  void ReadScreenshotFileForPreviewDrive(
-      const base::FilePath& screenshot_path,
-      drive::FileError error,
-      const base::FilePath& screenshot_cache_path,
-      std::unique_ptr<drive::ResourceEntry> entry);
-
-  // Reads a screenshot file in |screenshot_cache_path|, and runs
+  // Reads a screenshot file in |screenshot_path|, and runs
   // DecodeScreenshotFileForPreview.
-  //
-  // |screenshot_path| and |screenshot_cache_path| are different when the
-  // screenshot is saved to Drive. Otherwise, they should be same.
-  // |screenshot_path| can be a Drive path while |screenshot_cache_path| is
-  // always a local path.
-  void ReadScreenshotFileForPreviewLocal(
-      const base::FilePath& screenshot_path,
-      const base::FilePath& screenshot_cache_path);
+  void ReadScreenshotFileForPreview(const base::FilePath& screenshot_path);
 
   // Decodes |image_data| and run OnScreenshotFileForPreviewDecoded.
   // Although |image_data| is originally generated by the screenshot grabber,
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 37d63ff..47bbeba 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -764,7 +764,6 @@
   // chrome://extensions is on the list because it redirects to
   // chrome://settings.
   return host != chrome::kChromeUIAppLauncherPageHost &&
-         host != chrome::kChromeUIAppManagementHost &&
          host != chrome::kChromeUISettingsHost &&
 #if defined(OS_CHROMEOS)
          host != chrome::kChromeUIOSSettingsHost &&
diff --git a/chrome/browser/ui/libgtkui/BUILD.gn b/chrome/browser/ui/libgtkui/BUILD.gn
index 7895f259..5b84af0 100644
--- a/chrome/browser/ui/libgtkui/BUILD.gn
+++ b/chrome/browser/ui/libgtkui/BUILD.gn
@@ -23,6 +23,8 @@
     "gtk_ui.h",
     "gtk_util.cc",
     "gtk_util.h",
+    "input_method_context_impl_gtk.cc",
+    "input_method_context_impl_gtk.h",
     "libgtkui_export.h",
     "menu_util.cc",
     "menu_util.h",
@@ -124,8 +126,6 @@
     sources += [
       "gtk_event_loop_x11.cc",
       "gtk_event_loop_x11.h",
-      "x11_input_method_context_impl_gtk.cc",
-      "x11_input_method_context_impl_gtk.h",
     ]
 
     deps += [
diff --git a/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.cc b/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.cc
index 66843f3..fe74992 100644
--- a/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.cc
+++ b/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.cc
@@ -17,11 +17,6 @@
 #include "ui/base/ime/text_edit_commands.h"
 #include "ui/events/event.h"
 
-#if defined(USE_X11)
-#include "ui/base/x/x11_util.h"  // nogncheck
-#include "ui/gfx/x/x11.h"        // nogncheck
-#endif
-
 using ui::TextEditCommand;
 
 // TODO(erg): Rewrite the old gtk_key_bindings_handler_unittest.cc and get them
@@ -41,56 +36,13 @@
 #endif
 }
 
-#if !defined(USE_X11)
-GdkModifierType EventFlagsToGdkModifierType(ui::EventFlags event_flags) {
-  static const struct {
-    ui::EventFlags event_flag;
-    GdkModifierType gdk_modifier;
-  } mapping[] = {
-      {ui::EF_SHIFT_DOWN, GDK_SHIFT_MASK},
-      {ui::EF_CAPS_LOCK_ON, GDK_LOCK_MASK},
-      {ui::EF_CONTROL_DOWN, GDK_CONTROL_MASK},
-      {ui::EF_ALT_DOWN, GDK_MOD1_MASK},
-      {ui::EF_NUM_LOCK_ON, GDK_MOD2_MASK},
-      {ui::EF_MOD3_DOWN, GDK_MOD3_MASK},
-      {ui::EF_COMMAND_DOWN, GDK_MOD4_MASK},
-      {ui::EF_ALTGR_DOWN, GDK_MOD5_MASK},
-      {ui::EF_LEFT_MOUSE_BUTTON, GDK_BUTTON1_MASK},
-      {ui::EF_MIDDLE_MOUSE_BUTTON, GDK_BUTTON2_MASK},
-      {ui::EF_RIGHT_MOUSE_BUTTON, GDK_BUTTON3_MASK},
-      {ui::EF_BACK_MOUSE_BUTTON, GDK_BUTTON4_MASK},
-      {ui::EF_FORWARD_MOUSE_BUTTON, GDK_BUTTON5_MASK},
-  };
-  GdkModifierType gdk_modifier_type = static_cast<GdkModifierType>(0);
-  for (const auto& map : mapping) {
-    if (event_flags & map.event_flag) {
-      gdk_modifier_type =
-          static_cast<GdkModifierType>(gdk_modifier_type | map.gdk_modifier);
-    }
-  }
-  return gdk_modifier_type;
-}
-#endif
-
 }  // namespace
 
 namespace libgtkui {
 
 GtkKeyBindingsHandler::GtkKeyBindingsHandler()
-    : fake_window_(CreateInvisibleWindow()),
-      handler_(CreateNewHandler()),
-      has_xkb_(false) {
+    : fake_window_(CreateInvisibleWindow()), handler_(CreateNewHandler()) {
   gtk_container_add(GTK_CONTAINER(fake_window_), handler_);
-
-#if defined(USE_X11)
-  int opcode, event, error;
-  int major = XkbMajorVersion;
-  int minor = XkbMinorVersion;
-  has_xkb_ = XkbQueryExtension(gfx::GetXDisplay(), &opcode, &event, &error,
-                               &major, &minor);
-#else
-  has_xkb_ = false;
-#endif
 }
 
 GtkKeyBindingsHandler::~GtkKeyBindingsHandler() {
@@ -104,19 +56,19 @@
   CHECK(event.IsKeyEvent());
 
   const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event);
-  if (key_event.is_char() || !key_event.native_event())
+  if (key_event.is_char())
     return false;
 
-  GdkEventKey gdk_event;
-  BuildGdkEventKeyFromKeyEvent(key_event, &gdk_event);
+  GdkEvent* gdk_event = GdkEventFromKeyEvent(key_event);
+  if (!gdk_event)
+    return false;
 
   edit_commands_.clear();
   // If this key event matches a predefined key binding, corresponding signal
   // will be emitted.
 
-  gtk_bindings_activate_event(
-      G_OBJECT(handler_),
-      &gdk_event);
+  gtk_bindings_activate_event(G_OBJECT(handler_), &gdk_event->key);
+  gdk_event_free(gdk_event);
 
   bool matched = !edit_commands_.empty();
   if (edit_commands)
@@ -149,56 +101,6 @@
   edit_commands_.push_back(ui::TextEditCommandAuraLinux(command, value));
 }
 
-void GtkKeyBindingsHandler::BuildGdkEventKeyFromKeyEvent(
-    const ui::KeyEvent& key_event,
-    GdkEventKey* gdk_event) {
-  GdkKeymap* keymap = gdk_keymap_get_for_display(gdk_display_get_default());
-  GdkModifierType consumed, state;
-
-#if defined(USE_X11)
-  const ui::PlatformEvent& xevent = key_event.native_event();
-  gdk_event->type =
-      xevent->xany.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
-  gdk_event->time = xevent->xkey.time;
-  gdk_event->state = static_cast<GdkModifierType>(xevent->xkey.state);
-  gdk_event->hardware_keycode = xevent->xkey.keycode;
-  if (has_xkb_) {
-    gdk_event->group = XkbGroupForCoreState(xevent->xkey.state);
-  } else {
-    // The overwhelming majority of people will be using X servers that support
-    // XKB. GDK has a fallback here that does some complicated stuff to detect
-    // whether a modifier key affects the keybinding, but that should be
-    // extremely rare.
-    static bool logged = false;
-    if (!logged) {
-      NOTIMPLEMENTED();
-      logged = true;
-    }
-    gdk_event->group = 0;
-  }
-#else
-  gdk_event->type =
-      key_event.type() == ui::ET_KEY_PRESSED ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
-  gdk_event->time =
-      (key_event.time_stamp() - base::TimeTicks()).InMilliseconds();
-  gdk_event->state = EventFlagsToGdkModifierType(
-      static_cast<ui::EventFlags>(key_event.flags()));
-  gdk_event->hardware_keycode = key_event.key_code();
-  // TODO(crbug.com/987939): Fix keyboard layout switching in Ozone/X11
-  gdk_event->group = 0;
-#endif
-
-  gdk_event->keyval = GDK_KEY_VoidSymbol;
-  gdk_keymap_translate_keyboard_state(
-      keymap, gdk_event->hardware_keycode,
-      static_cast<GdkModifierType>(gdk_event->state), gdk_event->group,
-      &gdk_event->keyval, nullptr, nullptr, &consumed);
-
-  state = static_cast<GdkModifierType>(gdk_event->state & ~consumed);
-  gdk_keymap_add_virtual_modifiers(keymap, &state);
-  gdk_event->state |= state;
-}
-
 void GtkKeyBindingsHandler::HandlerInit(Handler* self) {
   self->owner = nullptr;
 }
diff --git a/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h b/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h
index 0f1fa96..8a9bc3c 100644
--- a/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h
+++ b/chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h
@@ -15,7 +15,6 @@
 
 namespace ui {
 class Event;
-class KeyEvent;
 }
 
 namespace libgtkui {
@@ -70,10 +69,6 @@
   void EditCommandMatched(ui::TextEditCommand command,
                           const std::string& value);
 
-  // Builds a fake GdkEventKey from an XEvent.
-  void BuildGdkEventKeyFromKeyEvent(const ui::KeyEvent& key_event,
-                                    GdkEventKey* gdk_event);
-
   // Initializes Handler structure.
   static void HandlerInit(Handler* self);
 
@@ -142,9 +137,6 @@
 
   // Buffer to store the match results.
   std::vector<ui::TextEditCommandAuraLinux> edit_commands_;
-
-  // Whether the current X server has the XKeyboard extension.
-  bool has_xkb_;
 };
 
 }  // namespace libgtkui
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
index 71db289c..8b499d32 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h"
 #include "chrome/browser/ui/libgtkui/gtk_status_icon.h"
 #include "chrome/browser/ui/libgtkui/gtk_util.h"
+#include "chrome/browser/ui/libgtkui/input_method_context_impl_gtk.h"
 #include "chrome/browser/ui/libgtkui/native_theme_gtk.h"
 #include "chrome/browser/ui/libgtkui/nav_button_provider_gtk.h"
 #include "chrome/browser/ui/libgtkui/print_dialog_gtk.h"
@@ -73,7 +74,6 @@
 
 #if defined(USE_X11)
 #include "chrome/browser/ui/libgtkui/gtk_event_loop_x11.h"  // nogncheck
-#include "chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.h"  // nogncheck
 #include "ui/gfx/x/x11.h"        // nogncheck
 #include "ui/gfx/x/x11_types.h"  // nogncheck
 #endif
@@ -333,7 +333,7 @@
       {ActionSource::kRightClick, Action::kMenu}};
 
   // Force Gtk to use Xwayland if it would have used wayland.  libgtkui assumes
-  // the use of X11 (eg. X11InputMethodContextImplGtk) and will crash under
+  // the use of X11 (eg. InputMethodContextImplGtk) and will crash under
   // other backends.
   // TODO(thomasanderson): Change this logic once Wayland support is added.
   gdk_set_allowed_backends("x11");
@@ -655,7 +655,7 @@
     bool is_simple) const {
 #if defined(USE_X11)
   return std::unique_ptr<ui::LinuxInputMethodContext>(
-      new X11InputMethodContextImplGtk(delegate, is_simple));
+      new InputMethodContextImplGtk(delegate, is_simple));
 #else
   NOTIMPLEMENTED();
   return std::make_unique<ui::FakeInputMethodContext>();
diff --git a/chrome/browser/ui/libgtkui/gtk_util.cc b/chrome/browser/ui/libgtkui/gtk_util.cc
index dc3cc680..c9d6229 100644
--- a/chrome/browser/ui/libgtkui/gtk_util.cc
+++ b/chrome/browser/ui/libgtkui/gtk_util.cc
@@ -21,10 +21,11 @@
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
 #include "build/branding_buildflags.h"
-#include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/accelerators/accelerator.h"
-#include "ui/events/event_constants.h"
+#include "ui/events/event.h"
+#include "ui/events/event_utils.h"
+#include "ui/events/keycodes/dom/keycode_converter.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/views/linux_ui/linux_ui.h"
@@ -33,6 +34,7 @@
 #include <gdk/gdkx.h>
 
 #include "ui/events/keycodes/keyboard_code_conversion_x.h"  // nogncheck
+#include "ui/gfx/x/x11_types.h"                             // nogncheck
 #endif
 
 namespace {
@@ -72,6 +74,57 @@
 #endif
 }
 
+GdkModifierType GetIbusFlags(const ui::KeyEvent& key_event) {
+  auto* properties = key_event.properties();
+  if (!properties)
+    return static_cast<GdkModifierType>(0);
+  auto it = properties->find(ui::kPropertyKeyboardIBusFlag);
+  DCHECK(it == properties->end() || it->second.size() == 1);
+  uint8_t flags = (it != properties->end()) ? it->second[0] : 0;
+  return static_cast<GdkModifierType>(flags
+                                      << ui::kPropertyKeyboardIBusFlagOffset);
+}
+
+GdkModifierType ExtractGdkEventStateFromKeyEvent(
+    const ui::KeyEvent& key_event) {
+  auto event_flags = static_cast<ui::EventFlags>(key_event.flags());
+  static const struct {
+    ui::EventFlags event_flag;
+    GdkModifierType gdk_modifier;
+  } mapping[] = {
+      {ui::EF_SHIFT_DOWN, GDK_SHIFT_MASK},
+      {ui::EF_CAPS_LOCK_ON, GDK_LOCK_MASK},
+      {ui::EF_CONTROL_DOWN, GDK_CONTROL_MASK},
+      {ui::EF_ALT_DOWN, GDK_MOD1_MASK},
+      {ui::EF_NUM_LOCK_ON, GDK_MOD2_MASK},
+      {ui::EF_MOD3_DOWN, GDK_META_MASK},
+      {ui::EF_COMMAND_DOWN, GDK_MOD4_MASK},
+      {ui::EF_ALTGR_DOWN, GDK_MOD5_MASK},
+      {ui::EF_LEFT_MOUSE_BUTTON, GDK_BUTTON1_MASK},
+      {ui::EF_MIDDLE_MOUSE_BUTTON, GDK_BUTTON2_MASK},
+      {ui::EF_RIGHT_MOUSE_BUTTON, GDK_BUTTON3_MASK},
+      {ui::EF_BACK_MOUSE_BUTTON, GDK_BUTTON4_MASK},
+      {ui::EF_FORWARD_MOUSE_BUTTON, GDK_BUTTON5_MASK},
+  };
+  unsigned int gdk_modifier_type = 0;
+  for (const auto& map : mapping) {
+    if (event_flags & map.event_flag) {
+      gdk_modifier_type = gdk_modifier_type | map.gdk_modifier;
+    }
+  }
+  return static_cast<GdkModifierType>(gdk_modifier_type |
+                                      GetIbusFlags(key_event));
+}
+
+int GetKeyboardGroup(const ui::KeyEvent& key_event) {
+  auto* properties = key_event.properties();
+  if (!properties)
+    return 0;
+  auto it = properties->find(ui::kPropertyKeyboardGroup);
+  DCHECK(it == properties->end() || it->second.size() == 1);
+  return (it != properties->end()) ? it->second[0] : 0;
+}
+
 }  // namespace
 
 namespace libgtkui {
@@ -617,4 +670,51 @@
 }
 #endif
 
+GdkDisplay* GetGdkDisplay() {
+  GdkDisplay* display = nullptr;
+  // TODO(crbug.com/1002674): Remove once GtkIM-based LinuxInputMethodContext
+  // implementation is moved out of libgtkui.
+#if defined(USE_X11)
+  display = gdk_x11_lookup_xdisplay(gfx::GetXDisplay());
+#endif
+  if (!display)  // Fall back to the default display.
+    display = gdk_display_get_default();
+  return display;
+}
+
+GdkEvent* GdkEventFromKeyEvent(const ui::KeyEvent& key_event) {
+  GdkEventType event_type =
+      key_event.type() == ui::ET_KEY_PRESSED ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
+  int hw_code = ui::KeycodeConverter::DomCodeToNativeKeycode(key_event.code());
+  auto event_time = key_event.time_stamp() - base::TimeTicks();
+  int group = GetKeyboardGroup(key_event);
+
+  // Get GdkKeymap
+  GdkKeymap* keymap = gdk_keymap_get_for_display(GetGdkDisplay());
+
+  // Get keyval and state
+  GdkModifierType state = ExtractGdkEventStateFromKeyEvent(key_event);
+  guint keyval = GDK_KEY_VoidSymbol;
+  GdkModifierType consumed;
+  gdk_keymap_translate_keyboard_state(keymap, hw_code, state, group, &keyval,
+                                      nullptr, nullptr, &consumed);
+  gdk_keymap_add_virtual_modifiers(keymap, &state);
+  DCHECK(keyval != GDK_KEY_VoidSymbol);
+
+  // Build GdkEvent
+  GdkEvent* gdk_event = gdk_event_new(event_type);
+  gdk_event->type = event_type;
+  gdk_event->key.time = event_time.InMilliseconds();
+  gdk_event->key.hardware_keycode = hw_code;
+  gdk_event->key.keyval = keyval;
+  gdk_event->key.state = state;
+  gdk_event->key.group = group;
+  gdk_event->key.send_event = key_event.flags() & ui::EF_FINAL;
+  gdk_event->key.is_modifier = state & GDK_MODIFIER_MASK;
+  gdk_event->key.length = 0;
+  gdk_event->key.string = nullptr;
+
+  return gdk_event;
+}
+
 }  // namespace libgtkui
diff --git a/chrome/browser/ui/libgtkui/gtk_util.h b/chrome/browser/ui/libgtkui/gtk_util.h
index d75427b..e0ab34ca 100644
--- a/chrome/browser/ui/libgtkui/gtk_util.h
+++ b/chrome/browser/ui/libgtkui/gtk_util.h
@@ -12,6 +12,8 @@
 #include "ui/native_theme/native_theme.h"
 #include "ui/views/window/frame_buttons.h"
 
+typedef union _GdkEvent GdkEvent;
+
 namespace aura {
 class Window;
 }
@@ -27,6 +29,7 @@
 
 namespace ui {
 class Accelerator;
+class KeyEvent;
 }
 
 namespace libgtkui {
@@ -190,6 +193,17 @@
 // TODO(thomasanderson): Remove this once GtkStatusIcon is removed.
 guint GetGdkKeyCodeForAccelerator(const ui::Accelerator& accelerator);
 #endif
+
+// Get current GdkDisplay instance
+GdkDisplay* GetGdkDisplay();
+
+// Translates |key_event| into a GdkEvent. GdkEvent::key::window is the only
+// field not set by this function, callers must set it, as the way for
+// retrieving it may vary depending on the event being processed. E.g: for IME
+// Context impl, X11 window XID is obtained through Event::target() which is
+// root aura::Window targeted by that key event.
+GdkEvent* GdkEventFromKeyEvent(const ui::KeyEvent& key_event);
+
 }  // namespace libgtkui
 
 #endif  // CHROME_BROWSER_UI_LIBGTKUI_GTK_UTIL_H_
diff --git a/chrome/browser/ui/libgtkui/input_method_context_impl_gtk.cc b/chrome/browser/ui/libgtkui/input_method_context_impl_gtk.cc
new file mode 100644
index 0000000..ac4f15d
--- /dev/null
+++ b/chrome/browser/ui/libgtkui/input_method_context_impl_gtk.cc
@@ -0,0 +1,231 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/libgtkui/input_method_context_impl_gtk.h"
+
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+#include <stddef.h>
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/libgtkui/gtk_util.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/base/ime/composition_text.h"
+#include "ui/base/ime/linux/composition_text_util_pango.h"
+#include "ui/base/ime/text_input_client.h"
+#include "ui/events/event.h"
+#include "ui/gfx/geometry/dip_util.h"
+#include "ui/views/linux_ui/linux_ui.h"
+
+namespace libgtkui {
+
+namespace {
+
+// Get IME KeyEvent's target window. Assumes root aura::Window is set to
+// Event::target(), otherwise returns null.
+GdkWindow* GetTargetWindow(const ui::KeyEvent& key_event) {
+  if (!key_event.target())
+    return nullptr;
+
+  GdkDisplay* display = GetGdkDisplay();
+  aura::Window* window = static_cast<aura::Window*>(key_event.target());
+  XID xwindow = window->GetHost()->GetAcceleratedWidget();
+
+  GdkWindow* gdk_window = gdk_x11_window_lookup_for_display(display, xwindow);
+  if (gdk_window)
+    g_object_ref(gdk_window);
+  else
+    gdk_window = gdk_x11_window_foreign_new_for_display(display, xwindow);
+  return gdk_window;
+}
+
+// Translate IME ui::KeyEvent to a GdkEventKey.
+GdkEvent* GdkEventFromImeKeyEvent(const ui::KeyEvent& key_event) {
+  GdkEvent* event = GdkEventFromKeyEvent(key_event);
+  if (!event)
+    return nullptr;
+
+  GdkWindow* target_window = GetTargetWindow(key_event);
+  if (!target_window) {
+    gdk_event_free(event);
+    return nullptr;
+  }
+  event->key.window = target_window;
+  return event;
+}
+
+}  // namespace
+
+InputMethodContextImplGtk::InputMethodContextImplGtk(
+    ui::LinuxInputMethodContextDelegate* delegate,
+    bool is_simple)
+    : delegate_(delegate),
+      is_simple_(is_simple),
+      has_focus_(false),
+      gtk_context_(nullptr),
+      gdk_last_set_client_window_(nullptr) {
+  CHECK(delegate_);
+
+  gtk_context_ =
+      is_simple ? gtk_im_context_simple_new() : gtk_im_multicontext_new();
+
+  g_signal_connect(gtk_context_, "commit", G_CALLBACK(OnCommitThunk), this);
+  g_signal_connect(gtk_context_, "preedit-changed",
+                   G_CALLBACK(OnPreeditChangedThunk), this);
+  g_signal_connect(gtk_context_, "preedit-end", G_CALLBACK(OnPreeditEndThunk),
+                   this);
+  g_signal_connect(gtk_context_, "preedit-start",
+                   G_CALLBACK(OnPreeditStartThunk), this);
+  // TODO(shuchen): Handle operations on surrounding text.
+  // "delete-surrounding" and "retrieve-surrounding" signals should be
+  // handled.
+}
+
+InputMethodContextImplGtk::~InputMethodContextImplGtk() {
+  if (gtk_context_) {
+    g_object_unref(gtk_context_);
+    gtk_context_ = nullptr;
+  }
+}
+
+// Overridden from ui::LinuxInputMethodContext
+bool InputMethodContextImplGtk::DispatchKeyEvent(
+    const ui::KeyEvent& key_event) {
+  if (!gtk_context_)
+    return false;
+
+  GdkEvent* event = GdkEventFromImeKeyEvent(key_event);
+  if (!event) {
+    LOG(ERROR) << "Cannot translate a Keyevent to a GdkEvent.";
+    return false;
+  }
+
+  GdkWindow* target_window = event->key.window;
+  if (!target_window) {
+    LOG(ERROR) << "Cannot get target GdkWindow for KeyEvent.";
+    return false;
+  }
+
+  SetContextClientWindow(target_window);
+
+  // Convert the last known caret bounds relative to the screen coordinates
+  // to a GdkRectangle relative to the client window.
+  gint win_x = 0;
+  gint win_y = 0;
+  gdk_window_get_origin(target_window, &win_x, &win_y);
+
+  gint factor = gdk_window_get_scale_factor(target_window);
+  gint caret_x = last_caret_bounds_.x() / factor;
+  gint caret_y = last_caret_bounds_.y() / factor;
+  gint caret_w = last_caret_bounds_.width() / factor;
+  gint caret_h = last_caret_bounds_.height() / factor;
+
+  GdkRectangle gdk_rect = {caret_x - win_x, caret_y - win_y, caret_w, caret_h};
+  gtk_im_context_set_cursor_location(gtk_context_, &gdk_rect);
+
+  const bool handled =
+      gtk_im_context_filter_keypress(gtk_context_, &event->key);
+  gdk_event_free(event);
+  return handled;
+}
+
+void InputMethodContextImplGtk::Reset() {
+  gtk_im_context_reset(gtk_context_);
+
+  // Some input methods may not honour the reset call.
+  // Focusing out/in the to make sure it gets reset correctly.
+  if (!is_simple_ && has_focus_) {
+    Blur();
+    Focus();
+  }
+}
+
+void InputMethodContextImplGtk::Focus() {
+  gtk_im_context_focus_in(gtk_context_);
+  has_focus_ = true;
+}
+
+void InputMethodContextImplGtk::Blur() {
+  gtk_im_context_focus_out(gtk_context_);
+  has_focus_ = false;
+}
+
+void InputMethodContextImplGtk::SetCursorLocation(const gfx::Rect& rect) {
+  // Remember the caret bounds so that we can set the cursor location later.
+  // gtk_im_context_set_cursor_location() takes the location relative to the
+  // client window, which is unknown at this point.  So we'll call
+  // gtk_im_context_set_cursor_location() later in ProcessKeyEvent() where
+  // (and only where) we know the client window.
+  if (views::LinuxUI::instance()) {
+    last_caret_bounds_ = gfx::ConvertRectToPixel(
+        views::LinuxUI::instance()->GetDeviceScaleFactor(), rect);
+  } else {
+    last_caret_bounds_ = rect;
+  }
+}
+
+void InputMethodContextImplGtk::SetSurroundingText(
+    const base::string16& text,
+    const gfx::Range& selection_range) {}
+
+// private:
+
+// GtkIMContext event handlers.
+
+void InputMethodContextImplGtk::OnCommit(GtkIMContext* context, gchar* text) {
+  if (context != gtk_context_)
+    return;
+
+  delegate_->OnCommit(base::UTF8ToUTF16(text));
+}
+
+void InputMethodContextImplGtk::OnPreeditChanged(GtkIMContext* context) {
+  if (context != gtk_context_)
+    return;
+
+  gchar* str = nullptr;
+  PangoAttrList* attrs = nullptr;
+  gint cursor_pos = 0;
+  gtk_im_context_get_preedit_string(context, &str, &attrs, &cursor_pos);
+  ui::CompositionText composition_text;
+  ui::ExtractCompositionTextFromGtkPreedit(str, attrs, cursor_pos,
+                                           &composition_text);
+  g_free(str);
+  pango_attr_list_unref(attrs);
+
+  delegate_->OnPreeditChanged(composition_text);
+}
+
+void InputMethodContextImplGtk::OnPreeditEnd(GtkIMContext* context) {
+  if (context != gtk_context_)
+    return;
+
+  delegate_->OnPreeditEnd();
+}
+
+void InputMethodContextImplGtk::OnPreeditStart(GtkIMContext* context) {
+  if (context != gtk_context_)
+    return;
+
+  delegate_->OnPreeditStart();
+}
+
+void InputMethodContextImplGtk::SetContextClientWindow(GdkWindow* window) {
+  if (window == gdk_last_set_client_window_)
+    return;
+#if GTK_CHECK_VERSION(3, 90, 0)
+  gtk_im_context_set_client_widget(gtk_context_, GTK_WIDGET(window));
+#else
+  gtk_im_context_set_client_window(gtk_context_, window);
+#endif
+
+  // Prevent leaks when overriding last client window
+  if (gdk_last_set_client_window_)
+    g_object_unref(gdk_last_set_client_window_);
+  gdk_last_set_client_window_ = window;
+}
+
+}  // namespace libgtkui
diff --git a/chrome/browser/ui/libgtkui/input_method_context_impl_gtk.h b/chrome/browser/ui/libgtkui/input_method_context_impl_gtk.h
new file mode 100644
index 0000000..366da92
--- /dev/null
+++ b/chrome/browser/ui/libgtkui/input_method_context_impl_gtk.h
@@ -0,0 +1,84 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_LIBGTKUI_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
+#define CHROME_BROWSER_UI_LIBGTKUI_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
+
+#include "base/macros.h"
+#include "base/strings/string16.h"
+#include "ui/base/glib/glib_integers.h"
+#include "ui/base/glib/glib_signal.h"
+#include "ui/base/ime/linux/linux_input_method_context.h"
+#include "ui/gfx/geometry/rect.h"
+
+typedef struct _GdkWindow GdkWindow;
+typedef struct _GtkIMContext GtkIMContext;
+
+namespace libgtkui {
+
+// An implementation of LinuxInputMethodContext which uses GtkIMContext
+// (gtk-immodule) as a bridge from/to underlying IMEs.
+class InputMethodContextImplGtk : public ui::LinuxInputMethodContext {
+ public:
+  InputMethodContextImplGtk(ui::LinuxInputMethodContextDelegate* delegate,
+                            bool is_simple);
+  ~InputMethodContextImplGtk() override;
+
+  // Overridden from ui::LinuxInputMethodContext
+  bool DispatchKeyEvent(const ui::KeyEvent& key_event) override;
+  void SetCursorLocation(const gfx::Rect& rect) override;
+  void Reset() override;
+  void Focus() override;
+  void Blur() override;
+  void SetSurroundingText(const base::string16& text,
+                          const gfx::Range& selection_range) override;
+
+ private:
+  // GtkIMContext event handlers.  They are shared among |gtk_context_simple_|
+  // and |gtk_multicontext_|.
+  CHROMEG_CALLBACK_1(InputMethodContextImplGtk,
+                     void,
+                     OnCommit,
+                     GtkIMContext*,
+                     gchar*);
+  CHROMEG_CALLBACK_0(InputMethodContextImplGtk,
+                     void,
+                     OnPreeditChanged,
+                     GtkIMContext*);
+  CHROMEG_CALLBACK_0(InputMethodContextImplGtk,
+                     void,
+                     OnPreeditEnd,
+                     GtkIMContext*);
+  CHROMEG_CALLBACK_0(InputMethodContextImplGtk,
+                     void,
+                     OnPreeditStart,
+                     GtkIMContext*);
+
+  void SetContextClientWindow(GdkWindow* window);
+
+  // A set of callback functions.  Must not be nullptr.
+  ui::LinuxInputMethodContextDelegate* delegate_;
+
+  // Input method context type flag.
+  //   - true if it supports table-based input methods
+  //   - false if it supports multiple, loadable input methods
+  bool is_simple_;
+
+  // Keeps track of current focus state.
+  bool has_focus_;
+
+  // IME's input GTK context.
+  GtkIMContext* gtk_context_;
+
+  gpointer gdk_last_set_client_window_;
+
+  // Last known caret bounds relative to the screen coordinates.
+  gfx::Rect last_caret_bounds_;
+
+  DISALLOW_COPY_AND_ASSIGN(InputMethodContextImplGtk);
+};
+
+}  // namespace libgtkui
+
+#endif  // CHROME_BROWSER_UI_LIBGTKUI_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
diff --git a/chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.cc b/chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.cc
deleted file mode 100644
index c8b9604..0000000
--- a/chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.cc
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.h"
-
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk/gdkx.h>
-#include <stddef.h>
-
-#include <gtk/gtk.h>
-
-#include "base/strings/utf_string_conversions.h"
-#include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/linux/composition_text_util_pango.h"
-#include "ui/base/ime/text_input_client.h"
-#include "ui/events/event.h"
-#include "ui/events/keycodes/keyboard_code_conversion_x.h"
-#include "ui/gfx/geometry/dip_util.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
-#include "ui/views/linux_ui/linux_ui.h"
-
-namespace libgtkui {
-
-X11InputMethodContextImplGtk::X11InputMethodContextImplGtk(
-    ui::LinuxInputMethodContextDelegate* delegate,
-    bool is_simple)
-    : delegate_(delegate),
-      is_simple_(is_simple),
-      has_focus_(false),
-      gtk_context_(nullptr),
-      gdk_last_set_client_window_(nullptr) {
-  CHECK(delegate_);
-
-  ResetXModifierKeycodesCache();
-
-  gtk_context_ =
-      is_simple ? gtk_im_context_simple_new() : gtk_im_multicontext_new();
-
-  g_signal_connect(gtk_context_, "commit", G_CALLBACK(OnCommitThunk), this);
-  g_signal_connect(gtk_context_, "preedit-changed",
-                   G_CALLBACK(OnPreeditChangedThunk), this);
-  g_signal_connect(gtk_context_, "preedit-end", G_CALLBACK(OnPreeditEndThunk),
-                   this);
-  g_signal_connect(gtk_context_, "preedit-start",
-                   G_CALLBACK(OnPreeditStartThunk), this);
-  // TODO(shuchen): Handle operations on surrounding text.
-  // "delete-surrounding" and "retrieve-surrounding" signals should be
-  // handled.
-}
-
-X11InputMethodContextImplGtk::~X11InputMethodContextImplGtk() {
-  if (gtk_context_) {
-    g_object_unref(gtk_context_);
-    gtk_context_ = nullptr;
-  }
-}
-
-// Overriden from ui::LinuxInputMethodContext
-
-bool X11InputMethodContextImplGtk::DispatchKeyEvent(
-    const ui::KeyEvent& key_event) {
-  if (!key_event.HasNativeEvent() || !gtk_context_)
-    return false;
-
-  // Translate a XKeyEvent to a GdkEventKey.
-  GdkEvent* event = GdkEventFromNativeEvent(key_event.native_event());
-  if (!event) {
-    LOG(ERROR) << "Cannot translate a XKeyEvent to a GdkEvent.";
-    return false;
-  }
-
-  if (event->key.window != gdk_last_set_client_window_) {
-#if GTK_CHECK_VERSION(3, 90, 0)
-    gtk_im_context_set_client_widget(gtk_context_,
-                                     GTK_WIDGET(event->key.window));
-#else
-    gtk_im_context_set_client_window(gtk_context_, event->key.window);
-#endif
-    gdk_last_set_client_window_ = event->key.window;
-  }
-
-  // Convert the last known caret bounds relative to the screen coordinates
-  // to a GdkRectangle relative to the client window.
-  gint win_x = 0;
-  gint win_y = 0;
-  gdk_window_get_origin(event->key.window, &win_x, &win_y);
-
-  gint factor = gdk_window_get_scale_factor(event->key.window);
-  gint caret_x = last_caret_bounds_.x() / factor;
-  gint caret_y = last_caret_bounds_.y() / factor;
-  gint caret_w = last_caret_bounds_.width() / factor;
-  gint caret_h = last_caret_bounds_.height() / factor;
-
-  GdkRectangle gdk_rect = {caret_x - win_x, caret_y - win_y, caret_w, caret_h};
-  gtk_im_context_set_cursor_location(gtk_context_, &gdk_rect);
-
-  const bool handled =
-      gtk_im_context_filter_keypress(gtk_context_, &event->key);
-  gdk_event_free(event);
-  return handled;
-}
-
-void X11InputMethodContextImplGtk::Reset() {
-  gtk_im_context_reset(gtk_context_);
-
-  // Some input methods may not honour the reset call.
-  // Focusing out/in the to make sure it gets reset correctly.
-  if (!is_simple_ && has_focus_) {
-    Blur();
-    Focus();
-  }
-}
-
-void X11InputMethodContextImplGtk::Focus() {
-  gtk_im_context_focus_in(gtk_context_);
-  has_focus_ = true;
-}
-
-void X11InputMethodContextImplGtk::Blur() {
-  gtk_im_context_focus_out(gtk_context_);
-  has_focus_ = false;
-}
-
-void X11InputMethodContextImplGtk::SetCursorLocation(const gfx::Rect& rect) {
-  // Remember the caret bounds so that we can set the cursor location later.
-  // gtk_im_context_set_cursor_location() takes the location relative to the
-  // client window, which is unknown at this point.  So we'll call
-  // gtk_im_context_set_cursor_location() later in ProcessKeyEvent() where
-  // (and only where) we know the client window.
-  if (views::LinuxUI::instance()) {
-    last_caret_bounds_ = gfx::ConvertRectToPixel(
-        views::LinuxUI::instance()->GetDeviceScaleFactor(), rect);
-  } else {
-    last_caret_bounds_ = rect;
-  }
-}
-
-void X11InputMethodContextImplGtk::SetSurroundingText(
-    const base::string16& text,
-    const gfx::Range& selection_range) {}
-
-// private:
-
-void X11InputMethodContextImplGtk::ResetXModifierKeycodesCache() {
-  modifier_keycodes_.clear();
-  meta_keycodes_.clear();
-  super_keycodes_.clear();
-  hyper_keycodes_.clear();
-
-  Display* display = gfx::GetXDisplay();
-  gfx::XScopedPtr<XModifierKeymap,
-                  gfx::XObjectDeleter<XModifierKeymap, int, XFreeModifiermap>>
-      modmap(XGetModifierMapping(display));
-  int min_keycode = 0;
-  int max_keycode = 0;
-  int keysyms_per_keycode = 1;
-  XDisplayKeycodes(display, &min_keycode, &max_keycode);
-  gfx::XScopedPtr<KeySym[]> keysyms(
-      XGetKeyboardMapping(display, min_keycode, max_keycode - min_keycode + 1,
-                          &keysyms_per_keycode));
-  for (int i = 0; i < 8 * modmap->max_keypermod; ++i) {
-    const int keycode = modmap->modifiermap[i];
-    if (!keycode)
-      continue;
-    modifier_keycodes_.insert(keycode);
-
-    if (!keysyms)
-      continue;
-    for (int j = 0; j < keysyms_per_keycode; ++j) {
-      switch (keysyms[(keycode - min_keycode) * keysyms_per_keycode + j]) {
-        case XK_Meta_L:
-        case XK_Meta_R:
-          meta_keycodes_.push_back(keycode);
-          break;
-        case XK_Super_L:
-        case XK_Super_R:
-          super_keycodes_.push_back(keycode);
-          break;
-        case XK_Hyper_L:
-        case XK_Hyper_R:
-          hyper_keycodes_.push_back(keycode);
-          break;
-      }
-    }
-  }
-}
-
-GdkEvent* X11InputMethodContextImplGtk::GdkEventFromNativeEvent(
-    const ui::PlatformEvent& native_event) {
-  XEvent xkeyevent;
-  if (native_event->type == GenericEvent) {
-    // If this is an XI2 key event, build a matching core X event, to avoid
-    // having two cases for every use.
-    ui::InitXKeyEventFromXIDeviceEvent(*native_event, &xkeyevent);
-  } else {
-    DCHECK(native_event->type == KeyPress || native_event->type == KeyRelease);
-    xkeyevent.xkey = native_event->xkey;
-  }
-  XKeyEvent& xkey = xkeyevent.xkey;
-
-  // Get a GdkDisplay.
-  GdkDisplay* display = gdk_x11_lookup_xdisplay(xkey.display);
-  if (!display) {
-    // Fall back to the default display.
-    display = gdk_display_get_default();
-  }
-  if (!display) {
-    LOG(ERROR) << "Cannot get a GdkDisplay for a key event.";
-    return nullptr;
-  }
-  // Get a keysym and group.
-  KeySym keysym = NoSymbol;
-  guint8 keyboard_group = 0;
-  XLookupString(&xkey, nullptr, 0, &keysym, nullptr);
-  GdkKeymap* keymap = gdk_keymap_get_for_display(display);
-  GdkKeymapKey* keys = nullptr;
-  guint* keyvals = nullptr;
-  gint n_entries = 0;
-  if (keymap && gdk_keymap_get_entries_for_keycode(keymap, xkey.keycode, &keys,
-                                                   &keyvals, &n_entries)) {
-    for (gint i = 0; i < n_entries; ++i) {
-      if (keyvals[i] == keysym) {
-        keyboard_group = keys[i].group;
-        break;
-      }
-    }
-  }
-  g_free(keys);
-  keys = nullptr;
-  g_free(keyvals);
-  keyvals = nullptr;
-// Get a GdkWindow.
-  GdkWindow* window = gdk_x11_window_lookup_for_display(display, xkey.window);
-  if (window)
-    g_object_ref(window);
-  else
-    window = gdk_x11_window_foreign_new_for_display(display, xkey.window);
-  if (!window) {
-    LOG(ERROR) << "Cannot get a GdkWindow for a key event.";
-    return nullptr;
-  }
-
-  // Create a GdkEvent.
-  GdkEventType event_type =
-      xkey.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
-  GdkEvent* event = gdk_event_new(event_type);
-  event->key.type = event_type;
-  event->key.window = window;
-  // GdkEventKey and XKeyEvent share the same definition for time and state.
-  event->key.send_event = xkey.send_event;
-  event->key.time = xkey.time;
-  event->key.state = xkey.state;
-  event->key.keyval = keysym;
-  event->key.length = 0;
-  event->key.string = nullptr;
-  event->key.hardware_keycode = xkey.keycode;
-  event->key.group = keyboard_group;
-  event->key.is_modifier = IsKeycodeModifierKey(xkey.keycode);
-
-  char keybits[32] = {0};
-  XQueryKeymap(xkey.display, keybits);
-  if (IsAnyOfKeycodesPressed(meta_keycodes_, keybits, sizeof keybits * 8))
-    event->key.state |= GDK_META_MASK;
-  if (IsAnyOfKeycodesPressed(super_keycodes_, keybits, sizeof keybits * 8))
-    event->key.state |= GDK_SUPER_MASK;
-  if (IsAnyOfKeycodesPressed(hyper_keycodes_, keybits, sizeof keybits * 8))
-    event->key.state |= GDK_HYPER_MASK;
-
-  return event;
-}
-
-bool X11InputMethodContextImplGtk::IsKeycodeModifierKey(
-    unsigned int keycode) const {
-  return modifier_keycodes_.find(keycode) != modifier_keycodes_.end();
-}
-
-bool X11InputMethodContextImplGtk::IsAnyOfKeycodesPressed(
-    const std::vector<int>& keycodes,
-    const char* keybits,
-    int num_keys) const {
-  for (size_t i = 0; i < keycodes.size(); ++i) {
-    const int keycode = keycodes[i];
-    if (keycode < 0 || num_keys <= keycode)
-      continue;
-    if (keybits[keycode / 8] & 1 << (keycode % 8))
-      return true;
-  }
-  return false;
-}
-
-// GtkIMContext event handlers.
-
-void X11InputMethodContextImplGtk::OnCommit(GtkIMContext* context,
-                                            gchar* text) {
-  if (context != gtk_context_)
-    return;
-
-  delegate_->OnCommit(base::UTF8ToUTF16(text));
-}
-
-void X11InputMethodContextImplGtk::OnPreeditChanged(GtkIMContext* context) {
-  if (context != gtk_context_)
-    return;
-
-  gchar* str = nullptr;
-  PangoAttrList* attrs = nullptr;
-  gint cursor_pos = 0;
-  gtk_im_context_get_preedit_string(context, &str, &attrs, &cursor_pos);
-  ui::CompositionText composition_text;
-  ui::ExtractCompositionTextFromGtkPreedit(str, attrs, cursor_pos,
-                                           &composition_text);
-  g_free(str);
-  pango_attr_list_unref(attrs);
-
-  delegate_->OnPreeditChanged(composition_text);
-}
-
-void X11InputMethodContextImplGtk::OnPreeditEnd(GtkIMContext* context) {
-  if (context != gtk_context_)
-    return;
-
-  delegate_->OnPreeditEnd();
-}
-
-void X11InputMethodContextImplGtk::OnPreeditStart(GtkIMContext* context) {
-  if (context != gtk_context_)
-    return;
-
-  delegate_->OnPreeditStart();
-}
-
-}  // namespace libgtkui
diff --git a/chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.h b/chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.h
deleted file mode 100644
index ae888e55..0000000
--- a/chrome/browser/ui/libgtkui/x11_input_method_context_impl_gtk.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_LIBGTKUI_X11_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
-#define CHROME_BROWSER_UI_LIBGTKUI_X11_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
-
-#include <unordered_set>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "ui/base/glib/glib_integers.h"
-#include "ui/base/glib/glib_signal.h"
-#include "ui/base/ime/linux/linux_input_method_context.h"
-#include "ui/events/platform_event.h"
-#include "ui/gfx/geometry/rect.h"
-
-typedef union _GdkEvent GdkEvent;
-typedef struct _GtkIMContext GtkIMContext;
-
-namespace libgtkui {
-
-// An implementation of LinuxInputMethodContext which is based on X11 event loop
-// and uses GtkIMContext(gtk-immodule) as a bridge from/to underlying IMEs.
-class X11InputMethodContextImplGtk : public ui::LinuxInputMethodContext {
- public:
-  X11InputMethodContextImplGtk(ui::LinuxInputMethodContextDelegate* delegate,
-                               bool is_simple);
-  ~X11InputMethodContextImplGtk() override;
-
-  // Overriden from ui::LinuxInputMethodContext
-  bool DispatchKeyEvent(const ui::KeyEvent& key_event) override;
-  void SetCursorLocation(const gfx::Rect& rect) override;
-  void Reset() override;
-  void Focus() override;
-  void Blur() override;
-  void SetSurroundingText(const base::string16& text,
-                          const gfx::Range& selection_range) override;
-
- private:
-  // Resets the cache of X modifier keycodes.
-  // TODO(yukishiino): We should call this method whenever X keyboard mapping
-  // changes, for example when a user switched to another keyboard layout.
-  void ResetXModifierKeycodesCache();
-
-  // Constructs a GdkEventKey from a XKeyEvent and returns it.  Otherwise,
-  // returns nullptr.  The returned GdkEvent must be freed by gdk_event_free.
-  GdkEvent* GdkEventFromNativeEvent(const ui::PlatformEvent& native_event);
-
-  // Returns true if the hardware |keycode| is assigned to a modifier key.
-  bool IsKeycodeModifierKey(unsigned int keycode) const;
-
-  // Returns true if one of |keycodes| is pressed.  |keybits| is a bit vector
-  // returned by XQueryKeymap, and |num_keys| is the number of keys in
-  // |keybits|.
-  bool IsAnyOfKeycodesPressed(const std::vector<int>& keycodes,
-                              const char* keybits,
-                              int num_keys) const;
-
-  // GtkIMContext event handlers.  They are shared among |gtk_context_simple_|
-  // and |gtk_multicontext_|.
-  CHROMEG_CALLBACK_1(X11InputMethodContextImplGtk,
-                     void,
-                     OnCommit,
-                     GtkIMContext*,
-                     gchar*);
-  CHROMEG_CALLBACK_0(X11InputMethodContextImplGtk,
-                     void,
-                     OnPreeditChanged,
-                     GtkIMContext*);
-  CHROMEG_CALLBACK_0(X11InputMethodContextImplGtk,
-                     void,
-                     OnPreeditEnd,
-                     GtkIMContext*);
-  CHROMEG_CALLBACK_0(X11InputMethodContextImplGtk,
-                     void,
-                     OnPreeditStart,
-                     GtkIMContext*);
-
-  // A set of callback functions.  Must not be nullptr.
-  ui::LinuxInputMethodContextDelegate* delegate_;
-
-  // Input method context type flag.
-  //   - true if it supports table-based input methods
-  //   - false if it supports multiple, loadable input methods
-  bool is_simple_;
-
-  // Keeps track of current focus state.
-  bool has_focus_;
-
-  // IME's input GTK context.
-  GtkIMContext* gtk_context_;
-
-  gpointer gdk_last_set_client_window_;
-
-  // Last known caret bounds relative to the screen coordinates.
-  gfx::Rect last_caret_bounds_;
-
-  // A set of hardware keycodes of modifier keys.
-  std::unordered_set<unsigned int> modifier_keycodes_;
-
-  // A list of keycodes of each modifier key.
-  std::vector<int> meta_keycodes_;
-  std::vector<int> super_keycodes_;
-  std::vector<int> hyper_keycodes_;
-
-  DISALLOW_COPY_AND_ASSIGN(X11InputMethodContextImplGtk);
-};
-
-}  // namespace libgtkui
-
-#endif  // CHROME_BROWSER_UI_LIBGTKUI_X11_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
diff --git a/chrome/browser/ui/location_bar/location_bar.cc b/chrome/browser/ui/location_bar/location_bar.cc
deleted file mode 100644
index 834ee92..0000000
--- a/chrome/browser/ui/location_bar/location_bar.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/location_bar/location_bar.h"
-
-#include <memory>
-
-#include "base/scoped_observer.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h"
-#include "content/public/browser/web_contents.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_registry_observer.h"
-#include "extensions/common/extension_set.h"
-#include "extensions/common/feature_switch.h"
-#include "extensions/common/permissions/permissions_data.h"
-
-class LocationBar::ExtensionLoadObserver
-    : public extensions::ExtensionRegistryObserver {
- public:
-  ExtensionLoadObserver(LocationBar* location_bar,
-                        extensions::ExtensionRegistry* registry)
-      : location_bar_(location_bar), scoped_observer_(this) {
-    scoped_observer_.Add(registry);
-  }
-
-  ~ExtensionLoadObserver() override = default;
-
-  void OnExtensionLoaded(content::BrowserContext* browser_context,
-                         const extensions::Extension* extension) override {
-    if (extensions::UIOverrides::RemovesBookmarkButton(extension))
-      location_bar_->UpdateBookmarkStarVisibility();
-  }
-
-  void OnExtensionUnloaded(
-      content::BrowserContext* browser_context,
-      const extensions::Extension* extension,
-      extensions::UnloadedExtensionReason reason) override {
-    if (extensions::UIOverrides::RemovesBookmarkButton(extension))
-      location_bar_->UpdateBookmarkStarVisibility();
-  }
-
- private:
-  // The location bar that owns this object (thus always safe to use).
-  LocationBar* const location_bar_;
-
-  ScopedObserver<extensions::ExtensionRegistry,
-                 extensions::ExtensionRegistryObserver>
-      scoped_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(ExtensionLoadObserver);
-};
-
-LocationBar::LocationBar(Profile* profile) : profile_(profile) {
-  if (profile_) {  // profile_ can be null in tests.
-    extension_load_observer_ = std::make_unique<ExtensionLoadObserver>(
-        this, extensions::ExtensionRegistry::Get(profile_));
-  }
-}
-
-LocationBar::~LocationBar() {
-}
-
-bool LocationBar::IsBookmarkStarHiddenByExtension() const {
-  const extensions::ExtensionSet& extension_set =
-      extensions::ExtensionRegistry::Get(profile_)->enabled_extensions();
-  for (extensions::ExtensionSet::const_iterator i = extension_set.begin();
-       i != extension_set.end(); ++i) {
-    if (extensions::UIOverrides::RemovesBookmarkButton(i->get()) &&
-        ((*i)->permissions_data()->HasAPIPermission(
-             extensions::APIPermission::kBookmarkManagerPrivate) ||
-         extensions::FeatureSwitch::enable_override_bookmarks_ui()
-             ->IsEnabled()))
-      return true;
-  }
-
-  return false;
-}
diff --git a/chrome/browser/ui/location_bar/location_bar.h b/chrome/browser/ui/location_bar/location_bar.h
index 40f3e17..7284936 100644
--- a/chrome/browser/ui/location_bar/location_bar.h
+++ b/chrome/browser/ui/location_bar/location_bar.h
@@ -15,7 +15,6 @@
 
 class LocationBarTesting;
 class OmniboxView;
-class Profile;
 
 namespace content {
 class WebContents;
@@ -28,8 +27,6 @@
 // location bar to be mocked for testing.
 class LocationBar {
  public:
-  explicit LocationBar(Profile* profile);
-
   // The details necessary to open the user's desired omnibox match.
   virtual GURL GetDestinationURL() const = 0;
   virtual WindowOpenDisposition GetWindowOpenDisposition() const = 0;
@@ -61,9 +58,6 @@
   // Updates the state of the images showing the content settings status.
   virtual void UpdateContentSettingsIcons() = 0;
 
-  // Updates the visibility of the bookmark star.
-  virtual void UpdateBookmarkStarVisibility() = 0;
-
   // Saves the state of the location bar to the specified WebContents, so that
   // it can be restored later. (Done when switching tabs).
   virtual void SaveStateToContents(content::WebContents* contents) = 0;
@@ -77,29 +71,12 @@
   // Returns a pointer to the testing interface.
   virtual LocationBarTesting* GetLocationBarForTesting() = 0;
 
-  Profile* profile() const { return profile_; }
-
  protected:
-  virtual ~LocationBar();
-
-  // Checks if any extension has requested that the bookmark star be hidden.
-  bool IsBookmarkStarHiddenByExtension() const;
-
- private:
-  class ExtensionLoadObserver;
-
-  Profile* profile_;
-
-  std::unique_ptr<ExtensionLoadObserver> extension_load_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(LocationBar);
+  virtual ~LocationBar() = default;
 };
 
 class LocationBarTesting {
  public:
-  // Returns whether or not the bookmark star decoration is visible.
-  virtual bool GetBookmarkStarVisibility() = 0;
-
   // Invokes the content setting image at |index|, displaying the bubble.
   // Returns false if there is none.
   virtual bool TestContentSettingImagePressed(size_t index) = 0;
@@ -108,7 +85,7 @@
   virtual bool IsContentSettingBubbleShowing(size_t index) = 0;
 
  protected:
-  virtual ~LocationBarTesting() {}
+  virtual ~LocationBarTesting() = default;
 };
 
 #endif  // CHROME_BROWSER_UI_LOCATION_BAR_LOCATION_BAR_H_
diff --git a/chrome/browser/ui/location_bar/location_bar_browsertest.cc b/chrome/browser/ui/location_bar/location_bar_browsertest.cc
deleted file mode 100644
index b0a24b8..0000000
--- a/chrome/browser/ui/location_bar/location_bar_browsertest.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/location_bar/location_bar.h"
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/extension_builder.h"
-#include "extensions/common/feature_switch.h"
-#include "extensions/common/value_builder.h"
-
-class LocationBarBrowserTest : public extensions::ExtensionBrowserTest {
- public:
-  LocationBarBrowserTest() {}
-  ~LocationBarBrowserTest() override {}
-
- protected:
-  void SetUpCommandLine(base::CommandLine* command_line) override;
-
- private:
-  std::unique_ptr<extensions::FeatureSwitch::ScopedOverride> enable_override_;
-
-  DISALLOW_COPY_AND_ASSIGN(LocationBarBrowserTest);
-};
-
-void LocationBarBrowserTest::SetUpCommandLine(base::CommandLine* command_line) {
-  extensions::ExtensionBrowserTest::SetUpCommandLine(command_line);
-
-  // In order to let a vanilla extension override the bookmark star, we have to
-  // enable the switch.
-  enable_override_ =
-      std::make_unique<extensions::FeatureSwitch::ScopedOverride>(
-          extensions::FeatureSwitch::enable_override_bookmarks_ui(), true);
-}
-
-// Test that installing an extension that overrides the bookmark star
-// successfully hides the star.
-IN_PROC_BROWSER_TEST_F(LocationBarBrowserTest,
-                       ExtensionCanOverrideBookmarkStar) {
-  LocationBarTesting* location_bar =
-      browser()->window()->GetLocationBar()->GetLocationBarForTesting();
-  // By default, we should show the star.
-  EXPECT_TRUE(location_bar->GetBookmarkStarVisibility());
-
-  // Create and install an extension that overrides the bookmark star.
-  extensions::DictionaryBuilder chrome_ui_overrides;
-  chrome_ui_overrides.Set(
-      "bookmarks_ui",
-      extensions::DictionaryBuilder().Set("remove_button", true).Build());
-  scoped_refptr<const extensions::Extension> extension =
-      extensions::ExtensionBuilder()
-          .SetManifest(
-              extensions::DictionaryBuilder()
-                  .Set("name", "overrides star")
-                  .Set("manifest_version", 2)
-                  .Set("version", "0.1")
-                  .Set("description", "override the star")
-                  .Set("chrome_ui_overrides", chrome_ui_overrides.Build())
-                  .Build())
-          .Build();
-  extension_service()->AddExtension(extension.get());
-
-  // The star should now be hidden.
-  EXPECT_FALSE(location_bar->GetBookmarkStarVisibility());
-}
diff --git a/chrome/browser/ui/page_action/page_action_icon_type.h b/chrome/browser/ui/page_action/page_action_icon_type.h
index 9a43f3c..0218f918 100644
--- a/chrome/browser/ui/page_action/page_action_icon_type.h
+++ b/chrome/browser/ui/page_action/page_action_icon_type.h
@@ -20,6 +20,7 @@
   kNativeFileSystemAccess,
   kClickToCall,
   kCookieControls,
+  kBookmarkStar,
 };
 
 #endif  // CHROME_BROWSER_UI_PAGE_ACTION_PAGE_ACTION_ICON_TYPE_H_
diff --git a/chrome/browser/ui/views/crostini/crostini_installer_view.cc b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
index ab368e6..8fc4f1ff 100644
--- a/chrome/browser/ui/views/crostini/crostini_installer_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
@@ -16,6 +16,8 @@
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/chrome_unscaled_resources.h"
 #include "chrome/grit/generated_resources.h"
@@ -106,6 +108,8 @@
 
 }  // namespace
 
+// TODO(lxj): |CrostiniInstallerView| will be removed at some point. We will
+// wait until then to find a better place for this function.
 void crostini::ShowCrostiniInstallerView(
     Profile* profile,
     crostini::CrostiniUISurface ui_surface) {
@@ -116,8 +120,13 @@
   }
   base::UmaHistogramEnumeration(kCrostiniSetupSourceHistogram, ui_surface,
                                 crostini::CrostiniUISurface::kCount);
-  return CrostiniInstallerView::Show(
-      profile, crostini::CrostiniInstaller::GetForProfile(profile));
+
+  if (chromeos::CrostiniInstallerUI::IsEnabled()) {
+    return chromeos::CrostiniInstallerDialog::Show(profile);
+  } else {
+    return CrostiniInstallerView::Show(
+        profile, crostini::CrostiniInstaller::GetForProfile(profile));
+  }
 }
 
 // static
@@ -126,6 +135,8 @@
     crostini::CrostiniInstallerUIDelegate* delegate) {
   DCHECK(crostini::IsCrostiniUIAllowedForProfile(profile));
   if (!g_crostini_installer_view) {
+    DCHECK(!crostini::CrostiniManager::GetForProfile(profile)
+                ->GetInstallerViewStatus());
     g_crostini_installer_view = new CrostiniInstallerView(profile, delegate);
     views::DialogDelegate::CreateDialogWidget(g_crostini_installer_view,
                                               nullptr, nullptr);
@@ -141,7 +152,6 @@
     g_crostini_installer_view->big_message_label_->SetText(
         l10n_util::GetStringFUTF16(IDS_CROSTINI_INSTALLER_TITLE, device_type));
 
-    // TODO(lxj): Move installer status tracking into the CrostiniInstaller.
     crostini::CrostiniManager::GetForProfile(profile)->SetInstallerViewStatus(
         true);
   }
diff --git a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
index 30bb7c5..66278cb 100644
--- a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
+++ b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
@@ -841,8 +841,9 @@
   EXPECT_EQ(initial_history_count + 1, controller.GetEntryCount());
 }
 
-#if defined(OS_WIN)
+#if defined(OS_WIN) || defined(THREAD_SANITIZER)
 // Flaky: https://crbug.com/988938
+// Race condition: crbug.com/1005095
 #define MAYBE_DropForbiddenUrlFromOutside DISABLED_DropForbiddenUrlFromOutside
 #else
 #define MAYBE_DropForbiddenUrlFromOutside DropForbiddenUrlFromOutside
diff --git a/chrome/browser/ui/views/extensions/bookmark_override_browsertest.cc b/chrome/browser/ui/views/extensions/bookmark_override_browsertest.cc
index 487efc1..fd74bd93 100644
--- a/chrome/browser/ui/views/extensions/bookmark_override_browsertest.cc
+++ b/chrome/browser/ui/views/extensions/bookmark_override_browsertest.cc
@@ -49,7 +49,9 @@
   // Check that the BookmarkBubbleView is shown when clicking on the star.
   BrowserView* browser_view = reinterpret_cast<BrowserView*>(
       browser()->window());
-  views::View* star_view = browser_view->toolbar()->location_bar()->star_view();
+  views::View* star_view =
+      browser_view->toolbar_button_provider()->GetPageActionIconView(
+          PageActionIconType::kBookmarkStar);
 
   ui::MouseEvent pressed_event(
       ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc
index 0652d62e..5fdc8381 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/hover_button_controller.h"
+#include "chrome/browser/ui/views/layout/animating_layout_manager.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/common/chrome_paths.h"
@@ -29,6 +30,33 @@
 #include "ui/views/test/widget_test.h"
 #include "ui/views/window/dialog_client_view.h"
 
+// Helper to wait until the hover card widget is visible.
+class AnimatingLayoutWaiter : public AnimatingLayoutManager::Observer {
+ public:
+  explicit AnimatingLayoutWaiter(AnimatingLayoutManager* animating_layout)
+      : animating_layout_(animating_layout) {
+    animating_layout_->AddObserver(this);
+  }
+  ~AnimatingLayoutWaiter() override { animating_layout_->RemoveObserver(this); }
+
+  void Wait() {
+    if (!animating_layout_->is_animating())
+      return;
+    run_loop_.Run();
+  }
+
+  // AnimatingLayoutManager overrides:
+  void OnLayoutIsAnimatingChanged(AnimatingLayoutManager* source,
+                                  bool is_animating) override {
+    if (!is_animating)
+      run_loop_.Quit();
+  }
+
+ private:
+  AnimatingLayoutManager* const animating_layout_;
+  base::RunLoop run_loop_;
+};
+
 class ExtensionsMenuViewBrowserTest : public DialogBrowserTest {
  protected:
   void LoadTestExtension(const std::string& extension) {
@@ -91,6 +119,12 @@
         ->primary_action_button_for_testing()
         ->button_controller()
         ->OnMouseReleased(click_event);
+    AnimatingLayoutWaiter waiter(
+        BrowserView::GetBrowserViewForBrowser(browser())
+            ->toolbar()
+            ->extensions_container()
+            ->animating_layout_for_testing());
+    waiter.Wait();
   }
 
   base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
index 047b765..b271a1c 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -11,7 +11,10 @@
 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
 #include "chrome/browser/ui/views/extensions/extensions_menu_view.h"
 #include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h"
+#include "chrome/browser/ui/views/layout/animating_layout_manager.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h"
+#include "ui/views/layout/flex_layout.h"
+#include "ui/views/view_class_properties.h"
 #include "ui/views/widget/widget_observer.h"
 
 struct ExtensionsToolbarContainer::DropInfo {
@@ -35,6 +38,15 @@
       model_(ToolbarActionsModel::Get(browser_->profile())),
       model_observer_(this),
       extensions_button_(new ExtensionsToolbarButton(browser_, this)) {
+  animating_layout_ =
+      SetLayoutManager(std::make_unique<AnimatingLayoutManager>());
+  animating_layout_->SetShouldAnimateBounds(true);
+  auto* flex_layout = animating_layout_->SetTargetLayoutManager(
+      std::make_unique<views::FlexLayout>());
+  flex_layout->SetCollapseMargins(true)
+      .SetIgnoreDefaultMainAxisMargins(true)
+      .SetDefault(views::kMarginsKey,
+                  gfx::Insets(0, GetLayoutConstant(TOOLBAR_ELEMENT_PADDING)));
   model_observer_.Add(model_);
   AddMainButton(extensions_button_);
   CreateActions();
@@ -121,19 +133,16 @@
     ToolbarActionViewController* action,
     bool is_sticky,
     const base::Closure& closure) {
-  // TODO(pbos): Animate popout.
   // TODO(pbos): Highlight popout differently.
   DCHECK(!popped_out_action_);
   popped_out_action_ = action;
   icons_[popped_out_action_->GetId()]->SetVisible(true);
   ReorderViews();
-  closure.Run();
+  animating_layout_->RunOrQueueAction(closure);
 }
 
 void ExtensionsToolbarContainer::ShowToolbarActionBubble(
     std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller) {
-  // TODO(pbos): Make sure we finish animations before showing the bubble.
-
   auto iter = icons_.find(controller->GetAnchorActionId());
 
   views::View* const anchor_view = iter != icons_.end()
@@ -142,11 +151,10 @@
 
   anchor_view->SetVisible(true);
 
-  active_bubble_ = new ToolbarActionsBarBubbleViews(
-      anchor_view, anchor_view != extensions_button_, std::move(controller));
-  views::BubbleDialogDelegateView::CreateBubble(active_bubble_)
-      ->AddObserver(this);
-  active_bubble_->Show();
+  animating_layout_->RunOrQueueAction(
+      base::BindOnce(&ExtensionsToolbarContainer::ShowActiveBubble,
+                     weak_ptr_factory_.GetWeakPtr(), anchor_view,
+                     base::Passed(std::move(controller))));
 }
 
 void ExtensionsToolbarContainer::ShowToolbarActionBubbleAsync(
@@ -413,3 +421,13 @@
                0);
   return std::min(unclamped_count, actions_.size());
 }
+
+void ExtensionsToolbarContainer::ShowActiveBubble(
+    views::View* anchor_view,
+    std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller) {
+  active_bubble_ = new ToolbarActionsBarBubbleViews(
+      anchor_view, anchor_view != extensions_button_, std::move(controller));
+  views::BubbleDialogDelegateView::CreateBubble(active_bubble_)
+      ->AddObserver(this);
+  active_bubble_->Show();
+}
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
index 1ebfa3bf9..7358f94 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
@@ -15,6 +15,7 @@
 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_icon_container_view.h"
 
+class AnimatingLayoutManager;
 class Browser;
 class ExtensionsToolbarButton;
 class ToolbarActionViewController;
@@ -45,11 +46,19 @@
     return active_bubble_;
   }
 
+  AnimatingLayoutManager* animating_layout_for_testing() {
+    return animating_layout_;
+  }
+
   // ToolbarIconContainerView:
   void UpdateAllIcons() override;
 
   ToolbarActionView* GetViewForId(const std::string& id);
 
+  void ShowActiveBubble(
+      views::View* anchor_view,
+      std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller);
+
  private:
   // A struct representing the position and action being dragged.
   struct DropInfo;
@@ -158,6 +167,8 @@
   // there is none.
   std::unique_ptr<DropInfo> drop_info_;
 
+  AnimatingLayoutManager* animating_layout_ = nullptr;
+
   base::WeakPtrFactory<ExtensionsToolbarContainer> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionsToolbarContainer);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 9dd19e50..ed96be9 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -803,7 +803,11 @@
 }
 
 void BrowserView::SetStarredState(bool is_starred) {
-  GetLocationBarView()->SetStarToggled(is_starred);
+  PageActionIconView* star_icon =
+      toolbar_button_provider_->GetPageActionIconView(
+          PageActionIconType::kBookmarkStar);
+  if (star_icon)
+    star_icon->SetActive(is_starred);
 }
 
 void BrowserView::SetTranslateIconToggled(bool is_lit) {
@@ -2583,6 +2587,20 @@
   top_container_->AddChildView(toolbar_);
   toolbar_->Init();
 
+  views::View* webui_tab_strip_view = nullptr;
+  views::View* webui_tab_strip_caption_buttons = nullptr;
+#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
+  if (base::FeatureList::IsEnabled(features::kWebUITabStrip)) {
+    WebUITabStripContainerView* const webui_tab_strip =
+        top_container_->AddChildView(
+            std::make_unique<WebUITabStripContainerView>(browser_.get()));
+
+    webui_tab_strip_caption_buttons =
+        top_container_->AddChildView(webui_tab_strip->CreateControlButtons());
+    webui_tab_strip_view = webui_tab_strip;
+  }
+#endif  // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
+
   // This browser view may already have a custom button provider set (e.g the
   // hosted app frame).
   if (!toolbar_button_provider_)
@@ -2622,19 +2640,6 @@
   immersive_mode_controller_->Init(this);
   immersive_mode_controller_->AddObserver(this);
 
-  views::View* webui_tab_strip_view = nullptr;
-  views::View* webui_tab_strip_caption_buttons = nullptr;
-#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
-  if (base::FeatureList::IsEnabled(features::kWebUITabStrip)) {
-    WebUITabStripContainerView* const webui_tab_strip = AddChildView(
-        std::make_unique<WebUITabStripContainerView>(browser_.get()));
-
-    webui_tab_strip_caption_buttons =
-        AddChildView(webui_tab_strip->CreateControlButtons());
-    webui_tab_strip_view = webui_tab_strip;
-  }
-#endif  // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
-
   // See https://crbug.com/993502.
   views::View* web_footer_experiment = nullptr;
   if (base::FeatureList::IsEnabled(features::kWebFooterExperiment)) {
diff --git a/chrome/browser/ui/views/keyboard_access_browsertest.cc b/chrome/browser/ui/views/keyboard_access_browsertest.cc
index 3998dbf1..651d79f7 100644
--- a/chrome/browser/ui/views/keyboard_access_browsertest.cc
+++ b/chrome/browser/ui/views/keyboard_access_browsertest.cc
@@ -484,13 +484,8 @@
 }
 
 #if defined(OS_WIN)  // These keys are Windows-only.
-// Disabled on debug due to high flake rate; see https://crbug.com/846623.
-#if !defined(NDEBUG)
-#define MAYBE_BackForwardKeys DISABLED_BackForwardKeys
-#else
-#define MAYBE_BackForwardKeys BackForwardKeys
-#endif
-IN_PROC_BROWSER_TEST_F(KeyboardAccessTest, MAYBE_BackForwardKeys) {
+// Disabled due to high flake rate; see https://crbug.com/846623.
+IN_PROC_BROWSER_TEST_F(KeyboardAccessTest, DISABLED_BackForwardKeys) {
   // Navigate to create some history.
   ui_test_utils::NavigateToURL(browser(), GURL("chrome://version/"));
   ui_test_utils::NavigateToURL(browser(), GURL("chrome://about/"));
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 11538a36..a06dc46d 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -18,7 +18,6 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/command_updater.h"
-#include "chrome/browser/defaults.h"
 #include "chrome/browser/extensions/api/omnibox/omnibox_api.h"
 #include "chrome/browser/extensions/extension_ui_util.h"
 #include "chrome/browser/extensions/tab_helper.h"
@@ -65,7 +64,6 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
-#include "components/bookmarks/common/bookmark_pref_names.h"
 #include "components/content_settings/core/common/features.h"
 #include "components/dom_distiller/core/dom_distiller_switches.h"
 #include "components/favicon/content/content_favicon_driver.h"
@@ -152,16 +150,12 @@
                                  CommandUpdater* command_updater,
                                  Delegate* delegate,
                                  bool is_popup_mode)
-    : LocationBar(profile),
-      AnimationDelegateViews(this),
+    : AnimationDelegateViews(this),
       ChromeOmniboxEditController(command_updater),
       browser_(browser),
+      profile_(profile),
       delegate_(delegate),
       is_popup_mode_(is_popup_mode) {
-  edit_bookmarks_enabled_.Init(
-      bookmarks::prefs::kEditBookmarksEnabled, profile->GetPrefs(),
-      base::Bind(&LocationBarView::UpdateWithoutTabRestore,
-                 base::Unretained(this)));
   md_observer_.Add(ui::MaterialDesignController::GetInstance());
 }
 
@@ -189,7 +183,7 @@
 
   // Initialize the Omnibox view.
   auto omnibox_view = std::make_unique<OmniboxViewViews>(
-      this, std::make_unique<ChromeOmniboxClient>(this, profile()),
+      this, std::make_unique<ChromeOmniboxClient>(this, profile_),
       is_popup_mode_, this, font_list);
   omnibox_view->Init();
   omnibox_view_ = AddChildView(std::move(omnibox_view));
@@ -215,10 +209,10 @@
       AddChildView(std::move(ime_inline_autocomplete_view));
 
   selected_keyword_view_ = AddChildView(
-      std::make_unique<SelectedKeywordView>(this, font_list, profile()));
+      std::make_unique<SelectedKeywordView>(this, font_list, profile_));
 
   keyword_hint_view_ =
-      AddChildView(std::make_unique<KeywordHintView>(this, profile()));
+      AddChildView(std::make_unique<KeywordHintView>(this, profile_));
 
   SkColor icon_color = GetColor(OmniboxPart::RESULTS_ICON);
 
@@ -277,6 +271,9 @@
     params.types_enabled.push_back(PageActionIconType::kSaveCard);
     params.types_enabled.push_back(PageActionIconType::kLocalCardMigration);
   }
+  if (browser_ && !is_popup_mode_)
+    params.types_enabled.push_back(PageActionIconType::kBookmarkStar);
+
   params.icon_size = GetLayoutConstant(LOCATION_BAR_ICON_SIZE);
   params.icon_color = icon_color;
   params.between_icon_spacing = 0;
@@ -287,20 +284,6 @@
   omnibox_page_action_icon_container_view_ = AddChildView(
       std::make_unique<OmniboxPageActionIconContainerView>(params));
 
-  std::vector<std::unique_ptr<PageActionIconView>> page_action_icons;
-  if (browser_) {
-    auto star_view =
-        std::make_unique<StarView>(command_updater(), browser_, this);
-    star_view_ = star_view.get();
-    page_action_icons.push_back(std::move(star_view));
-  }
-
-  for (auto& icon_view : page_action_icons) {
-    icon_view->SetVisible(false);
-    icon_view->SetIconColor(icon_color);
-    page_action_icons_.push_back(AddChildView(std::move(icon_view)));
-  }
-
   auto clear_all_button = views::CreateVectorImageButton(this);
   clear_all_button->SetTooltipText(
       l10n_util::GetStringUTF16(IDS_OMNIBOX_CLEAR_ALL));
@@ -321,7 +304,7 @@
 }
 
 SkColor LocationBarView::GetColor(OmniboxPart part) const {
-  return GetOmniboxColor(&ThemeService::GetThemeProviderForProfile(profile()),
+  return GetOmniboxColor(&ThemeService::GetThemeProviderForProfile(profile_),
                          part);
 }
 
@@ -354,11 +337,6 @@
   return background;
 }
 
-void LocationBarView::SetStarToggled(bool on) {
-  if (star_view_)
-    star_view_->SetToggled(on);
-}
-
 gfx::Point LocationBarView::GetOmniboxViewOrigin() const {
   gfx::Point origin(omnibox_view_->origin());
   origin.set_x(GetMirroredXInView(origin.x()));
@@ -538,12 +516,12 @@
     if (selected_keyword_view_->keyword() != keyword) {
       selected_keyword_view_->SetKeyword(keyword);
       const TemplateURL* template_url =
-          TemplateURLServiceFactory::GetForProfile(profile())
+          TemplateURLServiceFactory::GetForProfile(profile_)
               ->GetTemplateURLForKeyword(keyword);
       if (template_url &&
           (template_url->type() == TemplateURL::OMNIBOX_API_EXTENSION)) {
         gfx::Image image =
-            extensions::OmniboxAPI::Get(profile())->GetOmniboxIcon(
+            extensions::OmniboxAPI::Get(profile_)->GetOmniboxIcon(
                 template_url->GetExtensionId());
         selected_keyword_view_->SetImage(image.AsImageSkia());
       } else if (template_url && template_url->type() == TemplateURL::NORMAL &&
@@ -581,8 +559,6 @@
     }
   };
 
-  if (star_view_)
-    add_trailing_decoration(star_view_);
   add_trailing_decoration(omnibox_page_action_icon_container_view_);
   for (ContentSettingViews::const_reverse_iterator i(
            content_setting_views_.rbegin());
@@ -653,8 +629,6 @@
 
   SkColor icon_color = GetColor(OmniboxPart::RESULTS_ICON);
   omnibox_page_action_icon_container_view_->SetIconColor(icon_color);
-  for (PageActionIconView* icon_view : page_action_icons_)
-    icon_view->SetIconColor(icon_color);
   for (ContentSettingImageView* image_view : content_setting_views_)
     image_view->SetIconColor(icon_color);
 
@@ -679,11 +653,6 @@
   RefreshPageActionIconViews();
   location_icon_view_->Update(/*suppress_animations=*/contents);
 
-  if (star_view_) {
-    // TODO(calamity): Refactor Update to use PageActionIconView::Refresh.
-    UpdateBookmarkStarVisibility();
-  }
-
   if (contents)
     omnibox_view_->OnTabChanged(contents);
   else
@@ -703,25 +672,8 @@
 }
 
 bool LocationBarView::ActivateFirstInactiveBubbleForAccessibility() {
-  if (omnibox_page_action_icon_container_view_
-          ->ActivateFirstInactiveBubbleForAccessibility()) {
-    return true;
-  }
-
-  auto result = std::find_if(
-      page_action_icons_.begin(), page_action_icons_.end(),
-      [](PageActionIconView* view) {
-        if (!view || !view->GetVisible() || !view->GetBubble())
-          return false;
-
-        views::Widget* widget = view->GetBubble()->GetWidget();
-        return widget && widget->IsVisible() && !widget->IsActive();
-      });
-
-  if (result != page_action_icons_.end())
-    (*result)->GetBubble()->GetWidget()->Show();
-
-  return result != page_action_icons_.end();
+  return omnibox_page_action_icon_container_view_
+      ->ActivateFirstInactiveBubbleForAccessibility();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -814,8 +766,7 @@
 
 int LocationBarView::GetMinimumTrailingWidth() const {
   int trailing_width =
-      IncrementalMinimumWidth(omnibox_page_action_icon_container_view_) +
-      IncrementalMinimumWidth(star_view_);
+      IncrementalMinimumWidth(omnibox_page_action_icon_container_view_);
 
   for (auto* content_setting_view : content_setting_views_)
     trailing_width += IncrementalMinimumWidth(content_setting_view);
@@ -897,9 +848,6 @@
   }
 
   omnibox_page_action_icon_container_view_->UpdateAll();
-
-  for (PageActionIconView* icon : page_action_icons_)
-    icon->Update();
 }
 
 void LocationBarView::ButtonPressed(views::Button* sender,
@@ -1023,16 +971,6 @@
   }
 }
 
-void LocationBarView::UpdateBookmarkStarVisibility() {
-  if (star_view_) {
-    star_view_->SetVisible(browser_defaults::bookmarks_enabled &&
-                           !is_popup_mode_ &&
-                           !IsLocationBarUserInputInProgress() &&
-                           edit_bookmarks_enabled_.GetValue() &&
-                           !IsBookmarkStarHiddenByExtension());
-  }
-}
-
 inline bool LocationBarView::UpdateSendTabToSelfIcon() {
   PageActionIconView* icon =
       omnibox_page_action_icon_container_view_->GetIconView(
@@ -1055,11 +993,6 @@
 ////////////////////////////////////////////////////////////////////////////////
 // LocationBarView, private LocationBarTesting implementation:
 
-bool LocationBarView::GetBookmarkStarVisibility() {
-  DCHECK(star_view_);
-  return star_view_->GetVisible();
-}
-
 bool LocationBarView::TestContentSettingImagePressed(size_t index) {
   if (index >= content_setting_views_.size())
     return false;
@@ -1109,8 +1042,7 @@
     return;  // The border is painted by our Background.
 
   gfx::Rect bounds(GetContentsBounds());
-  const SkColor border_color =
-      GetOpaqueBorderColor(profile()->IsOffTheRecord());
+  const SkColor border_color = GetOpaqueBorderColor(profile_->IsOffTheRecord());
   BrowserView::Paint1pxHorizontalLine(canvas, border_color, bounds, false);
   BrowserView::Paint1pxHorizontalLine(canvas, border_color, bounds, true);
 }
@@ -1305,8 +1237,8 @@
   DCHECK(GetWidget());
   views::BubbleDialogDelegateView* bubble =
       PageInfoBubbleView::CreatePageInfoBubble(
-          this, gfx::Rect(), GetWidget()->GetNativeWindow(), profile(),
-          contents, entry->GetVirtualURL(), helper->GetSecurityLevel(),
+          this, gfx::Rect(), GetWidget()->GetNativeWindow(), profile_, contents,
+          entry->GetVirtualURL(), helper->GetSecurityLevel(),
           *helper->GetVisibleSecurityState(),
           base::BindOnce(&LocationBarView::OnPageInfoBubbleClosed,
                          weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h
index c736c9e..fc4848d 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.h
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -26,7 +26,6 @@
 #include "chrome/browser/ui/views/location_bar/location_icon_view.h"
 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
-#include "components/prefs/pref_member.h"
 #include "components/security_state/core/security_state.h"
 #include "ui/base/material_design/material_design_controller_observer.h"
 #include "ui/gfx/animation/slide_animation.h"
@@ -48,7 +47,6 @@
 class OmniboxPageActionIconContainerView;
 class Profile;
 class SelectedKeywordView;
-class StarView;
 
 namespace views {
 class ImageButton;
@@ -131,12 +129,6 @@
   // Returns the delegate.
   Delegate* delegate() const { return delegate_; }
 
-  // Toggles the star on or off.
-  void SetStarToggled(bool on);
-
-  // The star. It may not be visible.  It will be null when |browser_| is null.
-  StarView* star_view() { return star_view_; }
-
   OmniboxPageActionIconContainerView*
   omnibox_page_action_icon_container_view() {
     return omnibox_page_action_icon_container_view_;
@@ -219,6 +211,7 @@
   void OnOmniboxHovered(bool is_hovering);
 
   Browser* browser() { return browser_; }
+  Profile* profile() { return profile_; }
 
   // LocationIconView::Delegate
   bool IsEditingOrEmpty() const override;
@@ -290,13 +283,11 @@
   void AcceptInput(base::TimeTicks match_selection_timestamp) override;
   void FocusSearch() override;
   void UpdateContentSettingsIcons() override;
-  void UpdateBookmarkStarVisibility() override;
   void SaveStateToContents(content::WebContents* contents) override;
   const OmniboxView* GetOmniboxView() const override;
   LocationBarTesting* GetLocationBarForTesting() override;
 
   // LocationBarTesting:
-  bool GetBookmarkStarVisibility() override;
   bool TestContentSettingImagePressed(size_t index) override;
   bool IsContentSettingBubbleShowing(size_t index) override;
 
@@ -349,6 +340,9 @@
   // window, so this may be NULL.
   Browser* const browser_;
 
+  // May be nullptr in tests.
+  Profile* const profile_;
+
   OmniboxViewViews* omnibox_view_ = nullptr;
 
   // Our delegate.
@@ -383,9 +377,6 @@
   OmniboxPageActionIconContainerView* omnibox_page_action_icon_container_view_ =
       nullptr;
 
-  // The star for bookmarking.  It will be null when |browser_| is null.
-  StarView* star_view_ = nullptr;
-
   // An [x] that appears in touch mode (when the OSK is visible) and allows the
   // user to clear all text.
   views::ImageButton* clear_all_button_ = nullptr;
@@ -397,13 +388,6 @@
   // bar is read-only.
   const bool is_popup_mode_;
 
-  // Tracks this preference to determine whether bookmark editing is allowed.
-  BooleanPrefMember edit_bookmarks_enabled_;
-
-  // A list of all page action icons that haven't yet migrated into the
-  // PageActionIconContainerView (https://crbug.com/788051), ordered by focus.
-  std::vector<PageActionIconView*> page_action_icons_;
-
   // The focus ring, if one is in use.
   std::unique_ptr<views::FocusRing> focus_ring_;
 
diff --git a/chrome/browser/ui/views/location_bar/star_view.cc b/chrome/browser/ui/views/location_bar/star_view.cc
index bc7278ad..dac2a2eb 100644
--- a/chrome/browser/ui/views/location_bar/star_view.cc
+++ b/chrome/browser/ui/views/location_bar/star_view.cc
@@ -7,18 +7,27 @@
 #include <string>
 
 #include "base/metrics/histogram_macros.h"
+#include "base/scoped_observer.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/defaults.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/bookmarks/bookmark_stats.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
+#include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/bookmarks/common/bookmark_pref_names.h"
 #include "components/omnibox/browser/vector_icons.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/variations/variations_associated_data.h"
+#include "content/public/browser/web_contents.h"
+#include "extensions/common/extension_set.h"
+#include "extensions/common/feature_switch.h"
+#include "extensions/common/permissions/permissions_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -47,16 +56,19 @@
                    PageActionIconView::Delegate* delegate)
     : PageActionIconView(command_updater, IDC_BOOKMARK_THIS_TAB, delegate),
       browser_(browser) {
+  DCHECK(browser_);
+  extension_observer_.Add(
+      extensions::ExtensionRegistry::Get(browser_->profile()));
+  edit_bookmarks_enabled_.Init(
+      bookmarks::prefs::kEditBookmarksEnabled, browser_->profile()->GetPrefs(),
+      base::BindRepeating(&StarView::EditBookmarksPrefUpdated,
+                          base::Unretained(this)));
   SetID(VIEW_ID_STAR_BUTTON);
-  SetToggled(false);
+  SetActive(false);
 }
 
 StarView::~StarView() {}
 
-void StarView::SetToggled(bool on) {
-  PageActionIconView::SetActiveInternal(on);
-}
-
 void StarView::ShowPromo() {
   FeaturePromoBubbleView* bookmark_promo_bubble =
       FeaturePromoBubbleView::CreateOwned(
@@ -66,15 +78,18 @@
   if (!bookmark_promo_observer_.IsObserving(
           bookmark_promo_bubble->GetWidget())) {
     bookmark_promo_observer_.Add(bookmark_promo_bubble->GetWidget());
-    SetActiveInternal(false);
+    SetActive(false);
     UpdateIconImage();
   }
 }
 
 bool StarView::Update() {
-  // Updates are handled by |LocationBarView::UpdateBookmarkStarVisibility()|.
-  // TODO(https://crbug.com/788051): Make updates handled here.
-  return false;
+  bool was_visible = GetVisible();
+  SetVisible(browser_defaults::bookmarks_enabled &&
+             !delegate()->IsLocationBarUserInputInProgress() &&
+             edit_bookmarks_enabled_.GetValue() &&
+             !IsBookmarkStarHiddenByExtension());
+  return was_visible != GetVisible();
 }
 
 void StarView::OnExecuting(PageActionIconView::ExecuteSource execute_source) {
@@ -95,12 +110,8 @@
 }
 
 void StarView::ExecuteCommand(ExecuteSource source) {
-  if (browser_) {
-    OnExecuting(source);
-    chrome::BookmarkCurrentTabIgnoringExtensionOverrides(browser_);
-  } else {
-    PageActionIconView::ExecuteCommand(source);
-  }
+  OnExecuting(source);
+  chrome::BookmarkCurrentTabIgnoringExtensionOverrides(browser_);
 }
 
 views::BubbleDialogDelegateView* StarView::GetBubble() const {
@@ -126,7 +137,44 @@
 void StarView::OnWidgetDestroying(views::Widget* widget) {
   if (bookmark_promo_observer_.IsObserving(widget)) {
     bookmark_promo_observer_.Remove(widget);
-    SetActiveInternal(false);
+    SetActive(false);
     UpdateIconImage();
   }
 }
+
+void StarView::OnExtensionLoaded(content::BrowserContext* browser_context,
+                                 const extensions::Extension* extension) {
+  if (extensions::UIOverrides::RemovesBookmarkButton(extension))
+    Update();
+}
+
+void StarView::OnExtensionUnloaded(content::BrowserContext* browser_context,
+                                   const extensions::Extension* extension,
+                                   extensions::UnloadedExtensionReason reason) {
+  if (extensions::UIOverrides::RemovesBookmarkButton(extension))
+    Update();
+}
+
+void StarView::EditBookmarksPrefUpdated() {
+  Update();
+}
+
+bool StarView::IsBookmarkStarHiddenByExtension() const {
+  const extensions::ExtensionSet& extension_set =
+      extensions::ExtensionRegistry::Get(browser_->profile())
+          ->enabled_extensions();
+  for (const scoped_refptr<const extensions::Extension> extension :
+       extension_set) {
+    if (!extensions::UIOverrides::RemovesBookmarkButton(extension.get()))
+      continue;
+    if (extension->permissions_data()->HasAPIPermission(
+            extensions::APIPermission::kBookmarkManagerPrivate)) {
+      return true;
+    }
+    if (extensions::FeatureSwitch::enable_override_bookmarks_ui()
+            ->IsEnabled()) {
+      return true;
+    }
+  }
+  return false;
+}
diff --git a/chrome/browser/ui/views/location_bar/star_view.h b/chrome/browser/ui/views/location_bar/star_view.h
index f69b1662..e94f20d 100644
--- a/chrome/browser/ui/views/location_bar/star_view.h
+++ b/chrome/browser/ui/views/location_bar/star_view.h
@@ -8,6 +8,9 @@
 #include "base/macros.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
+#include "components/prefs/pref_member.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_registry_observer.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
@@ -15,16 +18,15 @@
 class CommandUpdater;
 
 // The star icon to show a bookmark bubble.
-class StarView : public PageActionIconView, public views::WidgetObserver {
+class StarView : public PageActionIconView,
+                 public views::WidgetObserver,
+                 public extensions::ExtensionRegistryObserver {
  public:
   StarView(CommandUpdater* command_updater,
            Browser* browser,
            PageActionIconView::Delegate* delegate);
   ~StarView() override;
 
-  // Toggles the star on or off.
-  void SetToggled(bool on);
-
   // Shows the BookmarkPromoBubbleView when the BookmarkTracker calls for it.
   void ShowPromo();
 
@@ -41,14 +43,31 @@
   // views::WidgetObserver:
   void OnWidgetDestroying(views::Widget* widget) override;
 
+  // extensions::ExtensionRegistryObserver:
+  void OnExtensionLoaded(content::BrowserContext* browser_context,
+                         const extensions::Extension* extension) override;
+  void OnExtensionUnloaded(content::BrowserContext* browser_context,
+                           const extensions::Extension* extension,
+                           extensions::UnloadedExtensionReason reason) override;
+
  private:
+  void EditBookmarksPrefUpdated();
+  bool IsBookmarkStarHiddenByExtension() const;
+
   Browser* const browser_;
 
+  BooleanPrefMember edit_bookmarks_enabled_;
+
   // Observes the BookmarkPromoBubbleView's widget. Used to tell whether the
   // promo is open and gets called back when it closes.
   ScopedObserver<views::Widget, views::WidgetObserver> bookmark_promo_observer_{
       this};
 
+  // Observes Extensions for changes to their |extensions::UIOverrides|.
+  ScopedObserver<extensions::ExtensionRegistry,
+                 extensions::ExtensionRegistryObserver>
+      extension_observer_{this};
+
   DISALLOW_COPY_AND_ASSIGN(StarView);
 };
 
diff --git a/chrome/browser/ui/views/location_bar/star_view_browsertest.cc b/chrome/browser/ui/views/location_bar/star_view_browsertest.cc
deleted file mode 100644
index 81c9fa9bd..0000000
--- a/chrome/browser/ui/views/location_bar/star_view_browsertest.cc
+++ /dev/null
@@ -1,94 +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 "chrome/browser/ui/views/location_bar/star_view.h"
-
-#include "base/command_line.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "chrome/browser/bookmarks/bookmark_model_factory.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "components/bookmarks/browser/bookmark_utils.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/test/browser_test_utils.h"
-#include "content/public/test/test_utils.h"
-#include "ui/base/ui_base_switches.h"
-#include "ui/events/event_utils.h"
-#include "ui/views/animation/test/ink_drop_host_view_test_api.h"
-
-#if defined(OS_WIN)
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#endif
-
-namespace {
-
-class StarViewTest : public InProcessBrowserTest {
- public:
-  StarViewTest() = default;
-  ~StarViewTest() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StarViewTest);
-};
-
-// Verify that clicking the bookmark star a second time hides the bookmark
-// bubble.
-IN_PROC_BROWSER_TEST_F(StarViewTest, HideOnSecondClick) {
-  BrowserView* browser_view =
-      reinterpret_cast<BrowserView*>(browser()->window());
-  views::View* star_view = browser_view->toolbar()->location_bar()->star_view();
-
-  ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
-                               ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
-                               ui::EF_LEFT_MOUSE_BUTTON);
-  ui::MouseEvent released_event(
-      ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
-      ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
-
-  // Verify that clicking once shows the bookmark bubble.
-  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
-  star_view->OnMousePressed(pressed_event);
-  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
-  star_view->OnMouseReleased(released_event);
-  EXPECT_TRUE(BookmarkBubbleView::bookmark_bubble());
-
-  // Verify that clicking again doesn't reshow it.
-  star_view->OnMousePressed(pressed_event);
-  // Hide the bubble manually. In the browser this would normally happen during
-  // the event processing.
-  BookmarkBubbleView::Hide();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
-  star_view->OnMouseReleased(released_event);
-  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
-}
-
-IN_PROC_BROWSER_TEST_F(StarViewTest, InkDropHighlighted) {
-  BrowserView* browser_view =
-      reinterpret_cast<BrowserView*>(browser()->window());
-  StarView* star_view = browser_view->toolbar()->location_bar()->star_view();
-  views::test::InkDropHostViewTestApi ink_drop_test_api(star_view);
-
-  if (ink_drop_test_api.HasInkDrop()) {
-    GURL url("http://test.com");
-    bookmarks::BookmarkModel* model =
-        BookmarkModelFactory::GetForBrowserContext(browser()->profile());
-    bookmarks::AddIfNotBookmarked(model, url, /*title=*/base::string16());
-    browser_view->ShowBookmarkBubble(url, false);
-    EXPECT_EQ(ink_drop_test_api.GetInkDrop()->GetTargetInkDropState(),
-              views::InkDropState::ACTIVATED);
-  }
-}
-
-}  // namespace
diff --git a/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc
new file mode 100644
index 0000000..337e2d2
--- /dev/null
+++ b/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc
@@ -0,0 +1,135 @@
+// 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 "chrome/browser/ui/views/location_bar/star_view.h"
+
+#include "base/command_line.h"
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
+#include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/interactive_test_utils.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/bookmarks/browser/bookmark_utils.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_utils.h"
+#include "extensions/common/extension_builder.h"
+#include "extensions/common/feature_switch.h"
+#include "ui/base/ui_base_switches.h"
+#include "ui/events/event_utils.h"
+#include "ui/views/animation/test/ink_drop_host_view_test_api.h"
+
+#if defined(OS_WIN)
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#endif
+
+namespace {
+
+class StarViewTest : public extensions::ExtensionBrowserTest {
+ public:
+  StarViewTest()
+      // In order to let a vanilla extension override the bookmark star, we have
+      // to enable the switch.
+      : enable_override_(
+            extensions::FeatureSwitch::enable_override_bookmarks_ui(),
+            true) {}
+  ~StarViewTest() override = default;
+
+  PageActionIconView* GetStarIcon() {
+    return BrowserView::GetBrowserViewForBrowser(browser())
+        ->toolbar_button_provider()
+        ->GetPageActionIconView(PageActionIconType::kBookmarkStar);
+  }
+
+ private:
+  extensions::FeatureSwitch::ScopedOverride enable_override_;
+
+  DISALLOW_COPY_AND_ASSIGN(StarViewTest);
+};
+
+// Verify that clicking the bookmark star a second time hides the bookmark
+// bubble.
+IN_PROC_BROWSER_TEST_F(StarViewTest, HideOnSecondClick) {
+  views::View* star_icon = GetStarIcon();
+
+  ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+                               ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
+                               ui::EF_LEFT_MOUSE_BUTTON);
+  ui::MouseEvent released_event(
+      ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
+      ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
+
+  // Verify that clicking once shows the bookmark bubble.
+  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
+  star_icon->OnMousePressed(pressed_event);
+  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
+  star_icon->OnMouseReleased(released_event);
+  EXPECT_TRUE(BookmarkBubbleView::bookmark_bubble());
+
+  // Verify that clicking again doesn't reshow it.
+  star_icon->OnMousePressed(pressed_event);
+  // Hide the bubble manually. In the browser this would normally happen during
+  // the event processing.
+  BookmarkBubbleView::Hide();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
+  star_icon->OnMouseReleased(released_event);
+  EXPECT_FALSE(BookmarkBubbleView::bookmark_bubble());
+}
+
+IN_PROC_BROWSER_TEST_F(StarViewTest, InkDropHighlighted) {
+  PageActionIconView* star_icon = GetStarIcon();
+  views::test::InkDropHostViewTestApi ink_drop_test_api(star_icon);
+
+  if (ink_drop_test_api.HasInkDrop()) {
+    GURL url("http://test.com");
+    bookmarks::BookmarkModel* model =
+        BookmarkModelFactory::GetForBrowserContext(browser()->profile());
+    bookmarks::AddIfNotBookmarked(model, url, /*title=*/base::string16());
+    browser()->window()->ShowBookmarkBubble(url, false);
+    EXPECT_EQ(ink_drop_test_api.GetInkDrop()->GetTargetInkDropState(),
+              views::InkDropState::ACTIVATED);
+  }
+}
+
+// Test that installing an extension that overrides the bookmark star
+// successfully hides the star.
+IN_PROC_BROWSER_TEST_F(StarViewTest, ExtensionCanOverrideBookmarkStar) {
+  // By default, we should show the star.
+  EXPECT_TRUE(GetStarIcon()->GetVisible());
+
+  // Create and install an extension that overrides the bookmark star.
+  extensions::DictionaryBuilder chrome_ui_overrides;
+  chrome_ui_overrides.Set(
+      "bookmarks_ui",
+      extensions::DictionaryBuilder().Set("remove_button", true).Build());
+  scoped_refptr<const extensions::Extension> extension =
+      extensions::ExtensionBuilder()
+          .SetManifest(
+              extensions::DictionaryBuilder()
+                  .Set("name", "overrides star")
+                  .Set("manifest_version", 2)
+                  .Set("version", "0.1")
+                  .Set("description", "override the star")
+                  .Set("chrome_ui_overrides", chrome_ui_overrides.Build())
+                  .Build())
+          .Build();
+  extension_service()->AddExtension(extension.get());
+
+  // The star should now be hidden.
+  EXPECT_FALSE(GetStarIcon()->GetVisible());
+}
+
+}  // namespace
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
index c08f4be3..89e7d2ab 100644
--- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
+++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
@@ -122,7 +122,7 @@
 
 RoundedOmniboxResultsFrame::RoundedOmniboxResultsFrame(
     views::View* contents,
-    const LocationBarView* location_bar)
+    LocationBarView* location_bar)
     : contents_(contents) {
   // Host the contents in its own View to simplify layout and clipping.
   contents_host_ = new views::View();
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h
index 3ea21867..ce514e1 100644
--- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h
+++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h
@@ -17,7 +17,7 @@
 class RoundedOmniboxResultsFrame : public views::View {
  public:
   RoundedOmniboxResultsFrame(views::View* contents,
-                             const LocationBarView* location_bar);
+                             LocationBarView* location_bar);
   ~RoundedOmniboxResultsFrame() override;
 
   // Hook to customize Widget initialization.
diff --git a/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.cc b/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.cc
index a38d18f..e28b777 100644
--- a/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.cc
+++ b/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h"
 #include "chrome/browser/ui/views/location_bar/find_bar_icon.h"
 #include "chrome/browser/ui/views/location_bar/intent_picker_view.h"
+#include "chrome/browser/ui/views/location_bar/star_view.h"
 #include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
 #include "chrome/browser/ui/views/native_file_system/native_file_system_access_icon_view.h"
 #include "chrome/browser/ui/views/page_action/pwa_install_view.h"
@@ -131,6 +132,11 @@
             params.command_updater, params.page_action_icon_delegate);
         page_action_icons_.push_back(save_card_icon_view_);
         break;
+      case PageActionIconType::kBookmarkStar:
+        star_view_ = new StarView(params.command_updater, params.browser,
+                                  params.page_action_icon_delegate);
+        page_action_icons_.push_back(star_view_);
+        break;
     }
   }
 
@@ -152,9 +158,6 @@
 
 PageActionIconView* OmniboxPageActionIconContainerView::GetIconView(
     PageActionIconType type) {
-  // TODO(https://crbug.com/788051): Update page action icons here as update
-  // methods are migrated out of LocationBar to the PageActionIconContainer
-  // interface.
   switch (type) {
     case PageActionIconType::kFind:
       return find_bar_icon_;
@@ -184,6 +187,8 @@
       return local_card_migration_icon_view_;
     case PageActionIconType::kSaveCard:
       return save_card_icon_view_;
+    case PageActionIconType::kBookmarkStar:
+      return star_view_;
   }
   return nullptr;
 }
diff --git a/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.h b/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.h
index e3d1fc2..9cc69344 100644
--- a/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.h
+++ b/chrome/browser/ui/views/page_action/omnibox_page_action_icon_container_view.h
@@ -25,6 +25,7 @@
 class PwaInstallView;
 class ReaderModeIconView;
 class SharingIconView;
+class StarView;
 class TranslateIconView;
 class ZoomView;
 
@@ -104,6 +105,7 @@
   autofill::LocalCardMigrationIconView* local_card_migration_icon_view_ =
       nullptr;
   autofill::SaveCardIconView* save_card_icon_view_ = nullptr;
+  StarView* star_view_ = nullptr;
 
   std::vector<PageActionIconView*> page_action_icons_;
 
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_view.cc b/chrome/browser/ui/views/page_action/page_action_icon_view.cc
index 1ee53a86..3553970 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_view.cc
+++ b/chrome/browser/ui/views/page_action/page_action_icon_view.cc
@@ -194,6 +194,13 @@
   UpdateIconImage();
 }
 
+void PageActionIconView::SetActive(bool active) {
+  if (active_ == active)
+    return;
+  active_ = active;
+  UpdateIconImage();
+}
+
 void PageActionIconView::UpdateIconImage() {
   const ui::NativeTheme* theme = GetNativeTheme();
   SkColor icon_color = active_
@@ -204,13 +211,6 @@
                                           icon_color, GetVectorIconBadge()));
 }
 
-void PageActionIconView::SetActiveInternal(bool active) {
-  if (active_ == active)
-    return;
-  active_ = active;
-  UpdateIconImage();
-}
-
 content::WebContents* PageActionIconView::GetWebContents() const {
   return delegate_->GetWebContentsForPageActionIconView();
 }
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_view.h b/chrome/browser/ui/views/page_action/page_action_icon_view.h
index b19d5df..da76eba 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_view.h
+++ b/chrome/browser/ui/views/page_action/page_action_icon_view.h
@@ -62,6 +62,10 @@
 
   void set_icon_size(int size) { icon_size_ = size; }
 
+  // Sets the active state of the icon. An active icon will be displayed in a
+  // "call to action" color.
+  void SetActive(bool active);
+
   // Updates the visibility of the icon based on the associated model state,
   // returns whether any change occurred.
   virtual bool Update() = 0;
@@ -134,10 +138,6 @@
   // Updates the icon image after some state has changed.
   virtual void UpdateIconImage();
 
-  // Sets the active state of the icon. An active icon will be displayed in a
-  // "call to action" color.
-  void SetActiveInternal(bool active);
-
   // Returns the associated web contents from the delegate.
   content::WebContents* GetWebContents() const;
 
diff --git a/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc b/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc
index ab78d23..7001e79 100644
--- a/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc
+++ b/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc
@@ -36,7 +36,7 @@
   // TODO(gilmanmh): Display icon for only those pages that are likely to
   // render well in Reader Mode.
   SetVisible(true);
-  SetActiveInternal(IsDistilledPage(contents->GetLastCommittedURL()));
+  SetActive(IsDistilledPage(contents->GetLastCommittedURL()));
 
   // Notify the icon when navigation to and from a distilled page occurs so that
   // it can hide the inkdrop.
diff --git a/chrome/browser/ui/views/tabs/tab_spinner_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_spinner_interactive_uitest.cc
index 98f7ee2..bd64362 100644
--- a/chrome/browser/ui/views/tabs/tab_spinner_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/tab_spinner_interactive_uitest.cc
@@ -6,6 +6,7 @@
 #include "base/metrics/histogram_samples.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/test/base/perf/performance_test.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -59,8 +60,10 @@
   DISALLOW_COPY_AND_ASSIGN(TabSpinnerTest);
 };
 
-// TODO(974349) This test is timing out on ChromeOS and Mac.
-#if (defined(OS_CHROMEOS) || defined(OS_MACOSX)) && !defined(NDEBUG)
+// TODO(crbug.com/974349) This test is timing out on ChromeOS, Mac, and Linux
+// debug builds.
+#if (defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_LINUX)) && \
+    !defined(NDEBUG)
 #define MAYBE_LoadTabsOneByOne DISABLED_LoadTabsOneByOne
 #else
 #define MAYBE_LoadTabsOneByOne LoadTabsOneByOne
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout.cc b/chrome/browser/ui/views/tabs/tab_strip_layout.cc
index d0ae3870..2bb0d0e 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_layout.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_layout.cc
@@ -14,62 +14,10 @@
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/geometry/rect.h"
 
-TabSizer::TabSizer(LayoutDomain domain, float space_fraction_available)
-    : domain_(domain), space_fraction_available_(space_fraction_available) {}
+namespace {
 
-int TabSizer::CalculateTabWidth(const TabWidthConstraints& tab) const {
-  switch (domain_) {
-    case LayoutDomain::kInactiveWidthBelowActiveWidth:
-      return std::floor(gfx::Tween::FloatValueBetween(
-          space_fraction_available_, tab.GetMinimumWidth(),
-          tab.GetLayoutCrossoverWidth()));
-    case LayoutDomain::kInactiveWidthEqualsActiveWidth:
-      return std::floor(gfx::Tween::FloatValueBetween(
-          space_fraction_available_, tab.GetLayoutCrossoverWidth(),
-          tab.GetPreferredWidth()));
-  }
-}
-
-bool TabSizer::TabAcceptsExtraSpace(const TabWidthConstraints& tab) const {
-  if (space_fraction_available_ == 0.0f || space_fraction_available_ == 1.0f)
-    return false;
-  switch (domain_) {
-    case LayoutDomain::kInactiveWidthBelowActiveWidth:
-      return tab.GetMinimumWidth() < tab.GetLayoutCrossoverWidth();
-    case LayoutDomain::kInactiveWidthEqualsActiveWidth:
-      return tab.GetLayoutCrossoverWidth() < tab.GetPreferredWidth();
-  }
-}
-
-bool TabSizer::IsAlreadyPreferredWidth() const {
-  return domain_ == LayoutDomain::kInactiveWidthEqualsActiveWidth &&
-         space_fraction_available_ == 1;
-}
-
-// Because TabSizer::CalculateTabWidth() rounds down, the fractional part of tab
-// widths go unused.  Retroactively round up tab widths from left to right to
-// use up that width.
-void AllocateExtraSpace(std::vector<gfx::Rect>* bounds,
-                        const std::vector<TabWidthConstraints>& tabs,
-                        base::Optional<int> width,
-                        TabSizer tab_sizer) {
-  // Don't expand tabs if they are already at their preferred width.
-  if (tab_sizer.IsAlreadyPreferredWidth() || !width.has_value())
-    return;
-
-  const int extra_space = width.value() - bounds->back().right();
-  int allocated_extra_space = 0;
-  for (size_t i = 0; i < tabs.size(); i++) {
-    const TabWidthConstraints& tab = tabs[i];
-    bounds->at(i).set_x(bounds->at(i).x() + allocated_extra_space);
-    if (allocated_extra_space < extra_space &&
-        tab_sizer.TabAcceptsExtraSpace(tab)) {
-      allocated_extra_space++;
-      bounds->at(i).set_width(bounds->at(i).width() + 1);
-    }
-  }
-}
-
+// Solve layout constraints to determine how much space is available for tabs
+// to use relative to how much they want to use.
 TabSizer CalculateSpaceFractionAvailable(
     const TabLayoutConstants& layout_constants,
     const std::vector<TabWidthConstraints>& tabs,
@@ -113,16 +61,94 @@
   return TabSizer(domain, space_fraction_available);
 }
 
+}  // namespace
+
+TabSizer::TabSizer(LayoutDomain domain, float space_fraction_available)
+    : domain_(domain), space_fraction_available_(space_fraction_available) {}
+
+int TabSizer::CalculateTabWidth(const TabWidthConstraints& tab) const {
+  switch (domain_) {
+    case LayoutDomain::kInactiveWidthBelowActiveWidth:
+      return std::floor(gfx::Tween::FloatValueBetween(
+          space_fraction_available_, tab.GetMinimumWidth(),
+          tab.GetLayoutCrossoverWidth()));
+    case LayoutDomain::kInactiveWidthEqualsActiveWidth:
+      return std::floor(gfx::Tween::FloatValueBetween(
+          space_fraction_available_, tab.GetLayoutCrossoverWidth(),
+          tab.GetPreferredWidth()));
+  }
+}
+
+bool TabSizer::TabAcceptsExtraSpace(const TabWidthConstraints& tab) const {
+  if (space_fraction_available_ == 0.0f || space_fraction_available_ == 1.0f)
+    return false;
+  switch (domain_) {
+    case LayoutDomain::kInactiveWidthBelowActiveWidth:
+      return tab.GetMinimumWidth() < tab.GetLayoutCrossoverWidth();
+    case LayoutDomain::kInactiveWidthEqualsActiveWidth:
+      return tab.GetLayoutCrossoverWidth() < tab.GetPreferredWidth();
+  }
+}
+
+bool TabSizer::IsAlreadyPreferredWidth() const {
+  return domain_ == LayoutDomain::kInactiveWidthEqualsActiveWidth &&
+         space_fraction_available_ == 1;
+}
+
+// Because TabSizer::CalculateTabWidth() rounds down, the fractional part of tab
+// widths go unused.  Retroactively round up tab widths from left to right to
+// use up that width.
+void AllocateExtraSpace(std::vector<gfx::Rect>* bounds,
+                        const std::vector<TabWidthConstraints>& tabs,
+                        base::Optional<int> extra_space,
+                        TabSizer tab_sizer) {
+  // Don't expand tabs if they are already at their preferred width.
+  if (tab_sizer.IsAlreadyPreferredWidth() || !extra_space.has_value())
+    return;
+
+  int allocated_extra_space = 0;
+  for (size_t i = 0; i < tabs.size(); i++) {
+    const TabWidthConstraints& tab = tabs[i];
+    bounds->at(i).set_x(bounds->at(i).x() + allocated_extra_space);
+    if (allocated_extra_space < extra_space &&
+        tab_sizer.TabAcceptsExtraSpace(tab)) {
+      allocated_extra_space++;
+      bounds->at(i).set_width(bounds->at(i).width() + 1);
+    }
+  }
+}
+
+TabWidthOverride CalculateTabWidthOverride(
+    const TabLayoutConstants& layout_constants,
+    const std::vector<TabWidthConstraints>& tabs,
+    int width) {
+  TabSizer tab_sizer =
+      CalculateSpaceFractionAvailable(layout_constants, tabs, width);
+
+  int next_leading_x = 0;
+  std::vector<gfx::Rect> bounds;
+  for (const TabWidthConstraints& tab : tabs) {
+    const int tab_width = tab_sizer.CalculateTabWidth(tab);
+    next_leading_x += tab_width - layout_constants.tab_overlap;
+  }
+
+  const int trailing_x = next_leading_x + layout_constants.tab_overlap;
+
+  return TabWidthOverride{tab_sizer, width - trailing_x};
+}
+
 std::vector<gfx::Rect> CalculateTabBounds(
     const TabLayoutConstants& layout_constants,
     const std::vector<TabWidthConstraints>& tabs,
     base::Optional<int> width,
-    base::Optional<TabSizer> override_tab_sizer) {
+    base::Optional<TabWidthOverride> tab_width_override) {
   if (tabs.empty())
     return std::vector<gfx::Rect>();
 
-  TabSizer tab_sizer = override_tab_sizer.value_or(
-      CalculateSpaceFractionAvailable(layout_constants, tabs, width));
+  TabSizer tab_sizer =
+      tab_width_override.has_value()
+          ? tab_width_override->sizer
+          : CalculateSpaceFractionAvailable(layout_constants, tabs, width);
 
   int next_x = 0;
   std::vector<gfx::Rect> bounds;
@@ -133,7 +159,14 @@
     next_x += tab_width - layout_constants.tab_overlap;
   }
 
-  AllocateExtraSpace(&bounds, tabs, width, tab_sizer);
+  const base::Optional<int> calculated_extra_space =
+      width.has_value()
+          ? base::make_optional(width.value() - bounds.back().right())
+          : base::nullopt;
+  const base::Optional<int> extra_space = tab_width_override.has_value()
+                                              ? tab_width_override->extra_space
+                                              : calculated_extra_space;
+  AllocateExtraSpace(&bounds, tabs, extra_space, tab_sizer);
 
   return bounds;
 }
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout.h b/chrome/browser/ui/views/tabs/tab_strip_layout.h
index 3e8a42d..958c3b7 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_layout.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_layout.h
@@ -39,23 +39,29 @@
   float space_fraction_available_;
 };
 
-// Solve layout constraints to determine how much space is available for tabs
-// to use relative to how much they want to use.
-TabSizer CalculateSpaceFractionAvailable(
+// Contains the information needed to freeze the width of each tab.
+struct TabWidthOverride {
+  TabSizer sizer;
+
+  // The number of pixels of extra width that should be distributed.
+  int extra_space;
+};
+
+TabWidthOverride CalculateTabWidthOverride(
     const TabLayoutConstants& layout_constants,
     const std::vector<TabWidthConstraints>& tabs,
-    base::Optional<int> width);
+    int width);
 
 // Calculates and returns the bounds of the tabs. |width| is the available
 // width to use for tab layout. This never sizes the tabs smaller then the
 // minimum widths in TabSizeInfo, and as a result the calculated bounds may go
-// beyond |width|. If |override_tab_sizer| has a value, it is used to calculate
-// bounds; otherwise, a new sizer is calculated based on the other constraints.
+// beyond |width|. If |tab_width_override| has a value, it is used to calculate
+// bounds; otherwise, they are calculated based on the other constraints.
 std::vector<gfx::Rect> CalculateTabBounds(
     const TabLayoutConstants& layout_constants,
     const std::vector<TabWidthConstraints>& tabs,
     base::Optional<int> width,
-    base::Optional<TabSizer> override_tab_sizer);
+    base::Optional<TabWidthOverride> tab_width_override);
 
 std::vector<gfx::Rect> CalculatePinnedTabBounds(
     const TabLayoutConstants& layout_constants,
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc
index 38fd0e6..d3914c0f 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc
@@ -169,7 +169,7 @@
       if (!tab_width_override_.has_value()) {
         // We are currently constrained by tabstrip_width_override_. Express
         // the equivalent constraint with tab_width_override_.
-        tab_width_override_ = CalculateSpaceFractionAvailable(
+        tab_width_override_ = CalculateTabWidthOverride(
             GetTabLayoutConstants(), GetCurrentTabWidthConstraints(),
             tabstrip_width_override_.value());
       }
@@ -182,7 +182,7 @@
 
 void TabStripLayoutHelper::EnterTabClosingMode(int available_width) {
   if (!WidthsConstrainedForClosingMode()) {
-    tab_width_override_ = CalculateSpaceFractionAvailable(
+    tab_width_override_ = CalculateTabWidthOverride(
         GetTabLayoutConstants(), GetCurrentTabWidthConstraints(),
         available_width);
     tabstrip_width_override_ = available_width;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h
index 38ca1774..713b2bc 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h
@@ -208,7 +208,7 @@
   // When in tab closing mode, if we want the next tab to the right to end up
   // under the cursor, each tab needs to stay the same size. When defined,
   // this specifies that size.
-  base::Optional<TabSizer> tab_width_override_;
+  base::Optional<TabWidthOverride> tab_width_override_;
 
   // When in tab closing mode, if we want the next tab to the left to end up
   // under the cursor, the overall space taken by tabs needs to stay the same.
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index 35dd3a41..8eb94024 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -433,15 +433,16 @@
     bool already_bookmarked,
     bookmarks::BookmarkBubbleObserver* observer) {
   views::View* const anchor_view = location_bar();
-  PageActionIconView* const star_view = location_bar()->star_view();
+  PageActionIconView* const bookmark_star_icon =
+      GetPageActionIconView(PageActionIconType::kBookmarkStar);
 
   std::unique_ptr<BubbleSyncPromoDelegate> delegate;
 #if !defined(OS_CHROMEOS)
   // ChromeOS does not show the signin promo.
   delegate.reset(new BookmarkBubbleSignInDelegate(browser_));
 #endif
-  BookmarkBubbleView::ShowBubble(anchor_view, star_view, gfx::Rect(), nullptr,
-                                 observer, std::move(delegate),
+  BookmarkBubbleView::ShowBubble(anchor_view, bookmark_star_icon, gfx::Rect(),
+                                 nullptr, observer, std::move(delegate),
                                  browser_->profile(), url, already_bookmarked);
 }
 
diff --git a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
index 35c327b..13638978 100644
--- a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
+++ b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
@@ -24,6 +24,7 @@
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "components/arc/arc_prefs.h"
 #endif
 
@@ -45,6 +46,12 @@
   extension_misc::kChromeAppId,
 };
 
+#if defined(OS_CHROMEOS)
+constexpr char const* kAppIdsWithHiddenStoragePermission[] = {
+    arc::kPlayStoreAppId,
+};
+#endif  // OS_CHROMEOS
+
 app_management::mojom::ExtensionAppPermissionMessagePtr
 CreateExtensionAppPermissionMessage(
     const extensions::PermissionMessage& message) {
@@ -64,6 +71,13 @@
   return base::Contains(kAppIdsWithHiddenPinToShelf, app_id);
 }
 
+bool ShouldHideStoragePermission(const std::string app_id) {
+#if defined(OS_CHROMEOS)
+  return base::Contains(kAppIdsWithHiddenStoragePermission, app_id);
+#else
+  return false;
+#endif
+}
 
 }  // namespace
 
@@ -216,6 +230,12 @@
     const apps::AppUpdate& update) {
   base::flat_map<uint32_t, apps::mojom::PermissionPtr> permissions;
   for (const auto& permission : update.Permissions()) {
+    if (static_cast<app_management::mojom::ArcPermissionType>(
+            permission->permission_id) ==
+            app_management::mojom::ArcPermissionType::STORAGE &&
+        ShouldHideStoragePermission(update.AppId())) {
+      continue;
+    }
     permissions[permission->permission_id] = permission->Clone();
   }
 
diff --git a/chrome/browser/ui/webui/app_management/app_management_ui.cc b/chrome/browser/ui/webui/app_management/app_management_ui.cc
deleted file mode 100644
index 5d3ce3e..0000000
--- a/chrome/browser/ui/webui/app_management/app_management_ui.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/app_management/app_management_ui.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/feature_list.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
-#include "chrome/browser/ui/webui/localized_string.h"
-#include "chrome/browser/ui/webui/plural_string_handler.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/browser_resources.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "ui/base/resource/resource_bundle.h"
-
-namespace {
-
-content::WebUIDataSource* CreateAppManagementUIHTMLSource(Profile* profile) {
-  content::WebUIDataSource* source =
-      content::WebUIDataSource::Create(chrome::kChromeUIAppManagementHost);
-
-  static constexpr LocalizedString kStrings[] = {
-      {"appListTitle", IDS_APP_MANAGEMENT_APP_LIST_TITLE},
-      {"appNoPermission", IDS_APPLICATION_INFO_APP_NO_PERMISSIONS_TEXT},
-      {"back", IDS_APP_MANAGEMENT_BACK},
-      {"camera", IDS_APP_MANAGEMENT_CAMERA},
-      {"contacts", IDS_APP_MANAGEMENT_CONTACTS},
-      {"controlledByPolicy", IDS_CONTROLLED_SETTING_POLICY},
-      {"lessApps", IDS_APP_MANAGEMENT_LESS_APPS},
-      {"location", IDS_APP_MANAGEMENT_LOCATION},
-      {"microphone", IDS_APP_MANAGEMENT_MICROPHONE},
-      {"moreApps", IDS_APP_MANAGEMENT_MORE_APPS},
-      {"moreSettings", IDS_APP_MANAGEMENT_MORE_SETTINGS},
-      {"noSearchResults", IDS_APP_MANAGEMENT_NO_RESULTS},
-      {"notifications", IDS_APP_MANAGEMENT_NOTIFICATIONS},
-      {"notificationSublabel", IDS_APP_MANAGEMENT_NOTIFICATIONS_SUBLABEL},
-      {"openAndroidSettings", IDS_APP_MANAGEMENT_ANDROID_SETTINGS},
-      {"openExtensionsSettings", IDS_APP_MANAGEMENT_EXTENSIONS_SETTINGS},
-      {"openSiteSettings", IDS_APP_MANAGEMENT_SITE_SETTING},
-      {"permissions", IDS_APP_MANAGEMENT_PERMISSIONS},
-      {"pinControlledByPolicy", IDS_APP_MANAGEMENT_PIN_ENFORCED_BY_POLICY},
-      {"pinToShelf", IDS_APP_MANAGEMENT_PIN_TO_SHELF},
-      {"searchPrompt", IDS_APP_MANAGEMENT_SEARCH_PROMPT},
-      {"size", IDS_APP_MANAGEMENT_SIZE},
-      {"storage", IDS_APP_MANAGEMENT_STORAGE},
-      {"thisAppCan", IDS_APP_MANAGEMENT_THIS_APP_CAN},
-      {"title", IDS_APP_MANAGEMENT_TITLE},
-      {"uninstall", IDS_APP_MANAGEMENT_UNINSTALL_APP},
-      {"version", IDS_APP_MANAGEMENT_VERSION},
-  };
-  AddLocalizedStringsBulk(source, kStrings, base::size(kStrings));
-
-#if defined(OS_CHROMEOS)
-  source->AddBoolean(
-      "isSupportedArcVersion",
-      AppManagementPageHandler::IsCurrentArcVersionSupported(profile));
-#endif  // OS_CHROMEOS
-
-  source->AddResourcePath("app_management.mojom-lite.js",
-                          IDR_APP_MANAGEMENT_MOJO_LITE_JS);
-  source->AddResourcePath("types.mojom-lite.js",
-                          IDR_APP_MANAGEMENT_TYPES_MOJO_LITE_JS);
-  source->AddResourcePath("bitmap.mojom-lite.js",
-                          IDR_APP_MANAGEMENT_BITMAP_MOJO_LITE_JS);
-  source->AddResourcePath("image.mojom-lite.js",
-                          IDR_APP_MANAGEMENT_IMAGE_MOJO_LITE_JS);
-  source->AddResourcePath("image_info.mojom-lite.js",
-                          IDR_APP_MANAGEMENT_IMAGE_INFO_MOJO_LITE_JS);
-
-  source->AddResourcePath("app.html", IDR_APP_MANAGEMENT_APP_HTML);
-  source->AddResourcePath("app.js", IDR_APP_MANAGEMENT_APP_JS);
-  source->AddResourcePath("expandable_app_list.html",
-                          IDR_APP_MANAGEMENT_EXPANDABLE_APP_LIST_HTML);
-  source->AddResourcePath("expandable_app_list.js",
-                          IDR_APP_MANAGEMENT_EXPANDABLE_APP_LIST_JS);
-
-  source->SetDefaultResource(IDR_APP_MANAGEMENT_INDEX_HTML);
-  source->UseStringsJs();
-
-  return source;
-}
-
-}  // namespace
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// AppManagementUI
-//
-///////////////////////////////////////////////////////////////////////////////
-
-AppManagementUI::AppManagementUI(content::WebUI* web_ui)
-    : ui::MojoWebUIController(web_ui, true), page_factory_binding_(this) {
-  Profile* profile = Profile::FromWebUI(web_ui);
-
-  // Set up the data source.
-  content::WebUIDataSource* source = CreateAppManagementUIHTMLSource(profile);
-  content::WebUIDataSource::Add(profile, source);
-
-  AddHandlerToRegistry(base::BindRepeating(
-      &AppManagementUI::BindPageHandlerFactory, base::Unretained(this)));
-
-  auto plural_string_handler = std::make_unique<PluralStringHandler>();
-  plural_string_handler->AddLocalizedString(
-      "appListPreview", IDS_APP_MANAGEMENT_APP_LIST_PREVIEW);
-  web_ui->AddMessageHandler(std::move(plural_string_handler));
-}
-
-AppManagementUI::~AppManagementUI() = default;
-
-bool AppManagementUI::IsEnabled() {
-  return base::FeatureList::IsEnabled(features::kAppManagement);
-}
-
-void AppManagementUI::BindPageHandlerFactory(
-    app_management::mojom::PageHandlerFactoryRequest request) {
-  if (page_factory_binding_.is_bound()) {
-    page_factory_binding_.Unbind();
-  }
-
-  page_factory_binding_.Bind(std::move(request));
-}
-
-void AppManagementUI::CreatePageHandler(
-    app_management::mojom::PagePtr page,
-    app_management::mojom::PageHandlerRequest request) {
-  DCHECK(page);
-
-  page_handler_ = std::make_unique<AppManagementPageHandler>(
-      std::move(request), std::move(page), Profile::FromWebUI(web_ui()));
-}
diff --git a/chrome/browser/ui/webui/app_management/app_management_ui.h b/chrome/browser/ui/webui/app_management/app_management_ui.h
deleted file mode 100644
index a0187ee..0000000
--- a/chrome/browser/ui/webui/app_management/app_management_ui.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_APP_MANAGEMENT_APP_MANAGEMENT_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_APP_MANAGEMENT_APP_MANAGEMENT_UI_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/ui/webui/app_management/app_management.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "ui/webui/mojo_web_ui_controller.h"
-
-class AppManagementPageHandler;
-
-class AppManagementUI : public ui::MojoWebUIController,
-                        public app_management::mojom::PageHandlerFactory {
- public:
-  explicit AppManagementUI(content::WebUI* web_ui);
-  ~AppManagementUI() override;
-
-  static bool IsEnabled();
-
- private:
-  void BindPageHandlerFactory(
-      app_management::mojom::PageHandlerFactoryRequest request);
-
-  // app_management::mojom::PageHandlerFactory:
-  void CreatePageHandler(
-      app_management::mojom::PagePtr page,
-      app_management::mojom::PageHandlerRequest request) override;
-
-  std::unique_ptr<AppManagementPageHandler> page_handler_;
-  mojo::Binding<app_management::mojom::PageHandlerFactory>
-      page_factory_binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(AppManagementUI);
-};
-
-#endif  // CHROME_BROWSER_UI_WEBUI_APP_MANAGEMENT_APP_MANAGEMENT_UI_H_
diff --git a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
index 0f0f0aaa..210d8f3 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
@@ -24,6 +24,10 @@
     "//device/bluetooth",
     "//ui/webui",
   ]
+
+  if (is_chromeos) {
+    deps += [ "//chrome/browser/chromeos" ]
+  }
 }
 
 mojom("mojo_bindings") {
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom
index 1ec9eb3f..ed3c3326 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom
@@ -6,7 +6,24 @@
 
 import "device/bluetooth/public/mojom/adapter.mojom";
 
+// Handles requests from chrome://bluetooth-internals to enable or disable the
+// usage of Bluetooth debug logs. The debug logs to be enabled reside in the
+// kernel as well within BlueZ/NewBlue. Note that these logs are text-only and
+// do not include captured packets from btmon.
+interface DebugLogsChangeHandler {
+  // Enables or disables debug logs, depending on the value of
+  // |should_debug_logs_be_enabled|.
+  ChangeDebugLogsState(bool should_debug_logs_be_enabled);
+};
+
 interface BluetoothInternalsHandler {
   // Gets an Adapter interface. Returns null if Bluetooth is not supported.
   GetAdapter() => (pending_remote<bluetooth.mojom.Adapter>? adapter);
+
+  // Retrieves a handler for changing the state of debug logs. If debug logs are
+  // not supported (e.g., the required flags are disabled or the logged-in user
+  // is not eligible), null is returned. When a valid handler is returned, an
+  // extra boolean is provided which represents the initial state of the toggle.
+  GetDebugLogsChangeHandler() => (DebugLogsChangeHandler? handler,
+                                  bool initial_toggle_value);
 };
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
index 252b190..5eccb3f 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
@@ -7,7 +7,9 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
 #include "device/bluetooth/adapter.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -15,11 +17,15 @@
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "url/gurl.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/bluetooth/debug_logs_manager.h"
+#endif
+
 BluetoothInternalsHandler::BluetoothInternalsHandler(
     mojo::PendingReceiver<mojom::BluetoothInternalsHandler> receiver)
     : receiver_(this, std::move(receiver)) {}
 
-BluetoothInternalsHandler::~BluetoothInternalsHandler() {}
+BluetoothInternalsHandler::~BluetoothInternalsHandler() = default;
 
 void BluetoothInternalsHandler::GetAdapter(GetAdapterCallback callback) {
   if (device::BluetoothAdapterFactory::IsBluetoothSupported()) {
@@ -31,6 +37,33 @@
   }
 }
 
+void BluetoothInternalsHandler::GetDebugLogsChangeHandler(
+    GetDebugLogsChangeHandlerCallback callback) {
+  mojom::DebugLogsChangeHandlerPtr handler_ptr;
+  bool initial_toggle_value = false;
+
+#if defined(OS_CHROMEOS)
+  // If no logs manager exists for this user, debug logs are not supported.
+  DebugLogsManager::DebugLogsState state =
+      debug_logs_manager_ ? debug_logs_manager_->GetDebugLogsState()
+                          : DebugLogsManager::DebugLogsState::kNotSupported;
+
+  switch (state) {
+    case DebugLogsManager::DebugLogsState::kNotSupported:
+      // Leave |handler_ptr| null and |initial_toggle_value| false.
+      break;
+    case DebugLogsManager::DebugLogsState::kSupportedAndEnabled:
+      initial_toggle_value = true;
+      FALLTHROUGH;
+    case DebugLogsManager::DebugLogsState::kSupportedButDisabled:
+      handler_ptr = debug_logs_manager_->GenerateInterfacePtr();
+      break;
+  }
+#endif
+
+  std::move(callback).Run(std::move(handler_ptr), initial_toggle_value);
+}
+
 void BluetoothInternalsHandler::OnGetAdapter(
     GetAdapterCallback callback,
     scoped_refptr<device::BluetoothAdapter> adapter) {
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h
index d8cb51882..54adcf05 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h
@@ -8,9 +8,14 @@
 #include "base/macros.h"
 #include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom.h"
 #include "device/bluetooth/bluetooth_adapter.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 
+#if defined(OS_CHROMEOS)
+class DebugLogsManager;
+#endif
+
 // Handles API requests from chrome://bluetooth-internals page by implementing
 // mojom::BluetoothInternalsHandler.
 class BluetoothInternalsHandler : public mojom::BluetoothInternalsHandler {
@@ -19,14 +24,27 @@
       mojo::PendingReceiver<mojom::BluetoothInternalsHandler> receiver);
   ~BluetoothInternalsHandler() override;
 
-  // mojom::BluetoothInternalsHandler overrides:
+#if defined(OS_CHROMEOS)
+  void set_debug_logs_manager(DebugLogsManager* debug_logs_manager) {
+    debug_logs_manager_ = debug_logs_manager;
+  }
+#endif
+
+  // mojom::BluetoothInternalsHandler:
   void GetAdapter(GetAdapterCallback callback) override;
+  void GetDebugLogsChangeHandler(
+      GetDebugLogsChangeHandlerCallback callback) override;
 
  private:
   void OnGetAdapter(GetAdapterCallback callback,
                     scoped_refptr<device::BluetoothAdapter> adapter);
 
   mojo::Receiver<mojom::BluetoothInternalsHandler> receiver_;
+
+#if defined(OS_CHROMEOS)
+  DebugLogsManager* debug_logs_manager_ = nullptr;
+#endif
+
   base::WeakPtrFactory<BluetoothInternalsHandler> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(BluetoothInternalsHandler);
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
index 00c15fc..e1e7674 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
@@ -12,6 +12,10 @@
 #include "chrome/grit/bluetooth_internals_resources_map.h"
 #include "content/public/browser/web_ui_data_source.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h"
+#endif
+
 BluetoothInternalsUI::BluetoothInternalsUI(content::WebUI* web_ui)
     : ui::MojoWebUIController(web_ui) {
   // Set up the chrome://bluetooth-internals source.
@@ -46,4 +50,8 @@
     mojo::PendingReceiver<mojom::BluetoothInternalsHandler> receiver) {
   page_handler_ =
       std::make_unique<BluetoothInternalsHandler>(std::move(receiver));
+#if defined(OS_CHROMEOS)
+  page_handler_->set_debug_logs_manager(
+      DebugLogsManagerFactory::GetForProfile(Profile::FromWebUI(web_ui())));
+#endif
 }
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 89ee3e7..453fe77 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -114,7 +114,6 @@
 
 #if !defined(OS_ANDROID)
 #include "chrome/browser/media/router/media_router_feature.h"
-#include "chrome/browser/ui/webui/app_management/app_management_ui.h"
 #include "chrome/browser/ui/webui/management_ui.h"
 #include "chrome/browser/ui/webui/media_router/media_router_internals_ui.h"
 #include "chrome/browser/ui/webui/web_footer_experiment_ui.h"
@@ -450,12 +449,6 @@
     return &NewWebUI<VersionUI>;
 
 #if !defined(OS_ANDROID)
-  if (AppManagementUI::IsEnabled() &&
-      url.host_piece() == chrome::kChromeUIAppManagementHost && profile &&
-      !profile->IsGuestSession()) {
-    return &NewWebUI<AppManagementUI>;
-  }
-
 #if !defined(OS_CHROMEOS)
   // AppLauncherPage is not needed on Android or ChromeOS.
   if (url.host_piece() == chrome::kChromeUIAppLauncherPageHost && profile &&
@@ -466,7 +459,6 @@
 #endif  // !defined(OS_CHROMEOS)
   if (profile->IsGuestSession() &&
       (url.host_piece() == chrome::kChromeUIAppLauncherPageHost ||
-       url.host_piece() == chrome::kChromeUIAppManagementHost ||
        url.host_piece() == chrome::kChromeUIBookmarksHost ||
        url.host_piece() == chrome::kChromeUIHistoryHost ||
        url.host_piece() == chrome::kChromeUIExtensionsHost)) {
@@ -940,10 +932,6 @@
   if (page_url.host_piece() == chrome::kChromeUIManagementHost)
     return ManagementUI::GetFaviconResourceBytes(scale_factor);
 
-  // Android doesn't use the App Management page.
-  if (page_url.host_piece() == chrome::kChromeUIAppManagementHost)
-    return settings_utils::GetFaviconResourceBytes(scale_factor);
-
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   if (page_url.host_piece() == chrome::kChromeUIExtensionsHost) {
     return extensions::ExtensionsUI::GetFaviconResourceBytes(scale_factor);
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
index cc573c4..0f8f2037 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
@@ -46,7 +46,9 @@
     bool out_close_dialog =
         AddSupervisionDialog::GetInstance()->OnDialogCloseRequested();
     EXPECT_TRUE(out_close_dialog);
-    AddSupervisionDialog::Close();
+    AddSupervisionDialog* instance =
+        static_cast<AddSupervisionDialog*>(AddSupervisionDialog::GetInstance());
+    instance->CloseNowForTesting();
   }
 
   void NotifySupervisionEnabled() {
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
index 3a5cb47..d920540 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/no_destructor.h"
 #include "base/system/sys_info.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -36,11 +35,6 @@
 
 constexpr int kDialogHeightPx = 608;
 constexpr int kDialogWidthPx = 768;
-// Id of System Dialog used to show the Add Supervision flow.
-std::string& GetDialogId() {
-  static base::NoDestructor<std::string> dialog_id;
-  return *dialog_id;
-}
 
 // Shows the dialog indicating that user has to sign out if supervision has been
 // enabled for their account.  Returns a boolean indicating whether the
@@ -78,8 +72,6 @@
   // SystemWebDialogDelegate::OnDialogClosed() is called.
   current_instance = new AddSupervisionDialog();
 
-  GetDialogId() = current_instance->Id();
-
   current_instance->ShowSystemDialogForBrowserContext(
       ProfileManager::GetPrimaryUserProfile(), parent);
 
@@ -89,11 +81,24 @@
 }
 
 // static
+SystemWebDialogDelegate* AddSupervisionDialog::GetInstance() {
+  return SystemWebDialogDelegate::FindInstance(
+      chrome::kChromeUIAddSupervisionURL);
+}
+
+// static
 void AddSupervisionDialog::Close() {
   SystemWebDialogDelegate* current_instance = GetInstance();
   if (current_instance) {
     current_instance->Close();
-    GetDialogId() = std::string();
+  }
+}
+
+void AddSupervisionDialog::CloseNowForTesting() {
+  SystemWebDialogDelegate* current_instance = GetInstance();
+  if (current_instance) {
+    DCHECK(dialog_window()) << "No dialog window instance currently set.";
+    views::Widget::GetWidgetForNativeWindow(dialog_window())->CloseNow();
   }
 }
 
@@ -123,11 +128,6 @@
 
 AddSupervisionDialog::~AddSupervisionDialog() = default;
 
-// static
-SystemWebDialogDelegate* AddSupervisionDialog::GetInstance() {
-  return SystemWebDialogDelegate::FindInstance(GetDialogId());
-}
-
 // AddSupervisionUI implementations.
 
 // static
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
index 0af78d0..1c91c5e 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
@@ -27,31 +27,30 @@
   // no-op.
   static void Show(gfx::NativeView parent);
 
+  static SystemWebDialogDelegate* GetInstance();
+
   // Closes the dialog; if the dialog doesn't exist, this function is a
   // no-op.
   // This is only called when the user clicks "Cancel", not the "x" in the top
   // right.
   static void Close();
 
-  static SystemWebDialogDelegate* GetInstance();
+  // Deletes this dialog window.
+  // Currently only used by AddSupervisionMetricsRecorderTest browser test to
+  // simulate closing the dialog cleanly.
+  void CloseNowForTesting();
 
   // ui::WebDialogDelegate:
   ui::ModalType GetDialogModalType() const override;
   void GetDialogSize(gfx::Size* size) const override;
-  bool OnDialogCloseRequested() override;
   bool CanCloseDialog() const override;
+  bool OnDialogCloseRequested() override;
 
  protected:
   AddSupervisionDialog();
   ~AddSupervisionDialog() override;
 
  private:
-  friend class AddSupervisionMetricsRecorderTest;
-  FRIEND_TEST_ALL_PREFIXES(AddSupervisionMetricsRecorderTest, HistogramTest);
-  FRIEND_TEST_ALL_PREFIXES(AddSupervisionMetricsRecorderTest, UserActionTest);
-  FRIEND_TEST_ALL_PREFIXES(AddSupervisionMetricsRecorderTimeTest,
-                           UserTimingTest);
-
   DISALLOW_COPY_AND_ASSIGN(AddSupervisionDialog);
 };
 
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.cc
new file mode 100644
index 0000000..77020c743
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.cc
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.h"
+
+#include "chrome/browser/chromeos/crostini/crostini_manager.h"
+#include "chrome/common/webui_url_constants.h"
+
+namespace {
+GURL GetUrl() {
+  return GURL{chrome::kChromeUICrostiniInstallerUrl};
+}
+}  // namespace
+
+namespace chromeos {
+
+void CrostiniInstallerDialog::Show(Profile* profile) {
+  DCHECK(crostini::IsCrostiniUIAllowedForProfile(profile));
+  auto* instance = SystemWebDialogDelegate::FindInstance(GetUrl().spec());
+  if (instance) {
+    instance->Focus();
+    return;
+  }
+
+  // TODO(lxj): Move installer status tracking into the CrostiniInstaller.
+  DCHECK(!crostini::CrostiniManager::GetForProfile(profile)
+              ->GetInstallerViewStatus());
+  crostini::CrostiniManager::GetForProfile(profile)->SetInstallerViewStatus(
+      true);
+
+  instance = new CrostiniInstallerDialog(profile);
+  instance->ShowSystemDialog();
+}
+
+CrostiniInstallerDialog::CrostiniInstallerDialog(Profile* profile)
+    : SystemWebDialogDelegate{GetUrl(), /*title=*/{}}, profile_{profile} {}
+
+CrostiniInstallerDialog::~CrostiniInstallerDialog() {
+  crostini::CrostiniManager::GetForProfile(profile_)->SetInstallerViewStatus(
+      false);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.h b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.h
new file mode 100644
index 0000000..5c56ffab
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_dialog.h
@@ -0,0 +1,27 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_DIALOG_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_DIALOG_H_
+
+#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
+
+class Profile;
+
+namespace chromeos {
+
+class CrostiniInstallerDialog : public SystemWebDialogDelegate {
+ public:
+  static void Show(Profile* profile);
+
+ private:
+  explicit CrostiniInstallerDialog(Profile* profile);
+  ~CrostiniInstallerDialog() override;
+
+  Profile* profile_;
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_DIALOG_H_
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 b3582ee16..7a69de01 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
@@ -13,6 +13,7 @@
 #include "chrome/grit/browser_resources.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "ui/web_dialogs/web_dialog_ui.h"
 #include "ui/webui/mojo_web_ui_controller.h"
 
 namespace chromeos {
@@ -23,7 +24,7 @@
 }
 
 CrostiniInstallerUI::CrostiniInstallerUI(content::WebUI* web_ui)
-    : ui::MojoWebUIController{web_ui} {
+    : ui::MojoWebDialogUI{web_ui} {
   // TODO(lxj): We might want to make sure there is only one instance of this
   // class.
 
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h
index e24d00f4..2e5d81d 100644
--- a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h
@@ -10,7 +10,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
-#include "ui/webui/mojo_web_ui_controller.h"
+#include "ui/web_dialogs/web_dialog_ui.h"
 
 namespace chromeos {
 
@@ -18,7 +18,7 @@
 
 // The WebUI for chrome://crostini-installer
 class CrostiniInstallerUI
-    : public ui::MojoWebUIController,
+    : public ui::MojoWebDialogUI,
       public chromeos::crostini_installer::mojom::PageHandlerFactory {
  public:
   static bool IsEnabled();
diff --git a/chrome/browser/ui/webui/chromeos/network_ui.cc b/chrome/browser/ui/webui/chromeos/network_ui.cc
index 6e1c9d1..c81ee6b 100644
--- a/chrome/browser/ui/webui/chromeos/network_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -44,6 +44,7 @@
 constexpr char kAddNetwork[] = "addNetwork";
 constexpr char kGetNetworkProperties[] = "getShillNetworkProperties";
 constexpr char kGetDeviceProperties[] = "getShillDeviceProperties";
+constexpr char kGetEthernetEAP[] = "getShillEthernetEAP";
 constexpr char kOpenCellularActivationUi[] = "openCellularActivationUi";
 constexpr char kShowNetworkDetails[] = "showNetworkDetails";
 constexpr char kShowNetworkConfig[] = "showNetworkConfig";
@@ -107,6 +108,10 @@
             &NetworkConfigMessageHandler::GetShillDeviceProperties,
             base::Unretained(this)));
     web_ui()->RegisterMessageCallback(
+        kGetEthernetEAP,
+        base::BindRepeating(&NetworkConfigMessageHandler::GetShillEthernetEAP,
+                            base::Unretained(this)));
+    web_ui()->RegisterMessageCallback(
         kOpenCellularActivationUi,
         base::BindRepeating(
             &NetworkConfigMessageHandler::OpenCellularActivationUi,
@@ -191,6 +196,28 @@
                    weak_ptr_factory_.GetWeakPtr(), type, kGetDeviceProperties));
   }
 
+  void GetShillEthernetEAP(const base::ListValue* arg_list) {
+    NetworkStateHandler::NetworkStateList list;
+    NetworkHandler::Get()->network_state_handler()->GetNetworkListByType(
+        NetworkTypePattern::Primitive(shill::kTypeEthernetEap),
+        true /* configured_only */, false /* visible_only */, 1 /* limit */,
+        &list);
+
+    AllowJavascript();
+    if (list.empty()) {
+      CallJavascriptFunction(
+          base::StringPrintf("NetworkUI.%sResult", kGetEthernetEAP));
+      return;
+    }
+    const NetworkState* eap = list.front();
+    base::Value properties(base::Value::Type::DICTIONARY);
+    properties.SetStringKey("guid", eap->guid());
+    properties.SetStringKey("name", eap->name());
+    properties.SetStringKey("type", eap->type());
+    CallJavascriptFunction(
+        base::StringPrintf("NetworkUI.%sResult", kGetEthernetEAP), properties);
+  }
+
   void OpenCellularActivationUi(const base::ListValue* arg_list) {
     const NetworkState* cellular_network =
         NetworkHandler::Get()->network_state_handler()->FirstNetworkByType(
@@ -325,6 +352,9 @@
       "favoriteNetworksLabel",
       l10n_util::GetStringUTF16(IDS_NETWORK_UI_FAVORITE_NETWORKS));
   localized_strings->SetString(
+      "ethernetEapNetworkLabel",
+      l10n_util::GetStringUTF16(IDS_NETWORK_UI_ETHERNET_EAP));
+  localized_strings->SetString(
       "devicesLabel", l10n_util::GetStringUTF16(IDS_NETWORK_UI_DEVICES));
 
   localized_strings->SetString(
diff --git a/chrome/browser/ui/webui/downloads/OWNERS b/chrome/browser/ui/webui/downloads/OWNERS
index e7f7501..23fd391 100644
--- a/chrome/browser/ui/webui/downloads/OWNERS
+++ b/chrome/browser/ui/webui/downloads/OWNERS
@@ -1,6 +1,5 @@
 file://components/download/OWNERS
 
-asanka@chromium.org
 dbeam@chromium.org
 
 per-file *.mojom=set noparent
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc
index 9a9c5f4..e0e0c5e 100644
--- a/chrome/browser/web_applications/web_app_install_task.cc
+++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -295,10 +295,11 @@
     ForInstallableSite for_installable_site,
     bool skip_page_favicons) {
 #if defined(OS_CHROMEOS)
-  // If we have install options, this is not a user-triggered install, and thus
-  // cannot be sent to the store.
+  // Background installations are not a user-triggered installs, and thus cannot
+  // be sent to the store.
   if (base::FeatureList::IsEnabled(features::kApkWebAppInstalls) &&
-      for_installable_site == ForInstallableSite::kYes && !install_params_) {
+      for_installable_site == ForInstallableSite::kYes &&
+      !background_installation_) {
     for (const auto& application : manifest.related_applications) {
       std::string id = base::UTF16ToUTF8(application.id.string());
       if (!base::EqualsASCII(application.platform.string(),
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 8d4a9ff..32289793 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -23,7 +23,6 @@
 const char kChromeUIAppIconHost[] = "app-icon";
 const char kChromeUIAppIconURL[] = "chrome://app-icon/";
 const char kChromeUIAppLauncherPageHost[] = "apps";
-const char kChromeUIAppManagementHost[] = "app-management";
 const char kChromeUIAppsURL[] = "chrome://apps/";
 const char kChromeUIAutofillInternalsHost[] = "autofill-internals";
 const char kChromeUIBluetoothInternalsHost[] = "bluetooth-internals";
@@ -214,6 +213,7 @@
 const char kChromeUIConfirmPasswordChangeUrl[] =
     "chrome://confirm-password-change";
 const char kChromeUICrostiniInstallerHost[] = "crostini-installer";
+const char kChromeUICrostiniInstallerUrl[] = "chrome://crostini-installer";
 const char kChromeUICryptohomeHost[] = "cryptohome";
 const char kChromeUIDeviceEmulatorHost[] = "device-emulator";
 const char kChromeUIDiscoverURL[] = "chrome://oobe/discover";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index e9273a3..c20f684 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -31,7 +31,6 @@
 extern const char kChromeUIAppIconHost[];
 extern const char kChromeUIAppIconURL[];
 extern const char kChromeUIAppLauncherPageHost[];
-extern const char kChromeUIAppManagementHost[];
 extern const char kChromeUIAppsURL[];
 extern const char kChromeUIAutofillInternalsHost[];
 extern const char kChromeUIBluetoothInternalsHost[];
@@ -211,6 +210,7 @@
 extern const char kChromeUIConfirmPasswordChangeHost[];
 extern const char kChromeUIConfirmPasswordChangeUrl[];
 extern const char kChromeUICrostiniInstallerHost[];
+extern const char kChromeUICrostiniInstallerUrl[];
 extern const char kChromeUICryptohomeHost[];
 extern const char kChromeUIDeviceEmulatorHost[];
 extern const char kChromeUIDiscoverURL[];
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
index 4ed8fff..78b5bee 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
@@ -4,13 +4,20 @@
 <translation id="1337821341856692531">Kapag nagpatuloy nang hindi inilalagay ang kasalukuyan mong password sa Windows, puwedeng magdulot ng pagkawala ng impormasyon na hindi na maibabalik.</translation>
 <translation id="1383286653814676580">Ginagamit para paganahin ang page sa pag-sign in ng Google Credential Provider.</translation>
 <translation id="1894475569413661128">Mag-sign in gamit ang iyong account sa trabaho.</translation>
+<translation id="2329184763010379754">Ang user lang na nag-lock sa computer na ito ang pinapayagang mag-sign in.</translation>
+<translation id="2398071111662077301">Hindi ma-load ang screen sa pag-sign in ng Google dahil sa isang isyu sa pag-install mo ng Chrome. Makipag-uganayan sa iyong administrator.</translation>
 <translation id="2469311484561825731">Hindi nakapag-sign in sa iyong account sa trabaho. Tiyaking may koneksyon sa internet ang computer, pagkatapos ay subukang muli.</translation>
+<translation id="2679096858700291438">Naglagay ka ng maling password sa Windows. Pakisubukang muli.</translation>
+<translation id="2831078752570172210">Na-lock out ang iyong account. Makipag-ugnayan sa administrator ng iyong system.</translation>
+<translation id="2844349213149998955">Hindi pinapayagan ang pag-sign in gamit ang isang personal na account sa device na ito. Mag-log in gamit ang isang account sa trabaho.</translation>
 <translation id="3306357053520292004">May naidagdag nang user sa computer na ito gamit ang account na ito. Mag-sign in gamit ang ibang account.</translation>
 <translation id="3968372833844047539">Mga user lang ng Gsuite Enterprise ang pinapayagang mag-log in.</translation>
 <translation id="4057329986137569701">Nagkaroon ng internal na error.</translation>
 <translation id="4267670563222825190">Walang makitang user ng Domain para sa iyong account. Makipag-ugnayan sa iyong administrator.</translation>
 <translation id="4300229033992784001">Nagbago ang password ng iyong account. Pakilagay ang iyong kasalukuyang password sa Windows para i-sync ang Windows account mo sa iyong account sa trabaho.</translation>
 <translation id="4706454071748629324">Hindi nakapagdagdag ng bagong user. Isang user lang ang pinapahintulutang magawa ng computer na ito gamit ang isang account sa trabaho.</translation>
+<translation id="6033715878377252112">Helper ng Credential Provider ng Google para sa Windows</translation>
+<translation id="6149399665202317746">Credential Provider ng Google para sa Windows</translation>
 <translation id="6312494990035843744">Hindi pinapayagan ang pag-sign in gamit ang account sa trabaho sa domain na ito. Sumubok ng ibang account.</translation>
 <translation id="6463752215771576050">Hindi ma-enroll ang computer na ito para sa pamamahala ng enterprise.  Mag-sign in gamit ang ibang account sa trabaho.</translation>
 <translation id="6657585470893396449">Password</translation>
@@ -22,5 +29,7 @@
 <translation id="8639729688781680518">Nakalimutan ang Password sa Windows</translation>
 <translation id="866458870819756755">Hindi makagawa ng user.</translation>
 <translation id="8875753657315897487">Mag-sign in gamit ang iyong account sa trabaho</translation>
+<translation id="8973975512230260387">Nag-expire na ang iyong session. Mag-sign in gamit ang iyong account sa trabaho ng Google.</translation>
+<translation id="9055998212250844221">Ginawa ng Credential Provider ng Google para sa Windows ang user account</translation>
 <translation id="9135619837062629367">Hindi pinapayagan ang pag-sign in gamit ang account na ito. Sumubok ng ibang account.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb
index 12ee24a..74235f1 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb
@@ -4,13 +4,20 @@
 <translation id="1337821341856692531">अपना मौजूदा Windows पासवर्ड डाले बिना जारी रखने से जानकारी का ऐसा नुकसान हो सकता है जिसे वापस नहीं लाया जा सकता.</translation>
 <translation id="1383286653814676580">'Google क्रेडेंशियल देने वाला' साइन इन पेज चलाने के लिए इस्तेमाल किया जाता है.</translation>
 <translation id="1894475569413661128">अपने काम से जुड़े खाते का इस्तेमाल करके साइन इन करें.</translation>
+<translation id="2329184763010379754">जिस उपयोगकर्ता ने इस कंप्यूटर को लॉक किया है, सिर्फ़ वही इसमें साइन इन कर सकता है.</translation>
+<translation id="2398071111662077301">Chrome इंस्टॉल करते समय आई किसी समस्या की वजह से Google की साइन इन स्क्रीन लोड नहीं की जा सकी. अपने एडमिन से संपर्क करें.</translation>
 <translation id="2469311484561825731">आपके काम से जुड़े खाते में साइन इन नहीं किया जा सका. यह ज़रूर देख लें कि कंप्यूटर में इंटरनेट कनेक्शन हो, फिर दोबारा कोशिश करें.</translation>
+<translation id="2679096858700291438">आपने गलत Windows पासवर्ड डाला है. कृपया फिर से कोशिश करें.</translation>
+<translation id="2831078752570172210">आपका खाता लॉक कर दिया गया है. कृपया अपने सिस्टम एडमिन से संपर्क करें.</translation>
+<translation id="2844349213149998955">इस डिवाइस पर निजी खाते से साइन इन करने की अनुमति नहीं है. कृपया काम से जुड़े खाते से लॉगिन करें.</translation>
 <translation id="3306357053520292004">इस कंप्यूटर का इस्तेमाल करने वाला कोई व्यक्ति इस खाते का इस्तेमाल करके पहले ही जोड़ा जा चुका है. कृपया किसी दूसरे खाते से साइन इन करें.</translation>
 <translation id="3968372833844047539">सिर्फ़ Gsuite एंटरप्राइज़ उपयोगकर्ता लॉग इन कर सकते हैं.</translation>
 <translation id="4057329986137569701">कोई आंतरिक गड़बड़ी हुई.</translation>
 <translation id="4267670563222825190">आपके खाते के लिए कोई डोमेन उपयोगकर्ता नहीं मिला. कृपया अपने एडमिन से संपर्क करें.</translation>
 <translation id="4300229033992784001">आपके खाते का पासवर्ड बदल गया है. अपने Windows खाते को अपने काम से जुड़े खाते से सिंक करने के लिए, कृपया अपना मौजूदा Windows पासवर्ड डालें.</translation>
 <translation id="4706454071748629324">नया उपयोगकर्ता नहीं जोड़ा जा सका. यह कंप्यूटर सिर्फ़ एक उपयोगकर्ता को काम से जुड़े खाता बनाने की अनुमति देता है.</translation>
+<translation id="6033715878377252112">'Windows के लिए Google क्रेडेंशियल देने वाला' सहायक</translation>
+<translation id="6149399665202317746">Windows के लिए Google क्रेडेंशियल देने वाला</translation>
 <translation id="6312494990035843744">इस डोमेन पर काम से जुड़े किसी खाते से साइन इन करने की मंज़ूरी नहीं है. कोई दूसरा खाता आज़माएं.</translation>
 <translation id="6463752215771576050">एंटरप्राइज़ प्रबंधन के लिए इस कंप्यूटर का नाम दर्ज नहीं कर पा रहे हैं.  कृपया काम से जुड़े किसी दूसरे खाते से साइन इन करें.</translation>
 <translation id="6657585470893396449">पासवर्ड</translation>
@@ -22,5 +29,7 @@
 <translation id="8639729688781680518">Windows पासवर्ड भूल गए हैं</translation>
 <translation id="866458870819756755">उपयोगकर्ता बनाया नहीं जा सका.</translation>
 <translation id="8875753657315897487">अपने काम से जुड़े खाते का इस्तेमाल करके साइन इन करें</translation>
+<translation id="8973975512230260387">आपका सत्र खत्म हो गया है. अपने काम से जुड़े Google खाते का इस्तेमाल करके साइन इन करें.</translation>
+<translation id="9055998212250844221">उपयोगकर्ता खाता को 'Windows के लिए Google क्रेडेंशियल देने वाले' ने बनाया है</translation>
 <translation id="9135619837062629367">इस खाते से साइन इन करने की अनुमति नहीं है. कोई दूसरा खाता आज़माएं.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
index 468fe1ad..21180d9 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
@@ -4,13 +4,20 @@
 <translation id="1337821341856692531">현재 Windows 비밀번호를 입력하지 않고 계속하면 정보가 영구적으로 손실될 수 있습니다.</translation>
 <translation id="1383286653814676580">Google 사용자 인증 정보 제공업체 로그인 페이지에 사용됩니다.</translation>
 <translation id="1894475569413661128">직장 계정으로 로그인하세요.</translation>
+<translation id="2329184763010379754">이 컴퓨터를 잠근 사용자만 로그인할 수 있습니다.</translation>
+<translation id="2398071111662077301">Chrome 설치에 문제가 있어 Google 로그인 화면을 로드할 수 없습니다. 관리자에게 문의하세요.</translation>
 <translation id="2469311484561825731">직장 계정에 로그인하지 못했습니다. 컴퓨터가 인터넷에 연결되어 있는지 확인한 후 다시 시도해 보세요.</translation>
+<translation id="2679096858700291438">잘못된 Windows 비밀번호를 입력했습니다. 다시 시도해 주세요.</translation>
+<translation id="2831078752570172210">계정이 잠겼습니다. 시스템 관리자에게 문의하세요.</translation>
+<translation id="2844349213149998955">이 기기에서는 개인 계정으로 로그인할 수 없습니다. 직장 계정으로 로그인하세요.</translation>
 <translation id="3306357053520292004">이 컴퓨터의 사용자가 이미 이 계정으로 추가되었습니다. 다른 계정으로 로그인해 주세요.</translation>
 <translation id="3968372833844047539">G Suite Enterprise 사용자만 로그인할 수 있습니다.</translation>
 <translation id="4057329986137569701">내부 오류가 발생했습니다.</translation>
 <translation id="4267670563222825190">계정에 도메인 사용자가 없습니다. 관리자에게 문의하시기 바랍니다.</translation>
 <translation id="4300229033992784001">계정 비밀번호가 변경되었습니다. Windows 계정과 직장 계정을 동기화하려면 현재 Windows 비밀번호를 입력해 주세요.</translation>
 <translation id="4706454071748629324">신규 사용자를 추가하지 못했습니다. 이 컴퓨터에서는 직장 계정마다 사용자 1명만 만들 수 있습니다.</translation>
+<translation id="6033715878377252112">Windows 도우미용 Google 사용자 인증 정보 제공 프로그램</translation>
+<translation id="6149399665202317746">Windows용 Google 사용자 인증 정보 제공 프로그램</translation>
 <translation id="6312494990035843744">이 도메인에서는 직장 계정으로 로그인할 수 없습니다. 다른 계정을 사용하세요.</translation>
 <translation id="6463752215771576050">이 컴퓨터를 기업 관리에 등록할 수 없습니다.  다른 직장 계정으로 로그인하세요.</translation>
 <translation id="6657585470893396449">비밀번호</translation>
@@ -22,5 +29,7 @@
 <translation id="8639729688781680518">Windows 비밀번호를 잊어버림</translation>
 <translation id="866458870819756755">사용자를 만들 수 없습니다.</translation>
 <translation id="8875753657315897487">직장 계정으로 로그인</translation>
+<translation id="8973975512230260387">세션이 만료되었습니다. Google 직장 계정으로 로그인하세요.</translation>
+<translation id="9055998212250844221">Windows용 Google 사용자 인증 정보 제공 프로그램에서 생성한 사용자 계정</translation>
 <translation id="9135619837062629367">이 계정으로 로그인할 수 없습니다. 다른 계정을 사용하세요.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/installer/mac/BUILD.gn b/chrome/installer/mac/BUILD.gn
index a5693719..121a2db1 100644
--- a/chrome/installer/mac/BUILD.gn
+++ b/chrome/installer/mac/BUILD.gn
@@ -21,9 +21,9 @@
 
   process_only = true
 
-  template_file = "signing/config.py.in"
+  template_file = "signing/build_props_config.py.in"
 
-  output = "$_packaging_dir/signing/config.py"
+  output = "$_packaging_dir/signing/build_props_config.py"
 
   _full_target_name = get_label_info(target_name, "label_no_toolchain")
   _file_path = rebase_path(template_file)
@@ -37,6 +37,8 @@
 _mac_signing_sources = [
   "signing/__init__.py",
   "signing/commands.py",
+  "signing/chromium_config.py",
+  "signing/config.py",
   "signing/model.py",
   "signing/modification.py",
   "signing/notarize.py",
@@ -119,7 +121,6 @@
 group("mac_signing_tests") {
   data = _mac_signing_sources + [
            "signing/commands_test.py",
-           "signing/config.py.in",
            "signing/model_test.py",
            "signing/modification_test.py",
            "signing/notarize_test.py",
diff --git a/chrome/installer/mac/sign_chrome.py b/chrome/installer/mac/sign_chrome.py
index a1de962..9d34f1e 100755
--- a/chrome/installer/mac/sign_chrome.py
+++ b/chrome/installer/mac/sign_chrome.py
@@ -27,14 +27,18 @@
     Returns:
         An instance of |model.CodeSignConfig|.
     """
-    config_class = config.CodeSignConfig
+    # First look up the processed Chromium config.
+    from signing.chromium_config import ChromiumCodeSignConfig
+    config_class = ChromiumCodeSignConfig
+
+    # Then search for the internal config for Google Chrome.
     try:
-        import signing.internal_config
-        config_class = signing.internal_config.InternalCodeSignConfig
+        from signing.internal_config import InternalCodeSignConfig
+        config_class = InternalCodeSignConfig
     except ImportError as e:
         # If the build specified Google Chrome as the product, then the
         # internal config has to be available.
-        if config_class(identity, keychain).product == 'Google Chrome':
+        if config_class(*config_args).product == 'Google Chrome':
             raise e
 
     if development:
diff --git a/chrome/installer/mac/signing/build_props_config.py.in b/chrome/installer/mac/signing/build_props_config.py.in
new file mode 100644
index 0000000..0b3bcc16
--- /dev/null
+++ b/chrome/installer/mac/signing/build_props_config.py.in
@@ -0,0 +1,28 @@
+# @GEN_HEADER@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from .config import CodeSignConfig
+
+
+class BuildPropsCodeSignConfig(CodeSignConfig):
+    """The BuildPropsCodeSignConfig is processed by GN to inject build-time
+    properties from the branding and version data.
+    """
+
+    @property
+    def app_product(self):
+        return '@PRODUCT_FULLNAME@'
+
+    @property
+    def product(self):
+        return '@PRODUCT_FULLNAME@'
+
+    @property
+    def version(self):
+        return '@MAJOR@.@MINOR@.@BUILD@.@PATCH@'
+
+    @property
+    def base_bundle_id(self):
+        return '@MAC_BUNDLE_ID@'
diff --git a/chrome/installer/mac/signing/chromium_config.py b/chrome/installer/mac/signing/chromium_config.py
new file mode 100644
index 0000000..6f78a44
--- /dev/null
+++ b/chrome/installer/mac/signing/chromium_config.py
@@ -0,0 +1,24 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from .build_props_config import BuildPropsCodeSignConfig
+
+
+class ChromiumCodeSignConfig(BuildPropsCodeSignConfig):
+    """A CodeSignConfig used for signing non-official Chromium builds.
+
+    This is primarily used for testing, so it does not include certain
+    signing elements like provisioning profiles. It also omits internal-only
+    resources.
+    """
+
+    @property
+    def optional_parts(self):
+        # This part requires src-internal, so it is not required for a Chromium
+        # build signing.
+        return set(('libwidevinecdm.dylib',))
+
+    @property
+    def provisioning_profile_basename(self):
+        return None
diff --git a/chrome/installer/mac/signing/config.py.in b/chrome/installer/mac/signing/config.py
similarity index 87%
rename from chrome/installer/mac/signing/config.py.in
rename to chrome/installer/mac/signing/config.py
index 40fc81c1..5578b050 100644
--- a/chrome/installer/mac/signing/config.py.in
+++ b/chrome/installer/mac/signing/config.py
@@ -1,4 +1,3 @@
-# @GEN_HEADER@
 # Copyright 2019 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -7,6 +6,14 @@
 
 from .model import Distribution
 
+
+class ConfigError(Exception):
+
+    def __init__(self, attr_name):
+        super(Exception, self).__init__(
+            'Missing CodeSignConfig attribute "{}"'.format(attr_name))
+
+
 class CodeSignConfig(object):
     """Code sign base configuration object.
 
@@ -14,10 +21,14 @@
     to locate products for code signing and options that control the code
     signing process.
 
-    The base configuration is produced from variable injection during the build
-    process. Derived configurations are created for internal signing artifacts
-    and when using |model.Distribution| objects.
+    There is a class hierarchy of CodeSignConfig objects, with the
+    build_props_config.BuildPropsConfig containing injected variables from the
+    build process. Configs for Chromium and Google Chrome subclass that to
+    control signing options further. ANd then derived configurations are
+    created for internal signing artifacts and when using |model.Distribution|
+    objects.
     """
+
     def __init__(self,
                  identity,
                  keychain=None,
@@ -88,7 +99,7 @@
         """Returns the product name that is used for the outer .app bundle.
         This is displayed to the user in Finder.
         """
-        return '@PRODUCT_FULLNAME@'
+        raise ConfigError('app_product')
 
     @property
     def product(self):
@@ -99,19 +110,19 @@
         the build system, while |app_product| is used when customizing for
         |model.Distribution| objects.
         """
-        return '@PRODUCT_FULLNAME@'
+        raise ConfigError('product')
 
     @property
     def version(self):
         """Returns the version of the application."""
-        return '@MAJOR@.@MINOR@.@BUILD@.@PATCH@'
+        raise ConfigError('version')
 
     @property
     def base_bundle_id(self):
         """Returns the base CFBundleIdentifier that is used for the outer app
         bundle, and to which sub-component identifiers are appended.
         """
-        return '@MAC_BUNDLE_ID@'
+        raise ConfigError('base_bundle_id')
 
     @property
     def optional_parts(self):
@@ -119,9 +130,7 @@
         signing the contents of the bundle. The part names should reflect the
         part short name keys in the dictionary returned by signing.get_parts().
         """
-        # This part requires src-internal, so it is not required for a Chromium
-        # build signing.
-        return set(('libwidevinecdm.dylib',))
+        raise ConfigError('optional_parts')
 
     @property
     def codesign_requirements_basic(self):
@@ -144,7 +153,7 @@
         outer app bundle. This file with a .provisionprofile extension is
         located in the |packaging_dir|.
         """
-        return None
+        raise ConfigError('provisioning_profile_basename')
 
     @property
     def packaging_basename(self):
@@ -181,7 +190,8 @@
     @property
     def framework_dir(self):
         """Returns the path to the app's framework directory."""
-        return '{0.app_dir}/Contents/Frameworks/{0.product} Framework.framework'.format(self)
+        return '{0.app_dir}/Contents/Frameworks/{0.product} Framework.framework'.format(
+            self)
 
     @property
     def packaging_dir(self):
diff --git a/chrome/installer/mac/signing/test_config.py b/chrome/installer/mac/signing/test_config.py
index 5d618582..089ae428 100644
--- a/chrome/installer/mac/signing/test_config.py
+++ b/chrome/installer/mac/signing/test_config.py
@@ -2,13 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import imp
-import os
-
-THIS_DIR = os.path.abspath(os.path.dirname(__file__))
-
-config = imp.load_source('signing.config', os.path.join(THIS_DIR,
-                                                        'config.py.in'))
+from . import config
 
 
 class TestConfig(config.CodeSignConfig):
diff --git a/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc b/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc
index 8c75373..2e6f78ce 100644
--- a/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc
+++ b/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc
@@ -8,18 +8,18 @@
 
 #include "testing/gtest/include/gtest/gtest.h"
 
-FakeMojoPasswordManagerDriver::FakeMojoPasswordManagerDriver()
-    : binding_(this) {}
+FakeMojoPasswordManagerDriver::FakeMojoPasswordManagerDriver() = default;
 
-FakeMojoPasswordManagerDriver::~FakeMojoPasswordManagerDriver() {}
+FakeMojoPasswordManagerDriver::~FakeMojoPasswordManagerDriver() = default;
 
-void FakeMojoPasswordManagerDriver::BindRequest(
-    autofill::mojom::PasswordManagerDriverAssociatedRequest request) {
-  binding_.Bind(std::move(request));
+void FakeMojoPasswordManagerDriver::BindReceiver(
+    mojo::PendingAssociatedReceiver<autofill::mojom::PasswordManagerDriver>
+        receiver) {
+  receiver_.Bind(std::move(receiver));
 }
 
 void FakeMojoPasswordManagerDriver::Flush() {
-  binding_.FlushForTesting();
+  receiver_.FlushForTesting();
 }
 
 // mojom::PasswordManagerDriver:
diff --git a/chrome/renderer/autofill/fake_mojo_password_manager_driver.h b/chrome/renderer/autofill/fake_mojo_password_manager_driver.h
index 38611cb..5c2f4f0 100644
--- a/chrome/renderer/autofill/fake_mojo_password_manager_driver.h
+++ b/chrome/renderer/autofill/fake_mojo_password_manager_driver.h
@@ -12,7 +12,8 @@
 #include "base/strings/string16.h"
 #include "components/autofill/content/common/mojom/autofill_driver.mojom.h"
 #include "components/autofill/core/common/password_form.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 class FakeMojoPasswordManagerDriver
@@ -22,8 +23,9 @@
 
   ~FakeMojoPasswordManagerDriver() override;
 
-  void BindRequest(
-      autofill::mojom::PasswordManagerDriverAssociatedRequest request);
+  void BindReceiver(
+      mojo::PendingAssociatedReceiver<autofill::mojom::PasswordManagerDriver>
+          receiver);
 
   // Flushes all pending messages from the associated binding.
   void Flush();
@@ -219,7 +221,8 @@
   autofill::mojom::FocusedFieldType last_focused_field_type_ =
       autofill::mojom::FocusedFieldType::kUnknown;
 
-  mojo::AssociatedBinding<autofill::mojom::PasswordManagerDriver> binding_;
+  mojo::AssociatedReceiver<autofill::mojom::PasswordManagerDriver> receiver_{
+      this};
 };
 
 #endif  // CHROME_RENDERER_AUTOFILL_FAKE_MOJO_PASSWORD_MANAGER_DRIVER_H_
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index 5f038e61..a5c4c7d 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -35,6 +35,7 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_view.h"
 #include "content/public/test/browser_test_utils.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
@@ -705,8 +706,9 @@
   }
 
   void BindPasswordManagerDriver(mojo::ScopedInterfaceEndpointHandle handle) {
-    fake_driver_.BindRequest(
-        mojom::PasswordManagerDriverAssociatedRequest(std::move(handle)));
+    fake_driver_.BindReceiver(
+        mojo::PendingAssociatedReceiver<mojom::PasswordManagerDriver>(
+            std::move(handle)));
   }
 
   void BindPasswordManagerClient(mojo::ScopedInterfaceEndpointHandle handle) {
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
index 691b58d..beaaeb5 100644
--- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -316,8 +316,9 @@
 
 void PasswordGenerationAgentTest::BindPasswordManagerDriver(
     mojo::ScopedInterfaceEndpointHandle handle) {
-  fake_driver_.BindRequest(
-      mojom::PasswordManagerDriverAssociatedRequest(std::move(handle)));
+  fake_driver_.BindReceiver(
+      mojo::PendingAssociatedReceiver<mojom::PasswordManagerDriver>(
+          std::move(handle)));
 }
 
 void PasswordGenerationAgentTest::BindPasswordManagerClient(
diff --git a/chrome/services/app_service/README.md b/chrome/services/app_service/README.md
index 41ae51c..5c9e3f6 100644
--- a/chrome/services/app_service/README.md
+++ b/chrome/services/app_service/README.md
@@ -4,9 +4,9 @@
 
 There are a number (lets call it `M`) of different places or app Consumers,
 usually UI (user interfaces) related, where users interact with their installed
-apps: e.g. launcher, search bar, shelf, New Tab Page, the App Management page,
-permissions or settings pages, picking and running default handlers for URLs,
-MIME types or intents, etc.
+apps: e.g. launcher, search bar, shelf, New Tab Page, the App Management
+settings page, permissions or settings pages, picking and running default
+handlers for URLs, MIME types or intents, etc.
 
 There is also a different number (`N`) of app platforms or app Providers:
 built-in apps, extension-backed apps, PWAs (progressive web apps), ARC++
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 89f1061..435d39b 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1205,7 +1205,6 @@
       "../browser/ui/find_bar/find_bar_platform_helper_mac_browsertest.mm",
       "../browser/ui/hats/hats_service_browsertest.cc",
       "../browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc",
-      "../browser/ui/location_bar/location_bar_browsertest.cc",
       "../browser/ui/login/login_handler_browsertest.cc",
       "../browser/ui/native_window_tracker_browsertest.cc",
       "../browser/ui/passwords/manage_passwords_test.cc",
@@ -2543,6 +2542,7 @@
     }
     if (enable_print_preview) {
       sources += [
+        "../browser/printing/pdf_nup_converter_client_browsertest.cc",
         "../browser/printing/print_browsertest.cc",
         "../browser/printing/print_preview_dialog_controller_browsertest.cc",
         "../browser/printing/print_preview_pdf_generated_browsertest.cc",
@@ -3048,7 +3048,6 @@
     "../browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h",
     "../browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc",
     "../browser/page_load_metrics/observers/page_load_metrics_observer_tester.h",
-    "../browser/page_load_metrics/observers/previews_lite_page_redirect_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/previews_page_load_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc",
     "../browser/page_load_metrics/observers/protocol_page_load_metrics_observer_unittest.cc",
@@ -5595,7 +5594,7 @@
         "../browser/ui/views/keyboard_access_browsertest.cc",
         "../browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc",
         "../browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc",
-        "../browser/ui/views/location_bar/star_view_browsertest.cc",
+        "../browser/ui/views/location_bar/star_view_interactive_uitest.cc",
         "../browser/ui/views/menu_controller_interactive_uitest.cc",
         "../browser/ui/views/menu_interactive_uitest.cc",
         "../browser/ui/views/menu_item_view_interactive_uitest.cc",
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index 94187e5..4f2ee801 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -195,8 +195,8 @@
  private:
   class TestLocationBar : public LocationBar {
    public:
-    TestLocationBar() : LocationBar(NULL) {}
-    ~TestLocationBar() override {}
+    TestLocationBar() = default;
+    ~TestLocationBar() override = default;
 
     // LocationBar:
     GURL GetDestinationURL() const override;
@@ -208,7 +208,6 @@
     void FocusLocation(bool select_all) override {}
     void FocusSearch() override {}
     void UpdateContentSettingsIcons() override {}
-    void UpdateBookmarkStarVisibility() override {}
     void SaveStateToContents(content::WebContents* contents) override {}
     void Revert() override {}
     const OmniboxView* GetOmniboxView() const override;
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 40c22d0..039a75a 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -190,7 +190,6 @@
   test_type = "mojo_lite_webui"
 
   sources = [
-    "app_management/app_management_browsertest.js",
     "bluetooth_internals_browsertest.js",
     "downloads/downloads_browsertest.js",
     "engagement/site_engagement_browsertest.js",
diff --git a/chrome/test/data/webui/app_management/app_management_browsertest.js b/chrome/test/data/webui/app_management/app_management_browsertest.js
deleted file mode 100644
index 597159f3..0000000
--- a/chrome/test/data/webui/app_management/app_management_browsertest.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Test suite for the App Management page.
- */
-GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']);
-GEN('#include "chrome/common/chrome_features.h"');
-
-function AppManagementBrowserTest() {}
-
-AppManagementBrowserTest.prototype = {
-  __proto__: PolymerTest.prototype,
-
-  browsePreload: 'chrome://app-management',
-
-  extraLibraries: [
-    ...PolymerTest.prototype.extraLibraries,
-    '../test_util.js',
-    '../test_store.js',
-    'test_util.js',
-    'test_store.js',
-  ],
-
-  featureList: {enabled: ['features::kAppManagement']},
-
-  /** override */
-  runAccessibilityChecks: true,
-};
-
-function AppManagementAppTest() {}
-
-AppManagementAppTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'app_test.js',
-  ]),
-};
-
-TEST_F('AppManagementAppTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementDomSwitchTest() {}
-
-AppManagementDomSwitchTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'dom_switch_test.js',
-  ]),
-};
-
-TEST_F('AppManagementDomSwitchTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementMainViewTest() {}
-
-AppManagementMainViewTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'main_view_test.js',
-  ]),
-};
-
-TEST_F('AppManagementMainViewTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementMetadataViewTest() {}
-
-AppManagementMetadataViewTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'metadata_view_test.js',
-  ]),
-};
-
-TEST_F('AppManagementMetadataViewTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementReducersTest() {}
-
-AppManagementReducersTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'reducers_test.js',
-  ]),
-};
-
-TEST_F('AppManagementReducersTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementRouterTest() {}
-
-AppManagementRouterTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'router_test.js',
-  ]),
-};
-
-TEST_F('AppManagementRouterTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementPwaPermissionViewTest() {}
-
-AppManagementPwaPermissionViewTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'pwa_permission_view_test.js',
-  ]),
-};
-
-TEST_F('AppManagementPwaPermissionViewTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementArcPermissionViewTest() {}
-
-AppManagementArcPermissionViewTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'arc_permission_view_test.js',
-  ]),
-};
-
-TEST_F('AppManagementArcPermissionViewTest', 'DISABLED_All', function() {
-  mocha.run();
-});
-
-function AppManagementManagedAppsTest() {}
-
-AppManagementManagedAppsTest.prototype = {
-  __proto__: AppManagementBrowserTest.prototype,
-
-  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
-    'managed_apps_test.js',
-  ]),
-};
-
-TEST_F('AppManagementManagedAppsTest', 'DISABLED_All', function() {
-  mocha.run();
-});
diff --git a/chrome/test/data/webui/bluetooth_internals_browsertest.js b/chrome/test/data/webui/bluetooth_internals_browsertest.js
index ceb3fd9d..fdabf4f 100644
--- a/chrome/test/data/webui/bluetooth_internals_browsertest.js
+++ b/chrome/test/data/webui/bluetooth_internals_browsertest.js
@@ -52,6 +52,7 @@
       constructor(handle) {
         super([
           'getAdapter',
+          'getDebugLogsChangeHandler',
         ]);
 
         this.receiver_ = new mojom.BluetoothInternalsHandlerReceiver(this);
@@ -63,6 +64,11 @@
         return {adapter: this.adapter.receiver.$.bindNewPipeAndPassRemote()};
       }
 
+      async getDebugLogsChangeHandler() {
+        this.methodCalled('getDebugLogsChangeHandler');
+        return {handler: null, initialToggleValue: false};
+      }
+
       setAdapterForTesting(adapter) {
         this.adapter = adapter;
       }
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/dom_switch_test.js b/chrome/test/data/webui/settings/chromeos/app_management/dom_switch_test.js
index 1905dc77..d2ae63e2 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/dom_switch_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/dom_switch_test.js
@@ -44,6 +44,11 @@
     domSwitch.route = '2';
     assertFalse(!!document.getElementById('child1'));
     assertTrue(!!document.getElementById('child2'));
+
+    // When no child is selected, the currently selected child is detached.
+    domSwitch.route = null;
+    assertFalse(!!document.getElementById('child1'));
+    assertFalse(!!document.getElementById('child2'));
   });
 
   test('binding to properties and paths works', function() {
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 880e0e4d..ffc74d8 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -171,6 +171,27 @@
   }
 };
 
+// Text fixture for the app management dom switch element.
+// eslint-disable-next-line no-var
+var OSSettingsAppManagementDomSwitchTest =
+    class extends OSSettingsAppManagementBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return super.browsePreload + 'app_management/dom_switch.html';
+  }
+
+  /** @override */
+  get extraLibraries() {
+    return super.extraLibraries.concat([
+      'app_management/dom_switch_test.js',
+    ]);
+  }
+};
+
+TEST_F('OSSettingsAppManagementDomSwitchTest', 'All', function() {
+  mocha.run();
+});
+
 // Test fixture for the app management settings page.
 // eslint-disable-next-line no-var
 var OSSettingsAppManagementPageTest =
diff --git a/chromecast/browser/general_audience_browsing/mojom/general_audience_browsing.mojom b/chromecast/browser/general_audience_browsing/mojom/general_audience_browsing.mojom
index 2f28857..196aa4d 100644
--- a/chromecast/browser/general_audience_browsing/mojom/general_audience_browsing.mojom
+++ b/chromecast/browser/general_audience_browsing/mojom/general_audience_browsing.mojom
@@ -10,5 +10,5 @@
 
 interface GeneralAudienceBrowsingAPIKeySubject {
   AddGeneralAudienceBrowsingAPIKeyObserver(
-      GeneralAudienceBrowsingAPIKeyObserver observer);
+      pending_remote<GeneralAudienceBrowsingAPIKeyObserver> observer);
 };
diff --git a/chromecast/browser/general_audience_browsing_service.cc b/chromecast/browser/general_audience_browsing_service.cc
index a6f7823..a770141 100644
--- a/chromecast/browser/general_audience_browsing_service.cc
+++ b/chromecast/browser/general_audience_browsing_service.cc
@@ -57,16 +57,15 @@
 
 GeneralAudienceBrowsingService::GeneralAudienceBrowsingService(
     scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory)
-    : shared_url_loader_factory_(shared_url_loader_factory),
-      general_audience_browsing_api_key_observer_binding_(this) {
-  mojom::GeneralAudienceBrowsingAPIKeyObserverPtr observer_ptr;
-  general_audience_browsing_api_key_observer_binding_.Bind(
-      mojo::MakeRequest(&observer_ptr));
-  content::GetSystemConnector()->BindInterface(
+    : shared_url_loader_factory_(shared_url_loader_factory) {
+  content::GetSystemConnector()->Connect(
       mojom::kChromecastServiceName,
-      &general_audience_browsing_api_key_subject_ptr_);
-  general_audience_browsing_api_key_subject_ptr_
-      ->AddGeneralAudienceBrowsingAPIKeyObserver(std::move(observer_ptr));
+      general_audience_browsing_api_key_subject_remote_
+          .BindNewPipeAndPassReceiver());
+  general_audience_browsing_api_key_subject_remote_
+      ->AddGeneralAudienceBrowsingAPIKeyObserver(
+          general_audience_browsing_api_key_observer_receiver_
+              .BindNewPipeAndPassRemote());
 }
 
 GeneralAudienceBrowsingService::~GeneralAudienceBrowsingService() = default;
diff --git a/chromecast/browser/general_audience_browsing_service.h b/chromecast/browser/general_audience_browsing_service.h
index f2f9b48..72f530a5 100644
--- a/chromecast/browser/general_audience_browsing_service.h
+++ b/chromecast/browser/general_audience_browsing_service.h
@@ -10,7 +10,8 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "chromecast/browser/general_audience_browsing/mojom/general_audience_browsing.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "url/gurl.h"
 
 namespace network {
@@ -54,10 +55,10 @@
 
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
 
-  mojo::Binding<mojom::GeneralAudienceBrowsingAPIKeyObserver>
-      general_audience_browsing_api_key_observer_binding_;
-  mojom::GeneralAudienceBrowsingAPIKeySubjectPtr
-      general_audience_browsing_api_key_subject_ptr_;
+  mojo::Receiver<mojom::GeneralAudienceBrowsingAPIKeyObserver>
+      general_audience_browsing_api_key_observer_receiver_{this};
+  mojo::Remote<mojom::GeneralAudienceBrowsingAPIKeySubject>
+      general_audience_browsing_api_key_subject_remote_;
 
   DISALLOW_COPY_AND_ASSIGN(GeneralAudienceBrowsingService);
 };
diff --git a/chromecast/external_mojo/external_service_support/chromium_service.cc b/chromecast/external_mojo/external_service_support/chromium_service.cc
index 74773e3e..d36bbd1 100644
--- a/chromecast/external_mojo/external_service_support/chromium_service.cc
+++ b/chromecast/external_mojo/external_service_support/chromium_service.cc
@@ -40,14 +40,12 @@
     std::unique_ptr<service_manager::Service> chromium_service,
     const std::string& service_name)
     : service_ptr_(std::move(service_ptr)),
-      chromium_service_(std::move(chromium_service)),
-      service_binding_(this) {
+      chromium_service_(std::move(chromium_service)) {
   DCHECK(connector);
   DCHECK(chromium_service_);
 
-  external_mojo::mojom::ExternalServicePtr ptr;
-  service_binding_.Bind(mojo::MakeRequest(&ptr));
-  connector->RegisterService(service_name, std::move(ptr));
+  connector->RegisterService(service_name,
+                             service_receiver_.BindNewPipeAndPassRemote());
 }
 
 ChromiumServiceWrapper::~ChromiumServiceWrapper() = default;
diff --git a/chromecast/external_mojo/external_service_support/chromium_service.h b/chromecast/external_mojo/external_service_support/chromium_service.h
index c7f803c..0eb4b2d 100644
--- a/chromecast/external_mojo/external_service_support/chromium_service.h
+++ b/chromecast/external_mojo/external_service_support/chromium_service.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/cpp/service.h"
@@ -44,7 +44,7 @@
   const service_manager::mojom::ServicePtr service_ptr_;
   const std::unique_ptr<service_manager::Service> chromium_service_;
 
-  mojo::Binding<external_mojo::mojom::ExternalService> service_binding_;
+  mojo::Receiver<external_mojo::mojom::ExternalService> service_receiver_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ChromiumServiceWrapper);
 };
diff --git a/chromecast/external_mojo/external_service_support/external_connector.h b/chromecast/external_mojo/external_service_support/external_connector.h
index 94a3310..9c8fd6c5 100644
--- a/chromecast/external_mojo/external_service_support/external_connector.h
+++ b/chromecast/external_mojo/external_service_support/external_connector.h
@@ -14,6 +14,7 @@
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
 #include "mojo/public/cpp/bindings/interface_ptr.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
 namespace chromecast {
@@ -47,7 +48,8 @@
                                ExternalService* service) = 0;
   virtual void RegisterService(
       const std::string& service_name,
-      external_mojo::mojom::ExternalServicePtr service_ptr) = 0;
+      mojo::PendingRemote<external_mojo::mojom::ExternalService>
+          service_remote) = 0;
 
   // Asks the Mojo broker to bind to a matching interface on the service with
   // the given |service_name|. If the service does not yet exist, the binding
diff --git a/chromecast/external_mojo/external_service_support/external_connector_impl.cc b/chromecast/external_mojo/external_service_support/external_connector_impl.cc
index 844c244..3bc1a84 100644
--- a/chromecast/external_mojo/external_service_support/external_connector_impl.cc
+++ b/chromecast/external_mojo/external_service_support/external_connector_impl.cc
@@ -50,21 +50,22 @@
         kConnectRetryDelay);
     return;
   }
-  external_mojo::mojom::ExternalConnectorPtr connector(
-      external_mojo::mojom::ExternalConnectorPtrInfo(std::move(pipe), 0));
+  mojo::Remote<external_mojo::mojom::ExternalConnector> connector(
+      mojo::PendingRemote<external_mojo::mojom::ExternalConnector>(
+          std::move(pipe), 0));
   std::move(callback).Run(
       std::make_unique<ExternalConnectorImpl>(std::move(connector)));
 }
 
 ExternalConnectorImpl::ExternalConnectorImpl(
-    external_mojo::mojom::ExternalConnectorPtr connector)
+    mojo::Remote<external_mojo::mojom::ExternalConnector> connector)
     : connector_(std::move(connector)) {
-  connector_.set_connection_error_handler(base::BindOnce(
-      &ExternalConnectorImpl::OnConnectionError, base::Unretained(this)));
+  connector_.set_disconnect_handler(base::BindOnce(
+      &ExternalConnectorImpl::OnMojoDisconnect, base::Unretained(this)));
 }
 
 ExternalConnectorImpl::ExternalConnectorImpl(
-    external_mojo::mojom::ExternalConnectorPtrInfo unbound_state)
+    mojo::PendingRemote<external_mojo::mojom::ExternalConnector> unbound_state)
     : unbound_state_(std::move(unbound_state)) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
@@ -78,14 +79,15 @@
 
 void ExternalConnectorImpl::RegisterService(const std::string& service_name,
                                             ExternalService* service) {
-  RegisterService(service_name, service->GetBinding());
+  RegisterService(service_name, service->GetReceiver());
 }
 
 void ExternalConnectorImpl::RegisterService(
     const std::string& service_name,
-    external_mojo::mojom::ExternalServicePtr service_ptr) {
+    mojo::PendingRemote<external_mojo::mojom::ExternalService> service_remote) {
   if (BindConnectorIfNecessary()) {
-    connector_->RegisterServiceInstance(service_name, std::move(service_ptr));
+    connector_->RegisterServiceInstance(service_name,
+                                        std::move(service_remote));
   }
 }
 
@@ -109,12 +111,12 @@
 }
 
 std::unique_ptr<ExternalConnector> ExternalConnectorImpl::Clone() {
-  external_mojo::mojom::ExternalConnectorPtrInfo connector_info;
-  auto request = mojo::MakeRequest(&connector_info);
+  mojo::PendingRemote<external_mojo::mojom::ExternalConnector> connector_remote;
+  auto receiver = connector_remote.InitWithNewPipeAndPassReceiver();
   if (BindConnectorIfNecessary()) {
-    connector_->Clone(std::move(request));
+    connector_->Clone(std::move(receiver));
   }
-  return std::make_unique<ExternalConnectorImpl>(std::move(connector_info));
+  return std::make_unique<ExternalConnectorImpl>(std::move(connector_remote));
 }
 
 void ExternalConnectorImpl::SendChromiumConnectorRequest(
@@ -124,7 +126,7 @@
   }
 }
 
-void ExternalConnectorImpl::OnConnectionError() {
+void ExternalConnectorImpl::OnMojoDisconnect() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   connector_.reset();
   if (connection_error_callback_) {
@@ -141,13 +143,13 @@
   }
 
   if (!unbound_state_.is_valid()) {
-    // OnConnectionError was already called, but |this| was not destroyed.
+    // OnMojoDisconnect was already called, but |this| was not destroyed.
     return false;
   }
 
   connector_.Bind(std::move(unbound_state_));
-  connector_.set_connection_error_handler(base::BindOnce(
-      &ExternalConnectorImpl::OnConnectionError, base::Unretained(this)));
+  connector_.set_disconnect_handler(base::BindOnce(
+      &ExternalConnectorImpl::OnMojoDisconnect, base::Unretained(this)));
 
   return true;
 }
diff --git a/chromecast/external_mojo/external_service_support/external_connector_impl.h b/chromecast/external_mojo/external_service_support/external_connector_impl.h
index 8684934c..d491ed07 100644
--- a/chromecast/external_mojo/external_service_support/external_connector_impl.h
+++ b/chromecast/external_mojo/external_service_support/external_connector_impl.h
@@ -13,6 +13,8 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "chromecast/external_mojo/external_service_support/external_connector.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 
 namespace chromecast {
 namespace external_service_support {
@@ -20,9 +22,10 @@
 class ExternalConnectorImpl : public ExternalConnector {
  public:
   explicit ExternalConnectorImpl(
-      external_mojo::mojom::ExternalConnectorPtr connector);
+      mojo::Remote<external_mojo::mojom::ExternalConnector> connector);
   explicit ExternalConnectorImpl(
-      external_mojo::mojom::ExternalConnectorPtrInfo unbound_state);
+      mojo::PendingRemote<external_mojo::mojom::ExternalConnector>
+          unbound_state);
   ~ExternalConnectorImpl() override;
 
   // ExternalConnector implementation:
@@ -31,7 +34,8 @@
                        ExternalService* service) override;
   void RegisterService(
       const std::string& service_name,
-      external_mojo::mojom::ExternalServicePtr service_ptr) override;
+      mojo::PendingRemote<external_mojo::mojom::ExternalService> service_remote)
+      override;
   void BindInterface(const std::string& service_name,
                      const std::string& interface_name,
                      mojo::ScopedMessagePipeHandle interface_pipe) override;
@@ -45,11 +49,11 @@
           callback) override;
 
  private:
-  void OnConnectionError();
+  void OnMojoDisconnect();
   bool BindConnectorIfNecessary();
 
-  external_mojo::mojom::ExternalConnectorPtr connector_;
-  external_mojo::mojom::ExternalConnectorPtrInfo unbound_state_;
+  mojo::Remote<external_mojo::mojom::ExternalConnector> connector_;
+  mojo::PendingRemote<external_mojo::mojom::ExternalConnector> unbound_state_;
   base::OnceClosure connection_error_callback_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chromecast/external_mojo/external_service_support/external_service.cc b/chromecast/external_mojo/external_service_support/external_service.cc
index 74e7900..8ab79ef4 100644
--- a/chromecast/external_mojo/external_service_support/external_service.cc
+++ b/chromecast/external_mojo/external_service_support/external_service.cc
@@ -9,18 +9,17 @@
 namespace chromecast {
 namespace external_service_support {
 
-ExternalService::ExternalService() : service_binding_(this) {}
+ExternalService::ExternalService() = default;
 
 ExternalService::~ExternalService() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-external_mojo::mojom::ExternalServicePtr ExternalService::GetBinding() {
+mojo::PendingRemote<external_mojo::mojom::ExternalService>
+ExternalService::GetReceiver() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  service_binding_.Close();
-  external_mojo::mojom::ExternalServicePtr ptr;
-  service_binding_.Bind(mojo::MakeRequest(&ptr));
-  return ptr;
+  service_receiver_.reset();
+  return service_receiver_.BindNewPipeAndPassRemote();
 }
 
 void ExternalService::AddInterface(const std::string& interface_name,
diff --git a/chromecast/external_mojo/external_service_support/external_service.h b/chromecast/external_mojo/external_service_support/external_service.h
index 4a9aabd..ad665ab 100644
--- a/chromecast/external_mojo/external_service_support/external_service.h
+++ b/chromecast/external_mojo/external_service_support/external_service.h
@@ -14,8 +14,8 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
 namespace chromecast {
@@ -27,8 +27,8 @@
   ExternalService();
   ~ExternalService() override;
 
-  // Returns the Mojo binding for this service.
-  external_mojo::mojom::ExternalServicePtr GetBinding();
+  // Returns the Mojo receiver for this service.
+  mojo::PendingRemote<external_mojo::mojom::ExternalService> GetReceiver();
 
   // Adds an interface that users of this service may bind to. To avoid races
   // where the service is registered but interfaces cannot be bound by other
@@ -94,7 +94,7 @@
                        mojo::ScopedMessagePipeHandle interface_pipe) override;
 
   std::map<std::string, std::unique_ptr<Binder>> binders_;
-  mojo::Binding<external_mojo::mojom::ExternalService> service_binding_;
+  mojo::Receiver<external_mojo::mojom::ExternalService> service_receiver_{this};
 
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/chromecast/external_mojo/public/cpp/external_mojo_broker.cc b/chromecast/external_mojo/public/cpp/external_mojo_broker.cc
index d690ccc..f2135d5 100644
--- a/chromecast/external_mojo/public/cpp/external_mojo_broker.cc
+++ b/chromecast/external_mojo/public/cpp/external_mojo_broker.cc
@@ -7,6 +7,10 @@
 #include <map>
 #include <utility>
 
+#if OS_LINUX
+#include <sys/stat.h>
+#endif
+
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/location.h"
@@ -20,6 +24,8 @@
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
@@ -73,8 +79,8 @@
     RegisterExternalServices(external_services_to_proxy);
   }
 
-  void AddBinding(mojom::ExternalConnectorRequest request) {
-    bindings_.AddBinding(this, std::move(request));
+  void AddReceiver(mojo::PendingReceiver<mojom::ExternalConnector> receiver) {
+    receivers_.Add(this, std::move(receiver));
   }
 
  private:
@@ -217,14 +223,16 @@
   }
 
   // standalone::mojom::Connector implementation:
-  void RegisterServiceInstance(const std::string& service_name,
-                               mojom::ExternalServicePtr service) override {
+  void RegisterServiceInstance(
+      const std::string& service_name,
+      mojo::PendingRemote<mojom::ExternalService> service_remote) override {
     if (services_.find(service_name) != services_.end()) {
       LOG(ERROR) << "Duplicate service " << service_name;
       return;
     }
     LOG(INFO) << "Register service " << service_name;
-    service.set_connection_error_handler(base::BindOnce(
+    mojo::Remote<mojom::ExternalService> service(std::move(service_remote));
+    service.set_disconnect_handler(base::BindOnce(
         &ConnectorImpl::OnServiceLost, base::Unretained(this), service_name));
     auto it = services_.emplace(service_name, std::move(service)).first;
 
@@ -266,8 +274,9 @@
                        std::move(interface_pipe)));
   }
 
-  void Clone(mojom::ExternalConnectorRequest request) override {
-    AddBinding(std::move(request));
+  void Clone(
+      mojo::PendingReceiver<mojom::ExternalConnector> receiver) override {
+    AddReceiver(std::move(receiver));
   }
 
   void BindChromiumConnector(
@@ -325,11 +334,11 @@
   ServiceManagerConnectorFacade connector_facade_;
   std::unique_ptr<service_manager::Connector> connector_;
 
-  mojo::BindingSet<mojom::ExternalConnector> bindings_;
+  mojo::ReceiverSet<mojom::ExternalConnector> receivers_;
   std::map<std::string, std::unique_ptr<ExternalServiceProxy>>
       registered_external_services_;
 
-  std::map<std::string, mojom::ExternalServicePtr> services_;
+  std::map<std::string, mojo::Remote<mojom::ExternalService>> services_;
   std::map<std::string, std::vector<PendingBindRequest>> pending_bind_requests_;
   std::map<std::string, mojom::ExternalServiceInfo> services_info_;
 
@@ -361,7 +370,8 @@
           std::move(invitation), base::kNullProcessHandle,
           mojo::PlatformChannelEndpoint(
               mojo::PlatformHandle(std::move(accepted_fd))));
-      connector_->AddBinding(mojom::ExternalConnectorRequest(std::move(pipe)));
+      connector_->AddReceiver(
+          mojo::PendingReceiver<mojom::ExternalConnector>(std::move(pipe)));
     }
   }
 
@@ -387,6 +397,11 @@
   mojo::PlatformChannelServerEndpoint server_endpoint =
       named_channel.TakeServerEndpoint();
   DCHECK(server_endpoint.is_valid());
+
+#if OS_LINUX
+  chmod(broker_path.c_str(), 0770);
+#endif
+
   read_watcher_ = std::make_unique<ReadWatcher>(
       connector_.get(), server_endpoint.TakePlatformHandle());
 }
@@ -398,10 +413,11 @@
                                  external_services_to_proxy);
 }
 
-mojom::ExternalConnectorPtr ExternalMojoBroker::CreateConnector() {
-  mojom::ExternalConnectorPtrInfo info;
-  connector_->AddBinding(mojo::MakeRequest(&info));
-  return mojom::ExternalConnectorPtr(std::move(info));
+mojo::PendingRemote<mojom::ExternalConnector>
+ExternalMojoBroker::CreateConnector() {
+  mojo::PendingRemote<mojom::ExternalConnector> remote;
+  connector_->AddReceiver(remote.InitWithNewPipeAndPassReceiver());
+  return remote;
 }
 
 ExternalMojoBroker::~ExternalMojoBroker() = default;
diff --git a/chromecast/external_mojo/public/cpp/external_mojo_broker.h b/chromecast/external_mojo/public/cpp/external_mojo_broker.h
index b8a2ee6..e7737cf 100644
--- a/chromecast/external_mojo/public/cpp/external_mojo_broker.h
+++ b/chromecast/external_mojo/public/cpp/external_mojo_broker.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 
 namespace service_manager {
 class Connector;
@@ -35,7 +36,7 @@
       std::unique_ptr<service_manager::Connector> connector,
       const std::vector<std::string>& external_services_to_proxy);
 
-  mojom::ExternalConnectorPtr CreateConnector();
+  mojo::PendingRemote<mojom::ExternalConnector> CreateConnector();
 
  private:
   class ConnectorImpl;
diff --git a/chromecast/external_mojo/public/mojom/connector.mojom b/chromecast/external_mojo/public/mojom/connector.mojom
index 189721a7..8297654c 100644
--- a/chromecast/external_mojo/public/mojom/connector.mojom
+++ b/chromecast/external_mojo/public/mojom/connector.mojom
@@ -33,7 +33,7 @@
 interface ExternalConnector {
   // Registers a service with the broker.
   RegisterServiceInstance(string service_name,
-                          ExternalService service);
+                          pending_remote<ExternalService> service);
 
   // Asks the broker to pass the |interface_pipe| to the registered service with
   // the given |service_name| to be bound to the appropriate interface. If the
@@ -43,9 +43,9 @@
                 string interface_name,
                 handle<message_pipe> interface_pipe);
 
-  // Creates a new binding to the Connector implementation, to allow clients to
+  // Binds a new receiver to the Connector implementation, to allow clients to
   // clone Connector pointers for use on other threads.
-  Clone(ExternalConnector& request);
+  Clone(pending_receiver<ExternalConnector> receiver);
 
   // Binds to a Chromium service_manager::Connector instance, if possible.
   BindChromiumConnector(handle<message_pipe> interface_pipe);
diff --git a/chromecast/media/DEPS b/chromecast/media/DEPS
index b708eeb..3aa8e73 100644
--- a/chromecast/media/DEPS
+++ b/chromecast/media/DEPS
@@ -12,7 +12,7 @@
   "+media/cdm",
   "+media/filters",
   "+mojo/core/embedder/embedder.h",
-  "+mojo/public/cpp/bindings/binding.h",
+  "+mojo/public/cpp/bindings",
   "+ui/gfx/geometry",
   "+ui/gfx/overlay_transform.h",
   "+services/service_manager/public",
diff --git a/chromecast/media/audio/cast_audio_output_stream.cc b/chromecast/media/audio/cast_audio_output_stream.cc
index 7a23d35d..a45a789 100644
--- a/chromecast/media/audio/cast_audio_output_stream.cc
+++ b/chromecast/media/audio/cast_audio_output_stream.cc
@@ -703,9 +703,9 @@
            << ", session_id=" << application_session_id;
 
   // Connect to the Multiroom interface and fetch the current info.
-  connector_->BindInterface(chromecast::mojom::kChromecastServiceName,
-                            &multiroom_manager_);
-  multiroom_manager_.set_connection_error_handler(
+  connector_->Connect(chromecast::mojom::kChromecastServiceName,
+                      multiroom_manager_.BindNewPipeAndPassReceiver());
+  multiroom_manager_.set_disconnect_handler(
       base::BindOnce(&CastAudioOutputStream::OnGetMultiroomInfo,
                      audio_weak_factory_.GetWeakPtr(), "error",
                      chromecast::mojom::MultiroomInfo::New()));
diff --git a/chromecast/media/audio/cast_audio_output_stream.h b/chromecast/media/audio/cast_audio_output_stream.h
index 4051cedc..55aae30 100644
--- a/chromecast/media/audio/cast_audio_output_stream.h
+++ b/chromecast/media/audio/cast_audio_output_stream.h
@@ -20,6 +20,7 @@
 #include "media/audio/audio_io.h"
 #include "media/base/audio_parameters.h"
 #include "media/base/audio_timestamp_helper.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace chromecast {
@@ -148,7 +149,7 @@
   // empty string if group_id is unused.
   const std::string group_id_;
   MixerServiceConnectionFactory* mixer_service_connection_factory_;
-  chromecast::mojom::MultiroomManagerPtr multiroom_manager_;
+  mojo::Remote<chromecast::mojom::MultiroomManager> multiroom_manager_;
   std::unique_ptr<CmaWrapper> cma_wrapper_;
   std::unique_ptr<MixerServiceWrapper> mixer_service_wrapper_;
 
diff --git a/chromecast/media/cma/test/mock_multiroom_manager.h b/chromecast/media/cma/test/mock_multiroom_manager.h
index 6639c4db..554eb30e 100644
--- a/chromecast/media/cma/test/mock_multiroom_manager.h
+++ b/chromecast/media/cma/test/mock_multiroom_manager.h
@@ -10,7 +10,8 @@
 
 #include "base/bind.h"
 #include "chromecast/common/mojom/multiroom.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 
 namespace chromecast {
 namespace media {
@@ -20,8 +21,9 @@
   ~MockMultiroomManager() override;
 
   void Bind(mojo::ScopedMessagePipeHandle handle) {
-    binding_.Close();
-    binding_.Bind(mojom::MultiroomManagerRequest(std::move(handle)));
+    receiver_.reset();
+    receiver_.Bind(
+        mojo::PendingReceiver<mojom::MultiroomManager>(std::move(handle)));
   }
 
   void GetMultiroomInfo(const std::string& session_id,
@@ -31,13 +33,13 @@
   const std::string GetLastSessionId() { return last_session_id_; }
 
  private:
-  mojo::Binding<mojom::MultiroomManager> binding_;
+  mojo::Receiver<mojom::MultiroomManager> receiver_{this};
   chromecast::mojom::MultiroomInfo info_;
   std::string last_session_id_;
 };
 
 inline MockMultiroomManager::MockMultiroomManager()
-    : binding_(this), last_session_id_("default_session_id") {}
+    : last_session_id_("default_session_id") {}
 
 inline MockMultiroomManager::~MockMultiroomManager() = default;
 
diff --git a/chromecast/media/service/cast_renderer.cc b/chromecast/media/service/cast_renderer.cc
index 26bc268..5eedbe4 100644
--- a/chromecast/media/service/cast_renderer.cc
+++ b/chromecast/media/service/cast_renderer.cc
@@ -133,9 +133,9 @@
                        chromecast::mojom::MultiroomInfo::New());
     return;
   }
-  connector_->BindInterface(chromecast::mojom::kChromecastServiceName,
-                            &multiroom_manager_);
-  multiroom_manager_.set_connection_error_handler(base::BindOnce(
+  connector_->Connect(chromecast::mojom::kChromecastServiceName,
+                      multiroom_manager_.BindNewPipeAndPassReceiver());
+  multiroom_manager_.set_disconnect_handler(base::BindOnce(
       &CastRenderer::OnGetMultiroomInfo, base::Unretained(this), media_resource,
       client, init_cb, application_media_info.Clone(),
       chromecast::mojom::MultiroomInfo::New()));
diff --git a/chromecast/media/service/cast_renderer.h b/chromecast/media/service/cast_renderer.h
index 53969f5a..fdb34a4 100644
--- a/chromecast/media/service/cast_renderer.h
+++ b/chromecast/media/service/cast_renderer.h
@@ -16,6 +16,7 @@
 #include "media/base/renderer.h"
 #include "media/base/waiting.h"
 #include "media/mojo/mojom/cast_application_media_info_manager.mojom.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace base {
@@ -113,7 +114,7 @@
 
   ::media::mojom::CastApplicationMediaInfoManagerPtr
       application_media_info_manager_ptr_;
-  chromecast::mojom::MultiroomManagerPtr multiroom_manager_;
+  mojo::Remote<chromecast::mojom::MultiroomManager> multiroom_manager_;
 
   base::WeakPtrFactory<CastRenderer> weak_factory_;
   DISALLOW_COPY_AND_ASSIGN(CastRenderer);
diff --git a/chromecast/metrics/cast_metrics_service_client.cc b/chromecast/metrics/cast_metrics_service_client.cc
index 665b0fe..6847f932 100644
--- a/chromecast/metrics/cast_metrics_service_client.cc
+++ b/chromecast/metrics/cast_metrics_service_client.cc
@@ -49,7 +49,9 @@
 
 #if defined(OS_ANDROID)
 const char kClientIdName[] = "Client ID";
-#else
+#endif  // defined(OS_ANDROID)
+
+#if !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
 
 const struct ChannelMap {
   const char* chromecast_channel;
@@ -76,7 +78,7 @@
   // Any non-empty channel name is considered beta channel
   return ::metrics::SystemProfileProto::CHANNEL_BETA;
 }
-#endif  // !defined(OS_ANDROID)
+#endif  // !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
 
 }  // namespace
 
@@ -157,7 +159,7 @@
 ::metrics::SystemProfileProto::Channel CastMetricsServiceClient::GetChannel() {
   std::unique_ptr<CastSysInfo> sys_info = CreateSysInfo();
 
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(OS_FUCHSIA)
   switch (sys_info->GetBuildType()) {
     case CastSysInfo::BUILD_ENG:
       return ::metrics::SystemProfileProto::CHANNEL_UNKNOWN;
@@ -174,7 +176,7 @@
   // arbitrary.
   return GetReleaseChannelFromUpdateChannelName(
       sys_info->GetSystemReleaseChannel());
-#endif  // defined(OS_ANDROID)
+#endif  // defined(OS_ANDROID) || defined(OS_FUCHSIA)
 }
 
 std::string CastMetricsServiceClient::GetVersionString() {
diff --git a/chromeos/dbus/debug_daemon_client.cc b/chromeos/dbus/debug_daemon_client.cc
index 1e0954ca4..cd4c4fb 100644
--- a/chromeos/dbus/debug_daemon_client.cc
+++ b/chromeos/dbus/debug_daemon_client.cc
@@ -28,6 +28,7 @@
 #include "base/strings/string_util.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/trace_event/trace_config.h"
 #include "chromeos/dbus/pipe_reader.h"
 #include "dbus/bus.h"
 #include "dbus/message.h"
@@ -283,7 +284,17 @@
         debugd::kDebugdInterface,
         debugd::kSystraceStart);
     dbus::MessageWriter writer(&method_call);
-    writer.AppendString("all");  // TODO(sleffler) parameterize category list
+    if (trace_config.systrace_events().empty()) {
+      writer.AppendString("all");  // TODO(sleffler) parameterize category list
+    } else {
+      std::string events;
+      for (const std::string event : trace_config.systrace_events()) {
+        if (!events.empty())
+          events += " ";
+        events += event;
+      }
+      writer.AppendString(events);
+    }
 
     DVLOG(1) << "Requesting a systrace start";
     debugdaemon_proxy_->CallMethod(
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc
index aefe64e..61e1aa4 100644
--- a/chromeos/network/network_state_handler.cc
+++ b/chromeos/network/network_state_handler.cc
@@ -1137,42 +1137,49 @@
 }
 
 const NetworkState* NetworkStateHandler::GetEAPForEthernet(
-    const std::string& service_path) {
+    const std::string& service_path,
+    bool connected_only) {
   const NetworkState* network = GetNetworkState(service_path);
   if (!network) {
-    NET_LOG_ERROR("GetEAPForEthernet", "Unknown service path " + service_path);
+    NET_LOG(ERROR) << "GetEAPForEthernet: Unknown service: " << service_path;
     return nullptr;
   }
   if (network->type() != shill::kTypeEthernet) {
-    NET_LOG_ERROR("GetEAPForEthernet", "Not of type Ethernet: " + service_path);
+    NET_LOG(ERROR) << "GetEAPForEthernet: Not Ethernet: " << service_path;
     return nullptr;
   }
-  if (!network->IsConnectedState())
-    return nullptr;
+  if (connected_only) {
+    if (!network->IsConnectedState()) {
+      NET_LOG(DEBUG) << "GetEAPForEthernet: Not connected.";
+      return nullptr;
+    }
 
-  // The same EAP service is shared for all ethernet services/devices.
-  // However EAP is used/enabled per device and only if the connection was
-  // successfully established.
-  const DeviceState* device = GetDeviceState(network->device_path());
-  if (!device) {
-    NET_LOG(ERROR) << "GetEAPForEthernet: Unknown device "
-                   << network->device_path()
-                   << " for connected ethernet service: " << service_path;
-    return nullptr;
+    // The same EAP service is shared for all ethernet services/devices.
+    // However EAP is used/enabled per device and only if the connection was
+    // successfully established.
+    const DeviceState* device = GetDeviceState(network->device_path());
+    if (!device) {
+      NET_LOG(ERROR) << "GetEAPForEthernet: Unknown device "
+                     << network->device_path()
+                     << " for connected ethernet service: " << service_path;
+      return nullptr;
+    }
+    if (!device->eap_authentication_completed()) {
+      NET_LOG(DEBUG) << "GetEAPForEthernet: EAP Authenticaiton not completed.";
+      return nullptr;
+    }
   }
-  if (!device->eap_authentication_completed())
-    return nullptr;
 
   NetworkStateList list;
   GetNetworkListByType(NetworkTypePattern::Primitive(shill::kTypeEthernetEap),
                        true /* configured_only */, false /* visible_only */,
                        1 /* limit */, &list);
   if (list.empty()) {
-    NET_LOG_ERROR(
-        "GetEAPForEthernet",
-        base::StringPrintf("Ethernet service %s connected using EAP, but no "
-                           "EAP service found.",
-                           service_path.c_str()));
+    if (connected_only) {
+      NET_LOG(ERROR)
+          << "GetEAPForEthernet: Connected using EAP but no EAP service found: "
+          << service_path;
+    }
     return nullptr;
   }
   return list.front();
diff --git a/chromeos/network/network_state_handler.h b/chromeos/network/network_state_handler.h
index 6ac93a7..5392b26 100644
--- a/chromeos/network/network_state_handler.h
+++ b/chromeos/network/network_state_handler.h
@@ -371,11 +371,12 @@
     return check_portal_list_;
   }
 
-  // Returns the NetworkState of the EthernetEAP service, which contains the
-  // EAP parameters used by the ethernet with |service_path|. If |service_path|
-  // doesn't refer to an ethernet service or if the ethernet service is not
-  // connected using EAP, returns NULL.
-  const NetworkState* GetEAPForEthernet(const std::string& service_path);
+  // Returns the NetworkState for the EthernetEAP service, which contains the
+  // EAP parameters used by the Ethernet network matching |service_path|, if it
+  // exists. If |connected_only| is true, only returns the EthernetEAP state
+  // if the Ethernet network is connected using EAP. Otherwise returns null.
+  const NetworkState* GetEAPForEthernet(const std::string& service_path,
+                                        bool connected_only);
 
   const std::string& default_network_path() const {
     return default_network_path_;
diff --git a/chromeos/network/onc/onc_utils.cc b/chromeos/network/onc/onc_utils.cc
index 3153ac6f..a573cbd0 100644
--- a/chromeos/network/onc/onc_utils.cc
+++ b/chromeos/network/onc/onc_utils.cc
@@ -571,11 +571,11 @@
   // the respective ONC policy. The EthernetEAP service itself is however never
   // in state "connected". An EthernetEAP policy must be applied, if an Ethernet
   // service is connected using the EAP parameters.
-  const NetworkState* ethernet_eap = NULL;
+  const NetworkState* ethernet_eap = nullptr;
   if (NetworkHandler::IsInitialized()) {
     ethernet_eap =
         NetworkHandler::Get()->network_state_handler()->GetEAPForEthernet(
-            network.path());
+            network.path(), /*connected_only=*/true);
   }
 
   // The GUID associated with the EthernetEAP service refers to the ONC policy
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index 484ac72..d64caf44 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-78-3877.0-1568022778-benchmark-78.0.3902.0-r1.orderfile.xz
\ No newline at end of file
+chromeos-chrome-orderfile-field-79-3903.0-1568628088-benchmark-78.0.3902.0-r1.orderfile.xz
\ No newline at end of file
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc
index 19bd598..79f9d6e 100644
--- a/chromeos/services/network_config/cros_network_config.cc
+++ b/chromeos/services/network_config/cros_network_config.cc
@@ -1098,7 +1098,7 @@
   // Typed properties (compatible with NetworkStateProperties):
   result->connection_state =
       GetConnectionState(network_state, /*technology_enabled=*/true);
-  result->source = mojom::OncSource(network_state->onc_source());
+  result->source = GetMojoOncSource(network_state);
   result->type = type;
 
   // Unmanaged properties
@@ -1211,14 +1211,12 @@
       auto ethernet = mojom::ManagedEthernetProperties::New();
       const base::Value* ethernet_dict =
           GetDictionary(properties, ::onc::network_config::kEthernet);
-      if (!ethernet_dict) {
-        result->ethernet = std::move(ethernet);
-        break;
+      if (ethernet_dict) {
+        ethernet->authentication =
+            GetManagedString(ethernet_dict, ::onc::ethernet::kAuthentication);
+        ethernet->eap =
+            GetManagedEAPProperties(ethernet_dict, ::onc::ethernet::kEAP);
       }
-      ethernet->authentication =
-          GetManagedString(ethernet_dict, ::onc::ethernet::kAuthentication);
-      ethernet->eap =
-          GetManagedEAPProperties(ethernet_dict, ::onc::ethernet::kEAP);
       result->ethernet = std::move(ethernet);
       break;
     }
@@ -1490,8 +1488,84 @@
     std::move(iter->second).Run(nullptr);
     return;
   }
-  std::move(iter->second)
-      .Run(ManagedPropertiesToMojo(network_state, vpn_providers_, &properties));
+  mojom::ManagedPropertiesPtr managed_properties =
+      ManagedPropertiesToMojo(network_state, vpn_providers_, &properties);
+
+  // For Ethernet networks with no authentication, check for a separate
+  // EthernetEAP configuration.
+  const NetworkState* eap_state = nullptr;
+  if (managed_properties->type == mojom::NetworkType::kEthernet &&
+      (!managed_properties->ethernet->authentication ||
+       managed_properties->ethernet->authentication->active_value ==
+           ::onc::ethernet::kAuthenticationNone)) {
+    eap_state = network_state_handler_->GetEAPForEthernet(
+        network_state->path(), /*connected_only=*/false);
+  }
+  if (!eap_state) {
+    // No EAP properties, return the managed properties as-is.
+    std::move(iter->second).Run(std::move(managed_properties));
+    get_managed_properties_callbacks_.erase(iter);
+    return;
+  }
+
+  // Request the EAP state. On success the EAP state will be applied to
+  // |managed_properties| and returned. On failure |managed_properties| will
+  // be returned as-is.
+  NET_LOG(DEBUG) << "Requesting EAP state for: " + service_path
+                 << " from: " << eap_state->path();
+  managed_properties_[callback_id] = std::move(managed_properties);
+  network_configuration_handler_->GetManagedProperties(
+      chromeos::LoginState::Get()->primary_user_hash(), eap_state->path(),
+      base::Bind(&CrosNetworkConfig::GetManagedPropertiesSuccessEap,
+                 weak_factory_.GetWeakPtr(), callback_id),
+      base::Bind(&CrosNetworkConfig::GetManagedPropertiesSuccessNoEap,
+                 weak_factory_.GetWeakPtr(), callback_id));
+}
+
+void CrosNetworkConfig::GetManagedPropertiesSuccessEap(
+    int callback_id,
+    const std::string& service_path,
+    const base::DictionaryValue& eap_properties) {
+  auto iter = get_managed_properties_callbacks_.find(callback_id);
+  DCHECK(iter != get_managed_properties_callbacks_.end());
+
+  auto properties_iter = managed_properties_.find(callback_id);
+  DCHECK(properties_iter != managed_properties_.end());
+  mojom::ManagedPropertiesPtr managed_properties =
+      std::move(properties_iter->second);
+  managed_properties_.erase(properties_iter);
+
+  // Copy the EAP properties to |managed_properties_| before sending.
+  const base::Value* ethernet_dict =
+      GetDictionary(&eap_properties, ::onc::network_config::kEthernet);
+  if (ethernet_dict) {
+    auto ethernet = mojom::ManagedEthernetProperties::New();
+    ethernet->authentication =
+        GetManagedString(ethernet_dict, ::onc::ethernet::kAuthentication);
+    ethernet->eap =
+        GetManagedEAPProperties(ethernet_dict, ::onc::ethernet::kEAP);
+    managed_properties->ethernet = std::move(ethernet);
+  }
+
+  std::move(iter->second).Run(std::move(managed_properties));
+  get_managed_properties_callbacks_.erase(iter);
+}
+
+void CrosNetworkConfig::GetManagedPropertiesSuccessNoEap(
+    int callback_id,
+    const std::string& error_name,
+    std::unique_ptr<base::DictionaryValue> error_data) {
+  auto iter = get_managed_properties_callbacks_.find(callback_id);
+  DCHECK(iter != get_managed_properties_callbacks_.end());
+
+  auto properties_iter = managed_properties_.find(callback_id);
+  DCHECK(properties_iter != managed_properties_.end());
+  mojom::ManagedPropertiesPtr managed_properties =
+      std::move(properties_iter->second);
+  managed_properties_.erase(properties_iter);
+
+  // No EAP properties, send the unmodified managed_properties_.
+  std::move(iter->second).Run(std::move(managed_properties));
   get_managed_properties_callbacks_.erase(iter);
 }
 
diff --git a/chromeos/services/network_config/cros_network_config.h b/chromeos/services/network_config/cros_network_config.h
index e91cf1c..2539d54 100644
--- a/chromeos/services/network_config/cros_network_config.h
+++ b/chromeos/services/network_config/cros_network_config.h
@@ -78,6 +78,14 @@
   void GetManagedPropertiesSuccess(int callback_id,
                                    const std::string& service_path,
                                    const base::DictionaryValue& properties);
+  void GetManagedPropertiesSuccessEap(
+      int callback_id,
+      const std::string& service_path,
+      const base::DictionaryValue& eap_properties);
+  void GetManagedPropertiesSuccessNoEap(
+      int callback_id,
+      const std::string& error_name,
+      std::unique_ptr<base::DictionaryValue> error_data);
   void GetManagedPropertiesFailure(
       std::string guid,
       int callback_id,
@@ -125,6 +133,7 @@
   ManagedNetworkConfigurationHandler*
       network_configuration_handler_;                     // Unowned
   NetworkConnectionHandler* network_connection_handler_;  // Unowned
+
   mojo::InterfacePtrSet<mojom::CrosNetworkConfigObserver> observers_;
   mojo::BindingSet<mojom::CrosNetworkConfig> bindings_;
 
@@ -141,6 +150,10 @@
 
   std::vector<mojom::VpnProviderPtr> vpn_providers_;
 
+  // GetManagedProperties may require multiple async calls so we need to store
+  // an owned copy of the mojo properties by callback id.
+  base::flat_map<int, mojom::ManagedPropertiesPtr> managed_properties_;
+
   base::WeakPtrFactory<CrosNetworkConfig> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(CrosNetworkConfig);
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc
index 2c0906b..478f553 100644
--- a/chromeos/services/network_config/cros_network_config_unittest.cc
+++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -150,6 +150,15 @@
     base::RunLoop().RunUntilIdle();
   }
 
+  void SetupEthernetEAP() {
+    std::string eap_path = helper().ConfigureService(
+        R"({"GUID": "eth_eap_guid", "Type": "etherneteap",
+            "State": "online", "EAP.EAP": "TTLS", "EAP.Identity": "user1"})");
+    helper().profile_test()->AddService(
+        NetworkProfileHandler::GetSharedProfilePath(), eap_path);
+    base::RunLoop().RunUntilIdle();
+  }
+
   void SetupObserver() {
     observer_ = std::make_unique<CrosNetworkConfigTestObserver>();
     cros_network_config_->AddObserver(observer_->GenerateInterfacePtr());
@@ -598,6 +607,22 @@
   EXPECT_EQ(0, properties->priority->policy_value);
 }
 
+// Test managed EAP properties which are merged from a separate EthernetEAP
+// Shill service.
+TEST_F(CrosNetworkConfigTest, GetManagedPropertiesEAP) {
+  SetupEthernetEAP();
+  mojom::ManagedPropertiesPtr properties = GetManagedProperties("eth_guid");
+  ASSERT_TRUE(properties);
+  EXPECT_EQ("eth_guid", properties->guid);
+  EXPECT_EQ(mojom::NetworkType::kEthernet, properties->type);
+  ASSERT_TRUE(properties->ethernet);
+  ASSERT_TRUE(properties->ethernet->authentication);
+  EXPECT_EQ("8021X", properties->ethernet->authentication->active_value);
+  ASSERT_TRUE(properties->ethernet->eap);
+  ASSERT_TRUE(properties->ethernet->eap->identity);
+  EXPECT_EQ("user1", properties->ethernet->eap->identity->active_value);
+}
+
 TEST_F(CrosNetworkConfigTest, SetProperties) {
   // Use wifi3 since it has a profile path (i.e. it is 'saved'). and is not
   // policy controoled.
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
index 907e7f97..5f78b97 100644
--- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom
+++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -196,6 +196,9 @@
 };
 
 struct EthernetStateProperties {
+  // This represents the actual authentication type for a connected Ethernet
+  // network. Note: An EAP configuration may exist but not be applied (e.g. if
+  // no certificate is installed), in which case the value will be kNone.
   AuthenticationType authentication;
 };
 
@@ -556,6 +559,10 @@
 };
 
 struct ManagedEthernetProperties {
+  // This represents the configured authentication type for an Ethernet network.
+  // Note: This might not match the State value (which uses an enum instead of
+  // a managed string) if the EAP configuration can not be applied (e.g. when
+  // no certificate is installed).
   ManagedString? authentication;
   ManagedEAPProperties? eap;
 };
diff --git a/components/BUILD.gn b/components/BUILD.gn
index b3d7779..df48649 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -270,7 +270,6 @@
       deps += [
         "//components/crash/content/app:unit_tests",
         "//components/crash/content/browser:unit_tests",
-        "//components/data_reduction_proxy/content/browser:unit_tests",
         "//components/data_reduction_proxy/content/common:unit_tests",
         "//components/data_reduction_proxy/content/renderer:unit_tests",
         "//components/data_reduction_proxy/core/browser:unit_tests",
@@ -354,6 +353,7 @@
     deps += [
       "//components/arc:unit_tests",
       "//components/arc/mojom:unit_tests",
+      "//components/guest_os:unit_tests",
       "//components/ownership:unit_tests",
       "//components/timers:unit_tests",
       "//components/user_manager:unit_tests",
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 75b42beb..63568d5 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -103,6 +103,7 @@
     "//components/account_id",
     "//components/exo",
     "//components/google/core/common",
+    "//components/guest_os",
     "//components/onc",
     "//components/prefs",
     "//components/session_manager/core",
@@ -143,6 +144,7 @@
 
   deps = [
     ":arc_base_enums",
+    "//components/guest_os:prefs",
     "//components/prefs",
   ]
 }
diff --git a/components/arc/DEPS b/components/arc/DEPS
index dc65ae70..955ca638 100644
--- a/components/arc/DEPS
+++ b/components/arc/DEPS
@@ -3,6 +3,7 @@
   "+chromeos/constants",
   "+chromeos/cryptohome",
   "+chromeos/dbus",
+  "+components/guest_os",
   "+components/account_id",
   "+components/exo",
   "+components/keyed_service",
diff --git a/components/arc/arc_prefs.cc b/components/arc/arc_prefs.cc
index 125a94e..8065710 100644
--- a/components/arc/arc_prefs.cc
+++ b/components/arc/arc_prefs.cc
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "components/guest_os/guest_os_prefs.h"
 #include "components/prefs/pref_registry_simple.h"
 
 namespace arc {
@@ -105,25 +106,9 @@
 // Integer pref indicating the ecryptfs to ext4 migration strategy. One of
 // options: forbidden = 0, migrate = 1, wipe = 2 or minimal migrate = 4.
 const char kEcryptfsMigrationStrategy[] = "ecryptfs_migration_strategy";
-// A preference that persists total engagement time across sessions, which is
-// accumulated and sent to UMA once a day.
-const char kEngagementTimeTotal[] = "arc.metrics.engagement_time.total";
-// A preference that persists foreground engagement time across sessions, which
-// is accumulated and sent to UMA once a day.
-const char kEngagementTimeForeground[] =
-    "arc.metrics.engagement_time.foreground";
-// A preference that persists background engagement time across sessions, which
-// is accumulated and sent to UMA once a day.
-const char kEngagementTimeBackground[] =
-    "arc.metrics.engagement_time.background";
-// A preference that saves the OS version when engagement time was last
-// recorded. Old results will be discarded if a version change is detected.
-const char kEngagementTimeOsVersion[] =
-    "arc.metrics.engagement_time.os_version";
-// A preference that saves the day ID (number of days since origin of Time) when
-// engagement time was last recorded. Accumulated results are sent to UMA if day
-// ID has changed.
-const char kEngagementTimeDayId[] = "arc.metrics.engagement_time.day_id";
+// Preferences for storing engagement time data, as per
+// GuestOsEngagementMetrics.
+const char kEngagementPrefsPrefix[] = "arc.metrics";
 
 // ======== LOCAL STATE PREFS ========
 
@@ -159,6 +144,9 @@
       kArcSupervisionTransition,
       static_cast<int>(ArcSupervisionTransition::NO_TRANSITION));
 
+  guest_os::prefs::RegisterEngagementProfilePrefs(registry,
+                                                  kEngagementPrefsPrefix);
+
   // Sorted in lexicographical order.
   registry->RegisterBooleanPref(kAlwaysOnVpnLockdown, false);
   registry->RegisterStringPref(kAlwaysOnVpnPackage, std::string());
@@ -176,11 +164,6 @@
   registry->RegisterBooleanPref(kArcTermsAccepted, false);
   registry->RegisterBooleanPref(kArcTermsShownInOobe, false);
   registry->RegisterListPref(kArcVisibleExternalStorages);
-  registry->RegisterTimeDeltaPref(kEngagementTimeBackground, base::TimeDelta());
-  registry->RegisterIntegerPref(kEngagementTimeDayId, 0);
-  registry->RegisterTimeDeltaPref(kEngagementTimeForeground, base::TimeDelta());
-  registry->RegisterStringPref(kEngagementTimeOsVersion, "");
-  registry->RegisterTimeDeltaPref(kEngagementTimeTotal, base::TimeDelta());
 }
 
 }  // namespace prefs
diff --git a/components/arc/arc_prefs.h b/components/arc/arc_prefs.h
index 65654bf..d4d00f5 100644
--- a/components/arc/arc_prefs.h
+++ b/components/arc/arc_prefs.h
@@ -41,11 +41,7 @@
 ARC_EXPORT extern const char kArcTermsShownInOobe[];
 ARC_EXPORT extern const char kArcVisibleExternalStorages[];
 ARC_EXPORT extern const char kEcryptfsMigrationStrategy[];
-ARC_EXPORT extern const char kEngagementTimeBackground[];
-ARC_EXPORT extern const char kEngagementTimeDayId[];
-ARC_EXPORT extern const char kEngagementTimeForeground[];
-ARC_EXPORT extern const char kEngagementTimeOsVersion[];
-ARC_EXPORT extern const char kEngagementTimeTotal[];
+ARC_EXPORT extern const char kEngagementPrefsPrefix[];
 
 // Local state prefs in lexicographical order.
 ARC_EXPORT extern const char kStabilityMetrics[];
diff --git a/components/arc/metrics/arc_metrics_service.cc b/components/arc/metrics/arc_metrics_service.cc
index 3ad50fe..3d1b52a 100644
--- a/components/arc/metrics/arc_metrics_service.cc
+++ b/components/arc/metrics/arc_metrics_service.cc
@@ -13,9 +13,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
-#include "base/system/sys_info.h"
-#include "base/time/default_clock.h"
-#include "base/time/default_tick_clock.h"
 #include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
@@ -26,7 +23,6 @@
 #include "components/arc/session/arc_bridge_service.h"
 #include "components/exo/wm_helper.h"
 #include "components/prefs/pref_service.h"
-#include "components/session_manager/core/session_manager.h"
 #include "components/user_prefs/user_prefs.h"
 #include "content/public/browser/browser_context.h"
 #include "ui/events/ozone/gamepad/gamepad_provider_ozone.h"
@@ -35,6 +31,8 @@
 
 namespace {
 
+constexpr char kUmaPrefix[] = "Arc";
+
 constexpr base::TimeDelta kUmaMinTime = base::TimeDelta::FromMilliseconds(1);
 constexpr base::TimeDelta kUmaMaxTime = base::TimeDelta::FromSeconds(60);
 constexpr int kUmaNumBuckets = 50;
@@ -45,11 +43,6 @@
 constexpr char kGmsProcessNamePrefix[] = "com.google.android.gms";
 constexpr char kBootProgressEnableScreen[] = "boot_progress_enable_screen";
 
-constexpr base::TimeDelta kUpdateEngagementTimePeriod =
-    base::TimeDelta::FromMinutes(1);
-constexpr base::TimeDelta kSaveEngagementTimeToPrefsPeriod =
-    base::TimeDelta::FromMinutes(30);
-
 std::string BootTypeToString(mojom::BootType boot_type) {
   switch (boot_type) {
     case mojom::BootType::UNKNOWN:
@@ -65,10 +58,6 @@
   return "";
 }
 
-inline int GetDayId(const base::Clock* clock) {
-  return clock->Now().LocalMidnight().since_origin().InDays();
-}
-
 // Singleton factory for ArcMetricsService.
 class ArcMetricsServiceFactory
     : public internal::ArcBrowserContextKeyedServiceFactoryBase<
@@ -110,44 +99,26 @@
 ArcMetricsService::ArcMetricsService(content::BrowserContext* context,
                                      ArcBridgeService* bridge_service)
     : arc_bridge_service_(bridge_service),
-      window_matcher_(base::BindRepeating(arc::IsArcAppWindow)),
-      process_observer_(this),
-      pref_service_(user_prefs::UserPrefs::Get(context)),
-      clock_(base::DefaultClock::GetInstance()),
-      tick_clock_(base::DefaultTickClock::GetInstance()),
-      last_update_ticks_(tick_clock_->NowTicks()) {
+      guest_os_engagement_metrics_(user_prefs::UserPrefs::Get(context),
+                                   base::BindRepeating(arc::IsArcAppWindow),
+                                   prefs::kEngagementPrefsPrefix,
+                                   kUmaPrefix),
+      process_observer_(this) {
   arc_bridge_service_->metrics()->SetHost(this);
   arc_bridge_service_->process()->AddObserver(&process_observer_);
   // If WMHelper doesn't exist, do nothing. This occurs in tests.
   if (exo::WMHelper::HasInstance())
     exo::WMHelper::GetInstance()->AddActivationObserver(this);
-  session_manager::SessionManager::Get()->AddObserver(this);
-  chromeos::PowerManagerClient::Get()->AddObserver(this);
   ui::GamepadProviderOzone::GetInstance()->AddGamepadObserver(this);
 
-  DCHECK(pref_service_);
-  RestoreEngagementTimeFromPrefs();
-  update_engagement_time_timer_.Start(FROM_HERE, kUpdateEngagementTimePeriod,
-                                      this,
-                                      &ArcMetricsService::UpdateEngagementTime);
-  save_engagement_time_to_prefs_timer_.Start(
-      FROM_HERE, kSaveEngagementTimeToPrefsPeriod, this,
-      &ArcMetricsService::SaveEngagementTimeToPrefs);
-
   StabilityMetricsManager::Get()->SetArcNativeBridgeType(
       NativeBridgeType::UNKNOWN);
 }
 
 ArcMetricsService::~ArcMetricsService() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  save_engagement_time_to_prefs_timer_.Stop();
-  update_engagement_time_timer_.Stop();
-  UpdateEngagementTime();
-  SaveEngagementTimeToPrefs();
 
   ui::GamepadProviderOzone::GetInstance()->RemoveGamepadObserver(this);
-  chromeos::PowerManagerClient::Get()->RemoveObserver(this);
-  session_manager::SessionManager::Get()->RemoveObserver(this);
   // If WMHelper is already destroyed, do nothing.
   // TODO(crbug.com/748380): Fix shutdown order.
   if (exo::WMHelper::HasInstance())
@@ -156,19 +127,6 @@
   arc_bridge_service_->metrics()->SetHost(nullptr);
 }
 
-void ArcMetricsService::SetWindowMatcherForTesting(
-    WindowMatcher window_matcher) {
-  window_matcher_ = window_matcher;
-}
-
-void ArcMetricsService::SetClockForTesting(base::Clock* clock) {
-  clock_ = clock;
-}
-
-void ArcMetricsService::SetTickClockForTesting(base::TickClock* tick_clock) {
-  tick_clock_ = tick_clock;
-}
-
 void ArcMetricsService::OnProcessConnectionReady() {
   VLOG(2) << "Start updating process list.";
   request_process_list_timer_.Start(FROM_HERE, kRequestProcessListPeriod, this,
@@ -300,8 +258,7 @@
     wm::ActivationChangeObserver::ActivationReason reason,
     aura::Window* gained_active,
     aura::Window* lost_active) {
-  UpdateEngagementTime();
-  was_arc_window_active_ = window_matcher_.Run(gained_active);
+  was_arc_window_active_ = arc::IsArcAppWindow(gained_active);
   if (!was_arc_window_active_) {
     gamepad_interaction_recorded_ = false;
     return;
@@ -311,19 +268,6 @@
       UserInteractionType::APP_CONTENT_WINDOW_INTERACTION);
 }
 
-void ArcMetricsService::OnSessionStateChanged() {
-  UpdateEngagementTime();
-  was_session_active_ =
-      session_manager::SessionManager::Get()->session_state() ==
-      session_manager::SessionState::ACTIVE;
-}
-
-void ArcMetricsService::ScreenIdleStateChanged(
-    const power_manager::ScreenIdleState& proto) {
-  UpdateEngagementTime();
-  was_screen_dimmed_ = proto.dimmed();
-}
-
 void ArcMetricsService::OnGamepadEvent(const ui::GamepadEvent& event) {
   if (!was_arc_window_active_)
     return;
@@ -338,125 +282,18 @@
                                       const std::string& package_name,
                                       const std::string& activity,
                                       const std::string& intent) {
-  UpdateEngagementTime();
   task_ids_.push_back(task_id);
+  guest_os_engagement_metrics_.SetBackgroundActive(true);
 }
 
 void ArcMetricsService::OnTaskDestroyed(int32_t task_id) {
-  UpdateEngagementTime();
   auto it = std::find(task_ids_.begin(), task_ids_.end(), task_id);
   if (it == task_ids_.end()) {
     LOG(WARNING) << "unknown task_id, background time might be undermeasured";
     return;
   }
   task_ids_.erase(it);
-}
-
-void ArcMetricsService::RestoreEngagementTimeFromPrefs() {
-  // Restore accumulated results only if they were recorded on the same OS
-  // version.
-  if (pref_service_->GetString(prefs::kEngagementTimeOsVersion) ==
-      base::SysInfo::OperatingSystemVersion()) {
-    day_id_ = pref_service_->GetInteger(prefs::kEngagementTimeDayId);
-    engagement_time_total_ =
-        pref_service_->GetTimeDelta(prefs::kEngagementTimeTotal);
-    engagement_time_foreground_ =
-        pref_service_->GetTimeDelta(prefs::kEngagementTimeForeground);
-    engagement_time_background_ =
-        pref_service_->GetTimeDelta(prefs::kEngagementTimeBackground);
-  } else {
-    ResetEngagementTimePrefs();
-  }
-
-  RecordEngagementTimeToUmaIfNeeded();
-}
-
-void ArcMetricsService::SaveEngagementTimeToPrefs() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(pref_service_);
-
-  pref_service_->SetString(prefs::kEngagementTimeOsVersion,
-                           base::SysInfo::OperatingSystemVersion());
-  pref_service_->SetInteger(prefs::kEngagementTimeDayId, day_id_);
-  pref_service_->SetTimeDelta(prefs::kEngagementTimeTotal,
-                              engagement_time_total_);
-  pref_service_->SetTimeDelta(prefs::kEngagementTimeForeground,
-                              engagement_time_foreground_);
-  pref_service_->SetTimeDelta(prefs::kEngagementTimeBackground,
-                              engagement_time_background_);
-}
-
-void ArcMetricsService::UpdateEngagementTime() {
-  VLOG(2) << "last state: dimmed=" << was_screen_dimmed_
-          << " active=" << was_session_active_
-          << " focus=" << was_arc_window_active_
-          << " #tasks=" << task_ids_.size();
-
-  base::TimeTicks now = tick_clock_->NowTicks();
-  base::TimeDelta elapsed = now - last_update_ticks_;
-
-  if (ShouldAccumulateEngagementTotalTime()) {
-    VLOG(2) << "accumulate to total time " << elapsed;
-    engagement_time_total_ += elapsed;
-    if (ShouldAccumulateEngagementForegroundTime()) {
-      VLOG(2) << "accumulate to foreground time " << elapsed;
-      engagement_time_foreground_ += elapsed;
-    } else if (ShouldAccumulateEngagementBackgroundTime()) {
-      VLOG(2) << "accumulate to background time " << elapsed;
-      engagement_time_background_ += elapsed;
-    }
-  }
-
-  last_update_ticks_ = now;
-  RecordEngagementTimeToUmaIfNeeded();
-}
-
-void ArcMetricsService::RecordEngagementTimeToUmaIfNeeded() {
-  if (!ShouldRecordEngagementTimeToUma())
-    return;
-  VLOG(2) << "day changed, recording engagement time to UMA";
-  UMA_HISTOGRAM_CUSTOM_TIMES(
-      "Arc.EngagementTime.Total", engagement_time_total_,
-      base::TimeDelta::FromSeconds(1),
-      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
-  UMA_HISTOGRAM_CUSTOM_TIMES(
-      "Arc.EngagementTime.ArcTotal",
-      engagement_time_foreground_ + engagement_time_background_,
-      base::TimeDelta::FromSeconds(1),
-      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
-  UMA_HISTOGRAM_CUSTOM_TIMES(
-      "Arc.EngagementTime.Foreground", engagement_time_foreground_,
-      base::TimeDelta::FromSeconds(1),
-      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
-  UMA_HISTOGRAM_CUSTOM_TIMES(
-      "Arc.EngagementTime.Background", engagement_time_background_,
-      base::TimeDelta::FromSeconds(1),
-      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
-  ResetEngagementTimePrefs();
-}
-
-void ArcMetricsService::ResetEngagementTimePrefs() {
-  day_id_ = GetDayId(clock_);
-  engagement_time_total_ = base::TimeDelta();
-  engagement_time_foreground_ = base::TimeDelta();
-  engagement_time_background_ = base::TimeDelta();
-  SaveEngagementTimeToPrefs();
-}
-
-bool ArcMetricsService::ShouldAccumulateEngagementTotalTime() const {
-  return was_session_active_ && !was_screen_dimmed_;
-}
-
-bool ArcMetricsService::ShouldAccumulateEngagementForegroundTime() const {
-  return was_arc_window_active_;
-}
-
-bool ArcMetricsService::ShouldAccumulateEngagementBackgroundTime() const {
-  return task_ids_.size() > 0;
-}
-
-bool ArcMetricsService::ShouldRecordEngagementTimeToUma() const {
-  return day_id_ != GetDayId(clock_);
+  guest_os_engagement_metrics_.SetBackgroundActive(!task_ids_.empty());
 }
 
 ArcMetricsService::ProcessObserver::ProcessObserver(
diff --git a/components/arc/metrics/arc_metrics_service.h b/components/arc/metrics/arc_metrics_service.h
index c5f622e..fefddb6c 100644
--- a/components/arc/metrics/arc_metrics_service.h
+++ b/components/arc/metrics/arc_metrics_service.h
@@ -15,27 +15,20 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "chromeos/dbus/power/power_manager_client.h"
 #include "components/arc/mojom/metrics.mojom.h"
 #include "components/arc/mojom/process.mojom.h"
 #include "components/arc/session/connection_observer.h"
+#include "components/guest_os/guest_os_engagement_metrics.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/session_manager/core/session_manager_observer.h"
 #include "ui/events/ozone/gamepad/gamepad_observer.h"
 #include "ui/wm/public/activation_change_observer.h"
 
 class BrowserContextKeyedServiceFactory;
-class PrefService;
 
 namespace aura {
 class Window;
 }  // namespace aura
 
-namespace base {
-class Clock;
-class TickClock;
-}  // namespace base
-
 namespace content {
 class BrowserContext;
 }  // namespace content
@@ -47,22 +40,9 @@
 // Collects information from other ArcServices and send UMA metrics.
 class ArcMetricsService : public KeyedService,
                           public wm::ActivationChangeObserver,
-                          public session_manager::SessionManagerObserver,
-                          public chromeos::PowerManagerClient::Observer,
                           public mojom::MetricsHost,
                           public ui::GamepadObserver {
  public:
-  using WindowMatcher = base::RepeatingCallback<bool(const aura::Window*)>;
-
-  // Sets the fake WindowMatcher for testing.
-  void SetWindowMatcherForTesting(WindowMatcher window_matcher);
-
-  // Sets Clock for testing.
-  void SetClockForTesting(base::Clock* clock);
-
-  // Sets TickClock for testing.
-  void SetTickClockForTesting(base::TickClock* tick_clock);
-
   // Returns singleton instance for the given BrowserContext,
   // or nullptr if the browser |context| is not allowed to use ARC.
   static ArcMetricsService* GetForBrowserContext(
@@ -92,13 +72,6 @@
                          aura::Window* gained_active,
                          aura::Window* lost_active) override;
 
-  // session_manager::SessionManagerObserver overrides.
-  void OnSessionStateChanged() override;
-
-  // chromeos::PowerManagerClient::Observer overrides.
-  void ScreenIdleStateChanged(
-      const power_manager::ScreenIdleState& proto) override;
-
   // ui::GamepadObserver overrides.
   void OnGamepadEvent(const ui::GamepadEvent& event) override;
 
@@ -135,61 +108,19 @@
                                mojom::BootType boot_type,
                                base::Optional<base::TimeTicks> arc_start_time);
 
-  // Restores accumulated ARC++ engagement time in previous sessions from
-  // profile preferences.
-  void RestoreEngagementTimeFromPrefs();
-
-  // Called periodically to save accumulated results to profile preferences.
-  void SaveEngagementTimeToPrefs();
-
-  // Called whenever engagement state is changed. Time spent in last state is
-  // accumulated to corresponding metrics.
-  void UpdateEngagementTime();
-
-  // Records accumulated engagement time metrics to UMA if necessary (i.e. day
-  // has changed).
-  void RecordEngagementTimeToUmaIfNeeded();
-
-  // Resets accumulated engagement times to zero, and updates both OS version
-  // and day ID.
-  void ResetEngagementTimePrefs();
-
-  bool ShouldAccumulateEngagementTotalTime() const;
-  bool ShouldAccumulateEngagementForegroundTime() const;
-  bool ShouldAccumulateEngagementBackgroundTime() const;
-  bool ShouldRecordEngagementTimeToUma() const;
-
   THREAD_CHECKER(thread_checker_);
 
   ArcBridgeService* const arc_bridge_service_;  // Owned by ArcServiceManager.
 
-  // A function to determine if a window is an ARC window, which can be
-  // replaced in tests.
-  WindowMatcher window_matcher_;
+  // Helper class for tracking engagement metrics.
+  guest_os::GuestOsEngagementMetrics guest_os_engagement_metrics_;
 
   ProcessObserver process_observer_;
   base::RepeatingTimer request_process_list_timer_;
 
-  PrefService* const pref_service_;
-  const base::Clock* clock_;
-  const base::TickClock* tick_clock_;
-  base::RepeatingTimer update_engagement_time_timer_;
-  base::RepeatingTimer save_engagement_time_to_prefs_timer_;
-  base::TimeTicks last_update_ticks_;
-
-  // States for determining which engagement metrics should we accumulate to.
-  bool was_session_active_ = false;
-  bool was_screen_dimmed_ = false;
   bool was_arc_window_active_ = false;
   std::vector<int32_t> task_ids_;
 
-  // Accumulated results and associated state which are saved to profile
-  // preferences at fixed interval.
-  int day_id_ = 0;
-  base::TimeDelta engagement_time_total_;
-  base::TimeDelta engagement_time_foreground_;
-  base::TimeDelta engagement_time_background_;
-
   bool gamepad_interaction_recorded_ = false;
 
   // Always keep this the last member of this class to make sure it's the
diff --git a/components/arc/metrics/arc_metrics_service_unittest.cc b/components/arc/metrics/arc_metrics_service_unittest.cc
index 3674225..c48b292 100644
--- a/components/arc/metrics/arc_metrics_service_unittest.cc
+++ b/components/arc/metrics/arc_metrics_service_unittest.cc
@@ -6,19 +6,12 @@
 
 #include <algorithm>
 #include <array>
-#include <memory>
-#include <string>
 #include <utility>
 
 #include "ash/public/cpp/app_types.h"
 #include "base/metrics/histogram_samples.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/simple_test_clock.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/dbus/power/fake_power_manager_client.h"
-#include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
 #include "components/arc/arc_prefs.h"
 #include "components/arc/arc_service_manager.h"
@@ -36,44 +29,6 @@
 namespace arc {
 namespace {
 
-// Helper class that initializes and shuts down dbus clients for testing.
-class DBusThreadManagerLifetimeHelper {
- public:
-  DBusThreadManagerLifetimeHelper() {
-    chromeos::PowerManagerClient::InitializeFake();
-    chromeos::SessionManagerClient::InitializeFakeInMemory();
-  }
-
-  ~DBusThreadManagerLifetimeHelper() {
-    chromeos::SessionManagerClient::Shutdown();
-    chromeos::PowerManagerClient::Shutdown();
-  }
-};
-
-// Helper class that ensures lifetime of StabilityMetricsManager for testing.
-class ScopedStabilityMetricsManager {
- public:
-  ScopedStabilityMetricsManager() {
-    prefs::RegisterLocalStatePrefs(local_state_.registry());
-    StabilityMetricsManager::Initialize(&local_state_);
-  }
-
-  ~ScopedStabilityMetricsManager() { StabilityMetricsManager::Shutdown(); }
-
- private:
-  TestingPrefServiceSimple local_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedStabilityMetricsManager);
-};
-
-// Initializes dependencies before creating ArcMetricsService instance.
-ArcMetricsService* CreateArcMetricsService(TestBrowserContext* context) {
-  // Register preferences for ARC++ engagement time metrics.
-  prefs::RegisterProfilePrefs(context->pref_registry());
-
-  return ArcMetricsService::GetForBrowserContextForTesting(context);
-}
-
 // The event names the container sends to Chrome.
 constexpr std::array<const char*, 11> kBootEvents{
     "boot_progress_start",
@@ -90,22 +45,33 @@
 
 class ArcMetricsServiceTest : public testing::Test {
  protected:
-  ArcMetricsServiceTest()
-      : arc_service_manager_(std::make_unique<ArcServiceManager>()),
-        context_(std::make_unique<TestBrowserContext>()),
-        service_(CreateArcMetricsService(context_.get())) {
+  ArcMetricsServiceTest() {
+    prefs::RegisterLocalStatePrefs(local_state_.registry());
+    StabilityMetricsManager::Initialize(&local_state_);
+    chromeos::PowerManagerClient::InitializeFake();
+    chromeos::SessionManagerClient::InitializeFakeInMemory();
     chromeos::FakeSessionManagerClient::Get()->set_arc_available(true);
 
+    arc_service_manager_ = std::make_unique<ArcServiceManager>();
+    context_ = std::make_unique<TestBrowserContext>();
+    prefs::RegisterProfilePrefs(context_->pref_registry());
+    service_ =
+        ArcMetricsService::GetForBrowserContextForTesting(context_.get());
+
     CreateFakeWindows();
-    service_->SetWindowMatcherForTesting(base::BindRepeating(
-        &ArcMetricsServiceTest::MatchWindow, base::Unretained(this)));
-    // The code doesn't work for correctly for a clock at the epoch.
-    test_clock_.SetNow(base::Time::Now());
-    service_->SetClockForTesting(&test_clock_);
-    service_->SetTickClockForTesting(&test_tick_clock_);
   }
 
-  ~ArcMetricsServiceTest() override {}
+  ~ArcMetricsServiceTest() override {
+    fake_non_arc_window_.reset();
+    fake_arc_window_.reset();
+
+    context_.reset();
+    arc_service_manager_.reset();
+
+    chromeos::SessionManagerClient::Shutdown();
+    chromeos::PowerManagerClient::Shutdown();
+    StabilityMetricsManager::Shutdown();
+  }
 
   ArcMetricsService* service() { return service_; }
 
@@ -128,29 +94,9 @@
     return events;
   }
 
-  void SetSessionState(session_manager::SessionState state) {
-    session_manager_.SetSessionState(state);
-  }
-
-  void SetScreenDimmed(bool is_screen_dimmed) {
-    power_manager::ScreenIdleState screen_idle_state;
-    screen_idle_state.set_dimmed(is_screen_dimmed);
-    GetPowerManagerClient()->SendScreenIdleStateChanged(screen_idle_state);
-  }
-
-  void TriggerRecordEngagementTimeToUma() {
-    // Trigger UMA record by changing to next day.
-    test_clock_.Advance(base::TimeDelta::FromDays(1));
-    service_->OnSessionStateChanged();
-  }
-
   aura::Window* fake_arc_window() { return fake_arc_window_.get(); }
   aura::Window* fake_non_arc_window() { return fake_non_arc_window_.get(); }
 
-  void AdvanceSeconds(int seconds) {
-    test_tick_clock_.Advance(base::TimeDelta::FromSeconds(seconds));
-  }
-
  private:
   void CreateFakeWindows() {
     fake_arc_window_.reset(aura::test::CreateTestWindowWithId(
@@ -161,34 +107,17 @@
         /*id=*/1, nullptr));
   }
 
-  bool MatchWindow(const aura::Window* window) const {
-    return window == fake_arc_window_.get();
-  }
-
-  chromeos::FakePowerManagerClient* GetPowerManagerClient() {
-    return static_cast<chromeos::FakePowerManagerClient*>(
-        chromeos::PowerManagerClient::Get());
-  }
-
   content::BrowserTaskEnvironment task_environment_;
-
-  base::SimpleTestClock test_clock_;
-  base::SimpleTestTickClock test_tick_clock_;
+  TestingPrefServiceSimple local_state_;
+  session_manager::SessionManager session_manager_;
 
   std::unique_ptr<ArcServiceManager> arc_service_manager_;
-
-  // DBusThreadManager, SessionManager and StabilityMetricsManager should
-  // outlive TestBrowserContext which destructs ArcMetricsService in dtor.
-  DBusThreadManagerLifetimeHelper dbus_thread_manager_lifetime_helper_;
-  session_manager::SessionManager session_manager_;
-  ScopedStabilityMetricsManager scoped_stability_metrics_manager_;
   std::unique_ptr<TestBrowserContext> context_;
+  ArcMetricsService* service_;
 
   std::unique_ptr<aura::Window> fake_arc_window_;
   std::unique_ptr<aura::Window> fake_non_arc_window_;
 
-  ArcMetricsService* const service_;
-
   DISALLOW_COPY_AND_ASSIGN(ArcMetricsServiceTest);
 };
 
@@ -360,147 +289,5 @@
       static_cast<int>(UserInteractionType::APP_CONTENT_WINDOW_INTERACTION), 1);
 }
 
-TEST_F(ArcMetricsServiceTest, RecordEngagementTimeSessionLocked) {
-  base::HistogramTester tester;
-
-  // Make session inactive for 1 sec. Nothing should be recorded.
-  SetSessionState(session_manager::SessionState::LOCKED);
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(0), 1);
-}
-
-TEST_F(ArcMetricsServiceTest, RecordEngagementTimeSessionActive) {
-  base::HistogramTester tester;
-
-  // Make session active for 1 sec. Should be recorded as total time.
-  SetSessionState(session_manager::SessionState::ACTIVE);
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(0), 1);
-}
-
-TEST_F(ArcMetricsServiceTest, RecordEngagementTimeScreenDimmed) {
-  base::HistogramTester tester;
-  SetSessionState(session_manager::SessionState::ACTIVE);
-
-  // Dim screen off for 1 sec. Nothing should be recorded.
-  SetScreenDimmed(true);
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(0), 1);
-}
-
-TEST_F(ArcMetricsServiceTest, RecordEngagementTimeArcWindowFocused) {
-  base::HistogramTester tester;
-  SetSessionState(session_manager::SessionState::ACTIVE);
-
-  // Focus an ARC++ window for 1 sec. Should be recorded as total time and
-  // foreground time.
-  service()->OnWindowActivated(
-      wm::ActivationChangeObserver::ActivationReason::INPUT_EVENT,
-      fake_arc_window(), nullptr);
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(0), 1);
-}
-
-TEST_F(ArcMetricsServiceTest, RecordEngagementTimeNonArcWindowFocused) {
-  base::HistogramTester tester;
-  SetSessionState(session_manager::SessionState::ACTIVE);
-
-  // Focus an non-ARC++ window for 1 sec. Should be recorded as total time.
-  service()->OnWindowActivated(
-      wm::ActivationChangeObserver::ActivationReason::INPUT_EVENT,
-      fake_non_arc_window(), nullptr);
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(0), 1);
-}
-
-TEST_F(ArcMetricsServiceTest, RecordEngagementTimeAppInBackground) {
-  base::HistogramTester tester;
-  SetSessionState(session_manager::SessionState::ACTIVE);
-
-  // Open an ARC++ app in the background and wait for 1 sec. Should be recorded
-  // as total time and background time.
-  service()->OnTaskCreated(1, "", "", "");
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(0), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(1), 1);
-}
-
-TEST_F(ArcMetricsServiceTest,
-       RecordEngagementTimeAppInBackgroundAndArcWindowFocused) {
-  base::HistogramTester tester;
-  SetSessionState(session_manager::SessionState::ACTIVE);
-
-  // With an ARC++ app in the background, focus an ARC++ window for 1 sec.
-  // Should be recorded as total time and foreground time.
-  service()->OnTaskCreated(1, "", "", "");
-  service()->OnWindowActivated(
-      wm::ActivationChangeObserver::ActivationReason::INPUT_EVENT,
-      fake_arc_window(), nullptr);
-  AdvanceSeconds(1);
-
-  TriggerRecordEngagementTimeToUma();
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Total",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.ArcTotal",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Foreground",
-                               base::TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTimeBucketCount("Arc.EngagementTime.Background",
-                               base::TimeDelta::FromSeconds(0), 1);
-}
-
 }  // namespace
 }  // namespace arc
diff --git a/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc b/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc
index badd66a6..bdbb7597 100644
--- a/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc
+++ b/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc
@@ -8,7 +8,9 @@
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "components/autofill/content/common/mojom/autofill_driver.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace autofill {
@@ -19,14 +21,12 @@
 
 class FakeContentPasswordManagerDriver : public mojom::PasswordManagerDriver {
  public:
-  FakeContentPasswordManagerDriver()
-      : called_record_save_(false), binding_(this) {}
+  FakeContentPasswordManagerDriver() : called_record_save_(false) {}
   ~FakeContentPasswordManagerDriver() override {}
 
-  mojom::PasswordManagerDriverPtr CreateInterfacePtrAndBind() {
-    mojom::PasswordManagerDriverPtr ptr;
-    binding_.Bind(mojo::MakeRequest(&ptr));
-    return ptr;
+  mojo::PendingRemote<mojom::PasswordManagerDriver>
+  CreatePendingRemoteAndBind() {
+    return receiver_.BindNewPipeAndPassRemote();
   }
 
   bool GetLogMessage(std::string* log) {
@@ -88,7 +88,7 @@
   // Records data received via RecordSavePasswordProgress() call.
   base::Optional<std::string> log_;
 
-  mojo::Binding<mojom::PasswordManagerDriver> binding_;
+  mojo::Receiver<mojom::PasswordManagerDriver> receiver_{this};
 };
 
 class TestLogger : public RendererSavePasswordProgressLogger {
@@ -104,9 +104,9 @@
 TEST(RendererSavePasswordProgressLoggerTest, SendLog) {
   base::test::SingleThreadTaskEnvironment task_environment;
   FakeContentPasswordManagerDriver fake_driver;
-  mojom::PasswordManagerDriverPtr driver_ptr =
-      fake_driver.CreateInterfacePtrAndBind();
-  TestLogger logger(driver_ptr.get());
+  mojo::Remote<mojom::PasswordManagerDriver> driver_remote(
+      fake_driver.CreatePendingRemoteAndBind());
+  TestLogger logger(driver_remote.get());
   logger.SendLog(kTestText);
 
   base::RunLoop().RunUntilIdle();
diff --git a/components/data_reduction_proxy/content/browser/BUILD.gn b/components/data_reduction_proxy/content/browser/BUILD.gn
deleted file mode 100644
index 7b9aba62..0000000
--- a/components/data_reduction_proxy/content/browser/BUILD.gn
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-static_library("browser") {
-  sources = [
-    "data_reduction_proxy_page_load_timing.cc",
-    "data_reduction_proxy_page_load_timing.h",
-    "data_reduction_proxy_pingback_client_impl.cc",
-    "data_reduction_proxy_pingback_client_impl.h",
-  ]
-
-  deps = [
-    "//base",
-    "//components/crash/content/browser",
-    "//components/data_reduction_proxy/content/common",
-    "//components/data_reduction_proxy/core/browser",
-    "//components/data_reduction_proxy/core/common",
-    "//components/data_use_measurement/core",
-    "//components/previews/core:core",
-    "//components/variations/net",
-    "//content/public/browser",
-    "//content/public/common",
-    "//net",
-    "//services/network/public/cpp",
-  ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-  sources = [
-    "data_reduction_proxy_pingback_client_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":browser",
-    "//base",
-    "//components/crash/content/browser",
-    "//components/data_reduction_proxy/core/browser:test_support",
-    "//components/data_reduction_proxy/core/common:test_support",
-    "//components/previews/core",
-    "//content/public/browser",
-    "//content/public/common",
-    "//content/test:test_support",
-    "//net:test_support",
-    "//services/network:test_support",
-    "//services/network/public/cpp",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
diff --git a/components/data_reduction_proxy/content/browser/DEPS b/components/data_reduction_proxy/content/browser/DEPS
deleted file mode 100644
index 97be0834..0000000
--- a/components/data_reduction_proxy/content/browser/DEPS
+++ /dev/null
@@ -1,8 +0,0 @@
-include_rules = [
-  "+components/crash/content/browser",
-  "+components/data_use_measurement/core",
-  "+components/previews/core",
-  "+net",
-  "+services/network/public/cpp",
-  "+services/network/test",
-]
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.cc
deleted file mode 100644
index 8620c19..0000000
--- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h"
-
-namespace data_reduction_proxy {
-
-DataReductionProxyPageLoadTiming::DataReductionProxyPageLoadTiming(
-    const base::Time& navigation_start,
-    const base::Optional<base::TimeDelta>& response_start,
-    const base::Optional<base::TimeDelta>& load_event_start,
-    const base::Optional<base::TimeDelta>& first_image_paint,
-    const base::Optional<base::TimeDelta>& first_contentful_paint,
-    const base::Optional<base::TimeDelta>& experimental_first_meaningful_paint,
-    const base::Optional<base::TimeDelta>& first_input_delay,
-    const base::Optional<base::TimeDelta>&
-        parse_blocked_on_script_load_duration,
-    const base::Optional<base::TimeDelta>& parse_stop,
-    const base::Optional<base::TimeDelta>& page_end_time,
-    const base::Optional<base::TimeDelta>& lite_page_redirect_penalty,
-    const base::Optional<previews::ServerLitePageStatus>&
-        lite_page_redirect_status,
-    const base::Optional<base::TimeDelta>&
-        navigation_start_to_main_frame_fetch_start,
-    int64_t network_bytes,
-    int64_t original_network_bytes,
-    int64_t total_page_size_bytes,
-    float cached_fraction,
-    bool app_background_occurred,
-    bool opt_out_occurred,
-    int64_t renderer_memory_usage_kb,
-    int host_id,
-    PageloadMetrics_PageEndReason page_end_reason,
-    uint32_t touch_count,
-    uint32_t scroll_count,
-    uint32_t redirect_count)
-    : navigation_start(navigation_start),
-      response_start(response_start),
-      load_event_start(load_event_start),
-      first_image_paint(first_image_paint),
-      first_contentful_paint(first_contentful_paint),
-      experimental_first_meaningful_paint(experimental_first_meaningful_paint),
-      first_input_delay(first_input_delay),
-      parse_blocked_on_script_load_duration(
-          parse_blocked_on_script_load_duration),
-      parse_stop(parse_stop),
-      page_end_time(page_end_time),
-      lite_page_redirect_penalty(lite_page_redirect_penalty),
-      lite_page_redirect_status(lite_page_redirect_status),
-      navigation_start_to_main_frame_fetch_start(
-          navigation_start_to_main_frame_fetch_start),
-      network_bytes(network_bytes),
-      original_network_bytes(original_network_bytes),
-      total_page_size_bytes(total_page_size_bytes),
-      cached_fraction(cached_fraction),
-      app_background_occurred(app_background_occurred),
-      opt_out_occurred(opt_out_occurred),
-      renderer_memory_usage_kb(renderer_memory_usage_kb),
-      host_id(host_id),
-      page_end_reason(page_end_reason),
-      touch_count(touch_count),
-      scroll_count(scroll_count),
-      redirect_count(redirect_count) {}
-
-DataReductionProxyPageLoadTiming::DataReductionProxyPageLoadTiming(
-    const DataReductionProxyPageLoadTiming& other) = default;
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h b/components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h
deleted file mode 100644
index e02fc68..0000000
--- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CONTENT_BROWSER_DATA_REDUCTION_PROXY_PAGE_LOAD_TIMING_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CONTENT_BROWSER_DATA_REDUCTION_PROXY_PAGE_LOAD_TIMING_H_
-
-#include <stdint.h>
-
-#include "base/optional.h"
-#include "base/time/time.h"
-#include "components/data_reduction_proxy/proto/pageload_metrics.pb.h"
-#include "components/previews/core/previews_lite_page_redirect.h"
-
-namespace data_reduction_proxy {
-
-// The timing information that is relevant to the Pageload metrics pingback.
-struct DataReductionProxyPageLoadTiming {
-  DataReductionProxyPageLoadTiming(
-      const base::Time& navigation_start,
-      const base::Optional<base::TimeDelta>& response_start,
-      const base::Optional<base::TimeDelta>& load_event_start,
-      const base::Optional<base::TimeDelta>& first_image_paint,
-      const base::Optional<base::TimeDelta>& first_contentful_paint,
-      const base::Optional<base::TimeDelta>&
-          experimental_first_meaningful_paint,
-      const base::Optional<base::TimeDelta>& first_input_delay,
-      const base::Optional<base::TimeDelta>&
-          parse_blocked_on_script_load_duration,
-      const base::Optional<base::TimeDelta>& parse_stop,
-      const base::Optional<base::TimeDelta>& page_end_time,
-      const base::Optional<base::TimeDelta>& lite_page_redirect_penalty,
-      const base::Optional<previews::ServerLitePageStatus>&
-          lite_page_redirect_status,
-      const base::Optional<base::TimeDelta>&
-          navigation_start_to_main_frame_fetch_start,
-      int64_t network_bytes,
-      int64_t original_network_bytes,
-      int64_t total_page_size_bytes,
-      float cached_fraction,
-      bool app_background_occurred,
-      bool opt_out_occurred,
-      int64_t renderer_memory_usage_kb,
-      int host_id,
-      PageloadMetrics_PageEndReason page_end_reason,
-      uint32_t touch_count,
-      uint32_t scroll_count,
-      uint32_t redirect_count);
-
-  DataReductionProxyPageLoadTiming(
-      const DataReductionProxyPageLoadTiming& other);
-
-  // Time that the navigation for the associated page was initiated.
-  const base::Time navigation_start;
-
-  // All TimeDeltas are relative to navigation_start.
-
-  // Time that the first byte of the response is received.
-  const base::Optional<base::TimeDelta> response_start;
-  // Time immediately before the load event is fired.
-  const base::Optional<base::TimeDelta> load_event_start;
-  // Time when the first image is painted.
-  const base::Optional<base::TimeDelta> first_image_paint;
-  // Time when the first contentful thing (image, text, etc.) is painted.
-  const base::Optional<base::TimeDelta> first_contentful_paint;
-  // (Experimental) Time when the page's primary content is painted.
-  const base::Optional<base::TimeDelta> experimental_first_meaningful_paint;
-  // The queuing delay for the first user input on the page.
-  const base::Optional<base::TimeDelta> first_input_delay;
-  // Time that parsing was blocked by loading script.
-  const base::Optional<base::TimeDelta> parse_blocked_on_script_load_duration;
-  // Time when parsing completed.
-  const base::Optional<base::TimeDelta> parse_stop;
-  // Time when the page was ended (navigated away, Chrome backgrounded, etc).
-  const base::Optional<base::TimeDelta> page_end_time;
-  // Time spent restarting navigations while attempting a lite page redirect
-  // preview.
-  const base::Optional<base::TimeDelta> lite_page_redirect_penalty;
-  // The status of an attempted lite page redirect preview.
-  const base::Optional<previews::ServerLitePageStatus>
-      lite_page_redirect_status;
-  // The duration between the navigation start as reported by the navigation
-  // handle, and when the fetchStart of the main page HTML.
-  const base::Optional<base::TimeDelta>
-      navigation_start_to_main_frame_fetch_start;
-
-  // The number of bytes served over the network, not including headers.
-  const int64_t network_bytes;
-  // The number of bytes that would have been served over the network if the
-  // user were not using data reduction proxy, not including headers.
-  const int64_t original_network_bytes;
-  // The total number of bytes loaded for the page content, including cache.
-  const int64_t total_page_size_bytes;
-  // The fraction of bytes that were served from the cache for this page load.
-  const float cached_fraction;
-  // True when android app background occurred during the page load lifetime.
-  const bool app_background_occurred;
-  // True when the user clicks "Show Original" on the Previews infobar.
-  const bool opt_out_occurred;
-  // Kilobytes used by the renderer related to this page load. 0 if memory usage
-  // is unknown.
-  const int64_t renderer_memory_usage_kb;
-  // The host id of the renderer if there was a renderer crash.
-  const int host_id;
-  // The reason that the page load ends.
-  const PageloadMetrics_PageEndReason page_end_reason;
-  // The number of touch events that happened on the page.
-  const uint32_t touch_count;
-  // The number of scroll events that happened on the page.
-  const uint32_t scroll_count;
-  // The number of redirects that were encountered during the main frame load.
-  const uint32_t redirect_count;
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CONTENT_BROWSER_DATA_REDUCTION_PROXY_PAGE_LOAD_TIMING_H_
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc
deleted file mode 100644
index 7edc1c67..0000000
--- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc
+++ /dev/null
@@ -1,487 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
-
-#include <stdint.h>
-#include <string>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/optional.h"
-#include "base/rand_util.h"
-#include "base/system/sys_info.h"
-#include "base/task/post_task.h"
-#include "base/task/task_traits.h"
-#include "base/time/time.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
-#include "components/data_reduction_proxy/proto/client_config.pb.h"
-#include "components/previews/core/previews_lite_page_redirect.h"
-#include "components/variations/net/variations_http_headers.h"
-#include "content/public/common/child_process_host.h"
-#include "net/base/load_flags.h"
-#include "net/nqe/effective_connection_type.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "services/network/public/cpp/resource_request.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "services/network/public/cpp/simple_url_loader.h"
-#include "url/gurl.h"
-
-namespace data_reduction_proxy {
-
-namespace {
-
-// Returns the HTTPSLitePagePreviewInfo_Status for a
-// |previews::ServerLitePageStatus|.
-HTTPSLitePagePreviewInfo_Status
-ProtoLitePageRedirectStatusFromLitePageRedirectStatus(
-    previews::ServerLitePageStatus status) {
-  switch (status) {
-    case previews::ServerLitePageStatus::kUnknown:
-      return HTTPSLitePagePreviewInfo_Status_UNKNOWN;
-    case previews::ServerLitePageStatus::kSuccess:
-      return HTTPSLitePagePreviewInfo_Status_SUCCESS;
-    case previews::ServerLitePageStatus::kBypass:
-      return HTTPSLitePagePreviewInfo_Status_BYPASS;
-    case previews::ServerLitePageStatus::kRedirect:
-      return HTTPSLitePagePreviewInfo_Status_REDIRECT;
-    case previews::ServerLitePageStatus::kFailure:
-      return HTTPSLitePagePreviewInfo_Status_FAILURE;
-    case previews::ServerLitePageStatus::kControl:
-      return HTTPSLitePagePreviewInfo_Status_CONTROL;
-  }
-}
-
-static const char kHistogramSucceeded[] =
-    "DataReductionProxy.Pingback.Succeeded";
-static const char kHistogramAttempted[] =
-    "DataReductionProxy.Pingback.Attempted";
-static const char kHistogramCrash[] = "DataReductionProxy.Pingback.CrashAction";
-
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class CrashAction {
-  // A crash was detected.
-  kDetected = 0,
-  // The crash dump was analyzed and the information was queued to be sent.
-  kAnalsisSucceeded = 1,
-  // The crash dump was not analyzed successfully, but the information was
-  // queued to be sent.
-  kAnalysisFailed = 2,
-  // The crash dump was not even attempted to be analyzed, but the information
-  // was queued to be sent.
-  kNotAnalyzed = 3,
-  // The crash dump was successfully sent to the server.
-  kSentSuccessfully = 4,
-  // The crash dump request completed unsuccessfully.
-  kSendUnuccessful = 5,
-  kLast = kSendUnuccessful + 1,
-};
-
-// Adds the relevant information to |request| for this page load based on page
-// timing and data reduction proxy state.
-void AddDataToPageloadMetrics(const DataReductionProxyData& request_data,
-                              const DataReductionProxyPageLoadTiming& timing,
-                              PageloadMetrics_RendererCrashType crash_type,
-                              std::string channel,
-                              PageloadMetrics* request) {
-  request->set_channel(channel);
-  request->set_session_key(request_data.session_key());
-  request->set_holdback_group(params::HoldbackFieldTrialGroup());
-  // For the timing events, any of them could be zero. Fill the message as a
-  // best effort.
-  request->set_allocated_first_request_time(
-      protobuf_parser::CreateTimestampFromTime(timing.navigation_start)
-          .release());
-  if (request_data.request_url().is_valid())
-    request->set_first_request_url(request_data.request_url().spec());
-  if (timing.first_contentful_paint) {
-    request->set_allocated_time_to_first_contentful_paint(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.first_contentful_paint.value())
-            .release());
-  }
-  if (timing.experimental_first_meaningful_paint) {
-    request->set_allocated_experimental_time_to_first_meaningful_paint(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.experimental_first_meaningful_paint.value())
-            .release());
-  }
-  if (timing.first_image_paint) {
-    request->set_allocated_time_to_first_image_paint(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.first_image_paint.value())
-            .release());
-  }
-  if (timing.response_start) {
-    request->set_allocated_time_to_first_byte(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.response_start.value())
-            .release());
-  }
-  if (timing.load_event_start) {
-    request->set_allocated_page_load_time(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.load_event_start.value())
-            .release());
-  }
-  if (timing.first_input_delay) {
-    request->set_allocated_first_input_delay(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.first_input_delay.value())
-            .release());
-  }
-  if (timing.parse_blocked_on_script_load_duration) {
-    request->set_allocated_parse_blocked_on_script_load_duration(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.parse_blocked_on_script_load_duration.value())
-            .release());
-  }
-  if (timing.parse_stop) {
-    request->set_allocated_parse_stop(
-        protobuf_parser::CreateDurationFromTimeDelta(timing.parse_stop.value())
-            .release());
-  }
-  if (timing.page_end_time) {
-    request->set_allocated_page_end_time(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.page_end_time.value())
-            .release());
-  }
-  if (timing.navigation_start_to_main_frame_fetch_start) {
-    request->set_allocated_navigation_start_to_main_frame_fetch_start(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.navigation_start_to_main_frame_fetch_start.value())
-            .release());
-  }
-  // Only set the lite page info if both the penalty and status have values.
-  if (timing.lite_page_redirect_penalty.has_value() &&
-      timing.lite_page_redirect_status.has_value()) {
-    HTTPSLitePagePreviewInfo* info = request->mutable_https_litepage_info();
-    info->set_allocated_navigation_restart_penalty(
-        protobuf_parser::CreateDurationFromTimeDelta(
-            timing.lite_page_redirect_penalty.value())
-            .release());
-    info->set_status(ProtoLitePageRedirectStatusFromLitePageRedirectStatus(
-        timing.lite_page_redirect_status.value()));
-  }
-
-  request->set_effective_connection_type(
-      protobuf_parser::ProtoEffectiveConnectionTypeFromEffectiveConnectionType(
-          request_data.effective_connection_type()));
-  request->set_connection_type(
-      protobuf_parser::ProtoConnectionTypeFromConnectionType(
-          request_data.connection_type()));
-  request->set_page_end_reason(timing.page_end_reason);
-  request->set_compressed_page_size_bytes(timing.network_bytes);
-  request->set_original_page_size_bytes(timing.original_network_bytes);
-  request->set_total_page_size_bytes(timing.total_page_size_bytes);
-  request->set_cached_fraction(timing.cached_fraction);
-  request->set_renderer_memory_usage_kb(timing.renderer_memory_usage_kb);
-  request->set_touch_count(timing.touch_count);
-  request->set_scroll_count(timing.scroll_count);
-  request->set_redirect_count(timing.redirect_count);
-
-  request->set_renderer_crash_type(crash_type);
-
-  if (request_data.page_id()) {
-    request->set_page_id(request_data.page_id().value());
-  }
-
-  bool was_preview_shown = false;
-  if (request_data.lite_page_received()) {
-    request->set_previews_type(PageloadMetrics_PreviewsType_LITE_PAGE);
-    was_preview_shown = true;
-  } else if (request_data.black_listed()) {
-    request->set_previews_type(
-        PageloadMetrics_PreviewsType_CLIENT_BLACKLIST_PREVENTED_PREVIEW);
-  } else {
-    request->set_previews_type(PageloadMetrics_PreviewsType_NONE);
-  }
-
-  // Only report opt out information if a server preview was shown (otherwise,
-  // report opt out unknown). Similarly, if app background (Android) caused this
-  // report to be sent before the page load is terminated, do not report opt out
-  // information as the user could reload the original preview after this report
-  // is sent.
-  if (!was_preview_shown || timing.app_background_occurred) {
-    request->set_previews_opt_out(PageloadMetrics_PreviewsOptOut_UNKNOWN);
-    return;
-  }
-
-  if (timing.opt_out_occurred) {
-    request->set_previews_opt_out(PageloadMetrics_PreviewsOptOut_OPT_OUT);
-    return;
-  }
-  request->set_previews_opt_out(PageloadMetrics_PreviewsOptOut_NON_OPT_OUT);
-}
-
-// Adds |current_time| as the metrics sent time to |request_data|, and returns
-// the serialized request.
-std::string AddBatchInfoAndSerializeRequest(
-    RecordPageloadMetricsRequest* request_data,
-    base::Time current_time) {
-  request_data->set_allocated_metrics_sent_time(
-      protobuf_parser::CreateTimestampFromTime(current_time).release());
-  data_reduction_proxy::PageloadDeviceInfo* device_info =
-      request_data->mutable_device_info();
-  device_info->set_total_device_memory_kb(
-      base::SysInfo::AmountOfPhysicalMemory() / 1024);
-  std::string serialized_request;
-  request_data->SerializeToString(&serialized_request);
-  return serialized_request;
-}
-
-}  // namespace
-
-DataReductionProxyPingbackClientImpl::DataReductionProxyPingbackClientImpl(
-    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    const std::string& channel)
-    : url_loader_factory_(std::move(url_loader_factory)),
-      pingback_url_(util::AddApiKeyToUrl(params::GetPingbackURL())),
-      pingback_reporting_fraction_(0.0),
-      current_loader_message_count_(0u),
-      current_loader_crash_count_(0u),
-      channel_(channel)
-#if defined(OS_ANDROID)
-      ,
-      scoped_observer_(this),
-      weak_factory_(this) {
-  auto* crash_manager = crash_reporter::CrashMetricsReporter::GetInstance();
-  DCHECK(crash_manager);
-  scoped_observer_.Add(crash_manager);
-#else
-          {
-#endif
-}
-
-DataReductionProxyPingbackClientImpl::~DataReductionProxyPingbackClientImpl() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-void DataReductionProxyPingbackClientImpl::OnSimpleLoaderComplete(
-    std::unique_ptr<std::string> response_body) {
-  bool is_success = !!response_body;
-  // For each message in the batched message, we should report UMA.
-  // Historically, batched requests are not common, so this loop usually only
-  // has 1 iteration.
-  for (size_t message = 0u; message < current_loader_message_count_;
-       ++message) {
-    UMA_HISTOGRAM_BOOLEAN(kHistogramSucceeded, is_success);
-  }
-
-  // For each crash we should report UMA.
-  for (size_t crash = 0u; crash < current_loader_crash_count_; ++crash) {
-    UMA_HISTOGRAM_ENUMERATION(kHistogramCrash,
-                              (is_success ? CrashAction::kSentSuccessfully
-                                          : CrashAction::kSendUnuccessful),
-                              CrashAction::kLast);
-  }
-
-  current_loader_.reset();
-  if (metrics_request_.pageloads_size() > 0) {
-    CreateLoaderForDataAndStart();
-  }
-}
-
-void DataReductionProxyPingbackClientImpl::SendPingback(
-    const DataReductionProxyData& request_data,
-    const DataReductionProxyPageLoadTiming& timing) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  bool send_pingback = ShouldSendPingback();
-  UMA_HISTOGRAM_BOOLEAN(kHistogramAttempted, send_pingback);
-  if (!send_pingback)
-    return;
-
-  if (timing.host_id != content::ChildProcessHost::kInvalidUniqueID) {
-    UMA_HISTOGRAM_ENUMERATION(kHistogramCrash, CrashAction::kDetected,
-                              CrashAction::kLast);
-#if defined(OS_ANDROID)
-    // Defer sending the report until the crash is processed.
-    AddRequestToCrashMap(request_data, timing);
-#else
-    // Don't analyze non-Android crashes.
-    UMA_HISTOGRAM_ENUMERATION(kHistogramCrash, CrashAction::kNotAnalyzed,
-                              CrashAction::kLast);
-    CreateReport(request_data, timing,
-                 PageloadMetrics_RendererCrashType_NOT_ANALYZED);
-#endif
-    return;
-  }
-  CreateReport(request_data, timing,
-               PageloadMetrics_RendererCrashType_NO_CRASH);
-}
-
-#if defined(OS_ANDROID)
-void DataReductionProxyPingbackClientImpl::OnCrashDumpProcessed(
-    int rph_id,
-    const crash_reporter::CrashMetricsReporter::ReportedCrashTypeSet&
-        reported_counts) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  auto iter = crash_map_.find(rph_id);
-  if (iter == crash_map_.end())
-    return;
-  const CrashPageLoadInformation& crash_page_load_information = iter->second;
-
-  UMA_HISTOGRAM_ENUMERATION(kHistogramCrash, CrashAction::kAnalsisSucceeded,
-                            CrashAction::kLast);
-
-  // Record only main frame OOMs.
-  bool renderer_foreground_oom = reported_counts.count(
-      crash_reporter::CrashMetricsReporter::ProcessedCrashCounts::
-          kRendererForegroundVisibleOom);
-  CreateReport(std::get<0>(crash_page_load_information),
-               std::get<1>(crash_page_load_information),
-               renderer_foreground_oom
-                   ? PageloadMetrics_RendererCrashType_ANDROID_FOREGROUND_OOM
-                   : PageloadMetrics_RendererCrashType_OTHER_CRASH);
-  crash_map_.erase(iter);
-}
-
-void DataReductionProxyPingbackClientImpl::AddRequestToCrashMap(
-    const DataReductionProxyData& request_data,
-    const DataReductionProxyPageLoadTiming& timing) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // It is guaranteed that |AddRequestToCrashMap| is called before
-  // |OnCrashDumpProcessed| due to the nature of both events being
-  // triggered from the channel closing, and SendPingback being called on the
-  // same stack, while OnCrashDumpProcessed is called from a PostTask.
-  crash_map_.insert(
-      std::make_pair(timing.host_id, std::make_tuple(request_data, timing)));
-  // If the crash hasn't been processed in 5 seconds, send the report without it
-  // being analyzed. 5 seconds should be enough time for breakpad to process the
-  // dump, while being short enough that the user will probably not shutdown the
-  // app.
-  base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&DataReductionProxyPingbackClientImpl::RemoveFromCrashMap,
-                     weak_factory_.GetWeakPtr(), timing.host_id),
-      base::TimeDelta::FromSeconds(5));
-}
-
-void DataReductionProxyPingbackClientImpl::RemoveFromCrashMap(
-    int process_host_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  auto iter = crash_map_.find(process_host_id);
-  if (iter == crash_map_.end())
-    return;
-  const CrashPageLoadInformation& crash_page_load_information = iter->second;
-
-  UMA_HISTOGRAM_ENUMERATION(kHistogramCrash, CrashAction::kAnalysisFailed,
-                            CrashAction::kLast);
-
-  CreateReport(std::get<0>(crash_page_load_information),
-               std::get<1>(crash_page_load_information),
-               PageloadMetrics_RendererCrashType_NOT_ANALYZED);
-  crash_map_.erase(iter);
-}
-
-#endif
-
-void DataReductionProxyPingbackClientImpl::CreateReport(
-    const DataReductionProxyData& request_data,
-    const DataReductionProxyPageLoadTiming& timing,
-    PageloadMetrics_RendererCrashType crash_type) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  PageloadMetrics* pageload_metrics = metrics_request_.add_pageloads();
-  AddDataToPageloadMetrics(request_data, timing, crash_type, channel_,
-                           pageload_metrics);
-  if (current_loader_)
-    return;
-  DCHECK_EQ(1, metrics_request_.pageloads_size());
-  CreateLoaderForDataAndStart();
-}
-
-void DataReductionProxyPingbackClientImpl::CreateLoaderForDataAndStart() {
-  DCHECK(!current_loader_);
-  DCHECK_GE(metrics_request_.pageloads_size(), 1);
-  std::string serialized_request =
-      AddBatchInfoAndSerializeRequest(&metrics_request_, CurrentTime());
-
-  current_loader_message_count_ = metrics_request_.pageloads_size();
-  current_loader_crash_count_ = 0u;
-  for (const auto& iter : metrics_request_.pageloads()) {
-    if (iter.renderer_crash_type() !=
-        PageloadMetrics_RendererCrashType_NO_CRASH) {
-      ++current_loader_crash_count_;
-    }
-  }
-
-  metrics_request_.Clear();
-  net::NetworkTrafficAnnotationTag traffic_annotation =
-      net::DefineNetworkTrafficAnnotation("data_reduction_proxy_pingback", R"(
-        semantics {
-          sender: "Data Reduction Proxy"
-          description:
-            "Sends page performance and data efficiency metrics to the data "
-            "reduction proxy."
-          trigger:
-            "Sent after a page load, if the page was loaded via the data "
-            "reduction proxy."
-          data:
-            "URL, request time, response time, page size, connection type, and "
-            "performance measures. See the following for details: "
-            "components/data_reduction_proxy/proto/pageload_metrics.proto"
-          destination: GOOGLE_OWNED_SERVICE
-        }
-        policy {
-          cookies_allowed: NO
-          setting:
-            "Users can control Data Saver on Android via 'Data Saver' setting. "
-            "Data Saver is not available on iOS, and on desktop it is enabled "
-            "by insalling the Data Saver extension. While Data Saver is "
-            "enabled, this feature cannot be disabled by settings."
-          policy_exception_justification: "Not implemented."
-        })");
-  auto resource_request = std::make_unique<network::ResourceRequest>();
-  resource_request->url = pingback_url_;
-  resource_request->load_flags = net::LOAD_BYPASS_PROXY;
-  resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
-  resource_request->method = "POST";
-  // Attach variations headers.
-  variations::AppendVariationsHeader(
-      pingback_url_, variations::InIncognito::kNo, variations::SignedIn::kNo,
-      resource_request.get());
-  current_loader_ = network::SimpleURLLoader::Create(
-      std::move(resource_request), traffic_annotation);
-  current_loader_->AttachStringForUpload(serialized_request,
-                                         "application/x-protobuf");
-  // |current_loader_| should not retry on 5xx errors since the server may
-  // already be overloaded.
-  static const int kMaxRetries = 5;
-  current_loader_->SetRetryOptions(
-      kMaxRetries, network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE);
-  current_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
-      url_loader_factory_.get(),
-      base::BindOnce(
-          &DataReductionProxyPingbackClientImpl::OnSimpleLoaderComplete,
-          base::Unretained(this)));
-}
-
-bool DataReductionProxyPingbackClientImpl::ShouldSendPingback() const {
-  return params::IsForcePingbackEnabledViaFlags() ||
-         GenerateRandomFloat() < pingback_reporting_fraction_;
-}
-
-base::Time DataReductionProxyPingbackClientImpl::CurrentTime() const {
-  return base::Time::Now();
-}
-
-float DataReductionProxyPingbackClientImpl::GenerateRandomFloat() const {
-  return static_cast<float>(base::RandDouble());
-}
-
-void DataReductionProxyPingbackClientImpl::SetPingbackReportingFraction(
-    float pingback_reporting_fraction) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_LE(0.0f, pingback_reporting_fraction);
-  DCHECK_GE(1.0f, pingback_reporting_fraction);
-  pingback_reporting_fraction_ = pingback_reporting_fraction;
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h
deleted file mode 100644
index f9df4bb5..0000000
--- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CONTENT_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_IMPL_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CONTENT_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/scoped_observer.h"
-#include "base/sequence_checker.h"
-#include "base/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
-#include "components/data_reduction_proxy/proto/pageload_metrics.pb.h"
-#include "url/gurl.h"
-
-#if defined(OS_ANDROID)
-#include "components/crash/content/browser/crash_metrics_reporter_android.h"
-#endif
-
-namespace base {
-class Time;
-}
-
-namespace network {
-class SharedURLLoaderFactory;
-class SimpleURLLoader;
-}  // namespace network
-
-namespace data_reduction_proxy {
-class DataReductionProxyData;
-struct DataReductionProxyPageLoadTiming;
-
-// Manages pingbacks about page load timing information to the data saver proxy
-// server. This class is not thread safe.
-class DataReductionProxyPingbackClientImpl
-    : public DataReductionProxyPingbackClient
-#if defined(OS_ANDROID)
-    ,
-      public crash_reporter::CrashMetricsReporter::Observer
-#endif
-{
- public:
-  DataReductionProxyPingbackClientImpl(
-      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      const std::string& channel);
-  ~DataReductionProxyPingbackClientImpl() override;
-
- protected:
-  // Generates a float in the range [0, 1). Virtualized in testing.
-  virtual float GenerateRandomFloat() const;
-
-  // Returns the current time. Virtualized in testing.
-  virtual base::Time CurrentTime() const;
-
- private:
-  // DataReductionProxyPingbackClient:
-  void SendPingback(const DataReductionProxyData& data,
-                    const DataReductionProxyPageLoadTiming& timing) override;
-  void SetPingbackReportingFraction(float pingback_reporting_fraction) override;
-
-  // Called when |current_loader_| completes its network request.
-  void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
-
-  // Whether a pingback should be sent.
-  bool ShouldSendPingback() const;
-
-#if defined(OS_ANDROID)
-  // CrashDumpManager::Observer:
-  void OnCrashDumpProcessed(
-      int rph_id,
-      const crash_reporter::CrashMetricsReporter::ReportedCrashTypeSet&
-          reported_counts) override;
-
-  // Creates a pending pingback report that waits for the crash dump to be
-  // processed. If the dump is not processed in 5 seconds, the report is sent
-  // without the cause of the crash.
-  void AddRequestToCrashMap(const DataReductionProxyData& request_data,
-                            const DataReductionProxyPageLoadTiming& timing);
-
-  // Reports the crashed renderer page load information without the cause of the
-  // crash.
-  void RemoveFromCrashMap(int process_host_id);
-#endif
-
-  // Creates the proto page load report and adds it to the current pending batch
-  // of reports. If there is no outstanding request, sends the batched report.
-  void CreateReport(const DataReductionProxyData& request_data,
-                    const DataReductionProxyPageLoadTiming& timing,
-                    PageloadMetrics_RendererCrashType crash_type);
-
-  // Creates a SimpleURLLoader that will POST to |secure_proxy_url_| using
-  // |url_loader_factory_|. The max retries is set to 5.
-  // |data_to_send_| will be used to fill the body of the loader, and will be
-  // reset to an empty RecordPageloadMetricsRequest.
-  void CreateLoaderForDataAndStart();
-
-  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
-
-  // The URL for the data saver proxy's ping back service.
-  const GURL pingback_url_;
-
-  // The currently running loader.
-  std::unique_ptr<network::SimpleURLLoader> current_loader_;
-
-  // Serialized data to send to the data saver proxy server.
-  RecordPageloadMetricsRequest metrics_request_;
-
-  // The probability of sending a pingback to the server.
-  float pingback_reporting_fraction_;
-
-  // The number of pageload messages in the current loader.
-  size_t current_loader_message_count_;
-
-  // The number of pageload crash messages in the current loader.
-  size_t current_loader_crash_count_;
-
-  // The release channel of this Chrome instance.
-  std::string channel_;
-
-#if defined(OS_ANDROID)
-  typedef std::tuple<DataReductionProxyData, DataReductionProxyPageLoadTiming>
-      CrashPageLoadInformation;
-
-  // Maps host process ID to information for the pingback. Items are added to
-  // the crash map when the renderer process crashes. If
-  // OnCrashDumpProcessed is not called within 5 seconds, the report is
-  // sent without the cause of the crash.
-  std::map<int, CrashPageLoadInformation> crash_map_;
-
-  ScopedObserver<crash_reporter::CrashMetricsReporter,
-                 crash_reporter::CrashMetricsReporter::Observer>
-      scoped_observer_;
-#endif
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  base::WeakPtrFactory<DataReductionProxyPingbackClientImpl> weak_factory_{
-      this};
-
-  DISALLOW_COPY_AND_ASSIGN(DataReductionProxyPingbackClientImpl);
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CONTENT_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_IMPL_H_
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc
deleted file mode 100644
index fb893e2..0000000
--- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl_unittest.cc
+++ /dev/null
@@ -1,775 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.h"
-
-#include <stdint.h>
-
-#include <list>
-#include <memory>
-#include <string>
-
-#include "base/command_line.h"
-#include "base/metrics/field_trial.h"
-#include "base/optional.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/system/sys_info.h"
-#include "base/test/bind_test_util.h"
-#include "base/test/metrics/histogram_tester.h"
-#include "base/test/task_environment.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "components/data_reduction_proxy/content/browser/data_reduction_proxy_page_load_timing.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
-#include "components/data_reduction_proxy/proto/client_config.pb.h"
-#include "components/data_reduction_proxy/proto/pageload_metrics.pb.h"
-#include "components/previews/core/previews_lite_page_redirect.h"
-#include "content/public/common/child_process_host.h"
-#include "net/base/net_errors.h"
-#include "net/base/network_change_notifier.h"
-#include "net/nqe/effective_connection_type.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
-#include "services/network/test/test_url_loader_factory.h"
-#include "services/network/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-namespace data_reduction_proxy {
-
-namespace {
-
-static const char kHistogramSucceeded[] =
-    "DataReductionProxy.Pingback.Succeeded";
-static const char kHistogramAttempted[] =
-    "DataReductionProxy.Pingback.Attempted";
-static const char kSessionKey[] = "fake-session";
-static const char kFakeURL[] = "http://www.google.com/";
-static const char kChannel[] = "channel";
-static const int64_t kBytes = 10000;
-static const int64_t kBytesOriginal = 1000000;
-static const int64_t kTotalPageSizeBytes = 20000;
-static const float kCachedFraction = 0.5;
-static const int kCrashProcessId = 1;
-static const int64_t kRendererMemory = 1024;
-static const int64_t kTouchCount = 10;
-static const int64_t kScrollCount = 20;
-static const int64_t kRedirectCount = 1;
-
-}  // namespace
-
-// Controls whether a pingback is sent or not.
-class TestDataReductionProxyPingbackClientImpl
-    : public DataReductionProxyPingbackClientImpl {
- public:
-  TestDataReductionProxyPingbackClientImpl(
-      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
-      : DataReductionProxyPingbackClientImpl(url_loader_factory, kChannel),
-        should_override_random_(false),
-        override_value_(0.0f),
-        current_time_(base::Time::Now()) {}
-
-  // Overrides the bahvior of the random float generator in
-  // DataReductionProxyPingbackClientImpl.
-  // If |should_override_random| is true, the typically random value that is
-  // compared with reporting fraction will deterministically be
-  // |override_value|.
-  void OverrideRandom(bool should_override_random, float override_value) {
-    should_override_random_ = should_override_random;
-    override_value_ = override_value;
-  }
-
-  // Sets the time used for the metrics reporting time.
-  void set_current_time(base::Time current_time) {
-    current_time_ = current_time;
-  }
-
- private:
-  float GenerateRandomFloat() const override {
-    if (should_override_random_)
-      return override_value_;
-    return DataReductionProxyPingbackClientImpl::GenerateRandomFloat();
-  }
-
-  base::Time CurrentTime() const override { return current_time_; }
-
-  bool should_override_random_;
-  float override_value_;
-  base::Time current_time_;
-};
-
-class DataReductionProxyPingbackClientImplTest : public testing::Test {
- public:
-  DataReductionProxyPingbackClientImplTest()
-      : task_environment_(
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME,
-            base::test::TaskEnvironment::ThreadPoolExecutionMode::ASYNC) {}
-
-  TestDataReductionProxyPingbackClientImpl* pingback_client() const {
-    return pingback_client_.get();
-  }
-
-  GURL pingback_url() { return util::AddApiKeyToUrl(params::GetPingbackURL()); }
-
-  void Init() {
-    factory()->AddResponse(pingback_url().spec(), "");
-    num_network_requests_ = 0;
-    factory()->SetInterceptor(base::BindLambdaForTesting(
-        [&](const network::ResourceRequest& request) {
-          intercepted_url_ = request.url;
-          intercepted_headers_ = request.headers;
-          intercepted_body_ = network::GetUploadData(request);
-          ++num_network_requests_;
-        }));
-    test_shared_loader_factory_ =
-        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
-            &test_url_loader_factory_);
-    pingback_client_ =
-        std::make_unique<TestDataReductionProxyPingbackClientImpl>(
-            test_shared_loader_factory_);
-    page_id_ = 0u;
-  }
-
-  void CreateAndSendPingback(bool lite_page_received,
-                             bool app_background_occurred,
-                             bool opt_out_occurred,
-                             bool crash,
-                             bool black_listed) {
-    timing_ = std::make_unique<DataReductionProxyPageLoadTiming>(
-        base::Time::FromJsTime(1500) /* navigation_start */,
-        base::Optional<base::TimeDelta>(
-            base::TimeDelta::FromMilliseconds(1600)) /* response_start */,
-        base::Optional<base::TimeDelta>(
-            base::TimeDelta::FromMilliseconds(1700)) /* load_event_start */,
-        base::Optional<base::TimeDelta>(
-            base::TimeDelta::FromMilliseconds(1800)) /* first_image_paint */,
-        base::Optional<base::TimeDelta>(base::TimeDelta::FromMilliseconds(
-            1900)) /* first_contentful_paint */,
-        base::Optional<base::TimeDelta>(base::TimeDelta::FromMilliseconds(
-            2000)) /* experimental_first_meaningful_paint */,
-        base::Optional<base::TimeDelta>(
-            base::TimeDelta::FromMilliseconds(3000)) /* first_input_delay */,
-        base::Optional<base::TimeDelta>(base::TimeDelta::FromMilliseconds(
-            100)) /* parse_blocked_on_script_load_duration */,
-        base::Optional<base::TimeDelta>(
-            base::TimeDelta::FromMilliseconds(2000)) /* parse_stop */,
-        base::Optional<base::TimeDelta>(
-            base::TimeDelta::FromMilliseconds(5000)) /* page_end_time */,
-        base::Optional<base::TimeDelta>(base::TimeDelta::FromMilliseconds(
-            6000)) /* lite_page_redirect_penalty */,
-        base::Optional<previews::ServerLitePageStatus>(
-            previews::ServerLitePageStatus::
-                kSuccess) /* lite_page_redirect_status */,
-        base::TimeDelta::FromMilliseconds(
-            100) /* navigation_start_to_main_frame_fetch_start */,
-        kBytes /* network_bytes */, kBytesOriginal /* original_network_bytes */,
-        kTotalPageSizeBytes /* total_page_size_bytes */,
-        kCachedFraction /* cached_fraction */, app_background_occurred,
-        opt_out_occurred, kRendererMemory,
-        crash ? kCrashProcessId : content::ChildProcessHost::kInvalidUniqueID,
-        PageloadMetrics_PageEndReason_END_NONE, kTouchCount /* touch_count */,
-        kScrollCount /* scroll_count */, kRedirectCount /* redirect_count */);
-
-    DataReductionProxyData request_data;
-    request_data.set_session_key(kSessionKey);
-    request_data.set_request_url(GURL(kFakeURL));
-    request_data.set_effective_connection_type(
-        net::EFFECTIVE_CONNECTION_TYPE_OFFLINE);
-    request_data.set_connection_type(
-        net::NetworkChangeNotifier::CONNECTION_UNKNOWN);
-    request_data.set_black_listed(black_listed);
-    request_data.set_lite_page_received(lite_page_received);
-    request_data.set_page_id(page_id_);
-    static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-        ->SendPingback(request_data, *timing_);
-    page_id_++;
-  }
-
-  void WaitForPingbackResponse() {
-    base::RunLoop run_loop;
-    run_loop.RunUntilIdle();
-  }
-
-  // Send a fake crash report from crash_reporter.
-  void ReportCrash(bool oom) {
-#if defined(OS_ANDROID)
-    crash_reporter::ChildExitObserver::TerminationInfo info;
-    crash_reporter::CrashMetricsReporter::ReportedCrashTypeSet types(
-        {oom ? crash_reporter::CrashMetricsReporter::ProcessedCrashCounts::
-                   kRendererForegroundVisibleOom
-             : crash_reporter::CrashMetricsReporter::ProcessedCrashCounts::
-                   kRendererForegroundVisibleCrash});
-    static_cast<crash_reporter::CrashMetricsReporter::Observer*>(
-        pingback_client_.get())
-        ->OnCrashDumpProcessed(kCrashProcessId, types);
-#endif
-  }
-
-  network::TestURLLoaderFactory* factory() { return &test_url_loader_factory_; }
-
-  const DataReductionProxyPageLoadTiming& timing() { return *timing_; }
-
-  const base::HistogramTester& histogram_tester() { return histogram_tester_; }
-
-  uint64_t page_id() const { return page_id_; }
-
-  GURL intercepted_url() { return intercepted_url_; }
-
-  std::string upload_content_type() {
-    std::string content_type;
-    intercepted_headers_.GetHeader(net::HttpRequestHeaders::kContentType,
-                                   &content_type);
-    return content_type;
-  }
-
-  std::string upload_data() { return intercepted_body_; }
-
-  int num_network_requests() { return num_network_requests_; }
-
- protected:
-  base::test::TaskEnvironment task_environment_;
-
- private:
-  network::TestURLLoaderFactory test_url_loader_factory_;
-  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
-  std::unique_ptr<TestDataReductionProxyPingbackClientImpl> pingback_client_;
-  std::unique_ptr<DataReductionProxyPageLoadTiming> timing_;
-  base::HistogramTester histogram_tester_;
-  uint64_t page_id_;
-  GURL intercepted_url_;
-  net::HttpRequestHeaders intercepted_headers_;
-  std::string intercepted_body_;
-  int num_network_requests_;
-};
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyPingbackContent) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  base::Time current_time = base::Time::UnixEpoch();
-  pingback_client()->set_current_time(current_time);
-  uint64_t data_page_id = page_id();
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  EXPECT_EQ(num_network_requests(), 1);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  EXPECT_EQ(current_time, protobuf_parser::TimestampToTime(
-                              batched_request.metrics_sent_time()));
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ(
-      timing().navigation_start,
-      protobuf_parser::TimestampToTime(pageload_metrics.first_request_time()));
-  EXPECT_EQ(timing().response_start.value(),
-            protobuf_parser::DurationToTimeDelta(
-                pageload_metrics.time_to_first_byte()));
-  EXPECT_EQ(
-      timing().load_event_start.value(),
-      protobuf_parser::DurationToTimeDelta(pageload_metrics.page_load_time()));
-  EXPECT_EQ(timing().first_image_paint.value(),
-            protobuf_parser::DurationToTimeDelta(
-                pageload_metrics.time_to_first_image_paint()));
-  EXPECT_EQ(timing().first_contentful_paint.value(),
-            protobuf_parser::DurationToTimeDelta(
-                pageload_metrics.time_to_first_contentful_paint()));
-  EXPECT_EQ(
-      timing().experimental_first_meaningful_paint.value(),
-      protobuf_parser::DurationToTimeDelta(
-          pageload_metrics.experimental_time_to_first_meaningful_paint()));
-  EXPECT_EQ(timing().first_input_delay.value(),
-            protobuf_parser::DurationToTimeDelta(
-                pageload_metrics.first_input_delay()));
-  EXPECT_EQ(timing().parse_blocked_on_script_load_duration.value(),
-            protobuf_parser::DurationToTimeDelta(
-                pageload_metrics.parse_blocked_on_script_load_duration()));
-  EXPECT_EQ(timing().parse_stop.value(), protobuf_parser::DurationToTimeDelta(
-                                             pageload_metrics.parse_stop()));
-  EXPECT_EQ(
-      timing().page_end_time.value(),
-      protobuf_parser::DurationToTimeDelta(pageload_metrics.page_end_time()));
-  EXPECT_EQ(HTTPSLitePagePreviewInfo_Status_SUCCESS,
-            pageload_metrics.https_litepage_info().status());
-  EXPECT_EQ(
-      // base::TimeDelta::FromMilliseconds(6000),
-      timing().lite_page_redirect_penalty.value(),
-      protobuf_parser::DurationToTimeDelta(
-          pageload_metrics.https_litepage_info().navigation_restart_penalty()));
-  EXPECT_EQ(timing().navigation_start_to_main_frame_fetch_start,
-            protobuf_parser::DurationToTimeDelta(
-                pageload_metrics.navigation_start_to_main_frame_fetch_start()));
-
-  EXPECT_EQ(kSessionKey, pageload_metrics.session_key());
-  EXPECT_EQ(kChannel, pageload_metrics.channel());
-  EXPECT_EQ(kFakeURL, pageload_metrics.first_request_url());
-  EXPECT_EQ(kBytes, pageload_metrics.compressed_page_size_bytes());
-  EXPECT_EQ(kBytesOriginal, pageload_metrics.original_page_size_bytes());
-  EXPECT_EQ(kTotalPageSizeBytes, pageload_metrics.total_page_size_bytes());
-  EXPECT_EQ(kTouchCount, pageload_metrics.touch_count());
-  EXPECT_EQ(kScrollCount, pageload_metrics.scroll_count());
-  EXPECT_EQ(kCachedFraction, pageload_metrics.cached_fraction());
-  EXPECT_EQ(kRedirectCount, pageload_metrics.redirect_count());
-  EXPECT_EQ(data_page_id, pageload_metrics.page_id());
-
-  EXPECT_EQ(PageloadMetrics_PreviewsType_NONE,
-            pageload_metrics.previews_type());
-  EXPECT_EQ(PageloadMetrics_PreviewsOptOut_UNKNOWN,
-            pageload_metrics.previews_opt_out());
-
-  EXPECT_EQ(
-      PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_OFFLINE,
-      pageload_metrics.effective_connection_type());
-  EXPECT_EQ(PageloadMetrics_ConnectionType_CONNECTION_UNKNOWN,
-            pageload_metrics.connection_type());
-  EXPECT_EQ(PageloadMetrics_PageEndReason_END_NONE,
-            pageload_metrics.page_end_reason());
-  EXPECT_EQ(kRendererMemory, pageload_metrics.renderer_memory_usage_kb());
-  EXPECT_EQ(std::string(), pageload_metrics.holdback_group());
-  EXPECT_EQ(PageloadMetrics_RendererCrashType_NO_CRASH,
-            pageload_metrics.renderer_crash_type());
-  EXPECT_EQ(base::SysInfo::AmountOfPhysicalMemory() / 1024,
-            batched_request.device_info().total_device_memory_kb());
-
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 1);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyHoldback) {
-  base::FieldTrialList field_trial_list(nullptr);
-  ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
-      "DataCompressionProxyHoldback", "Enabled"));
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  EXPECT_EQ(num_network_requests(), 1);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ("Enabled", pageload_metrics.holdback_group());
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 1);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest,
-       VerifyTwoPingbacksBatchedContent) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  base::Time current_time = base::Time::UnixEpoch();
-  pingback_client()->set_current_time(current_time);
-  // First pingback
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  // Two more pingbacks batched together.
-  std::list<uint64_t> page_ids;
-  page_ids.push_back(page_id());
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 2);
-  page_ids.push_back(page_id());
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 3);
-  EXPECT_EQ(num_network_requests(), 1);
-
-  WaitForPingbackResponse();
-
-  // Check the state of the second pingback.
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 2);
-  EXPECT_EQ(current_time, protobuf_parser::TimestampToTime(
-                              batched_request.metrics_sent_time()));
-  EXPECT_EQ(base::SysInfo::AmountOfPhysicalMemory() / 1024,
-            batched_request.device_info().total_device_memory_kb());
-
-  // Verify the content of both pingbacks.
-  for (size_t i = 0; i < 2; ++i) {
-    PageloadMetrics pageload_metrics = batched_request.pageloads(i);
-    EXPECT_EQ(timing().navigation_start,
-              protobuf_parser::TimestampToTime(
-                  pageload_metrics.first_request_time()));
-    EXPECT_EQ(timing().response_start.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.time_to_first_byte()));
-    EXPECT_EQ(timing().load_event_start.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.page_load_time()));
-    EXPECT_EQ(timing().first_image_paint.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.time_to_first_image_paint()));
-    EXPECT_EQ(timing().first_contentful_paint.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.time_to_first_contentful_paint()));
-    EXPECT_EQ(
-        timing().experimental_first_meaningful_paint.value(),
-        protobuf_parser::DurationToTimeDelta(
-            pageload_metrics.experimental_time_to_first_meaningful_paint()));
-    EXPECT_EQ(timing().first_input_delay.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.first_input_delay()));
-    EXPECT_EQ(timing().parse_blocked_on_script_load_duration.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.parse_blocked_on_script_load_duration()));
-    EXPECT_EQ(timing().parse_stop.value(), protobuf_parser::DurationToTimeDelta(
-                                               pageload_metrics.parse_stop()));
-    EXPECT_EQ(
-        timing().page_end_time.value(),
-        protobuf_parser::DurationToTimeDelta(pageload_metrics.page_end_time()));
-    EXPECT_EQ(HTTPSLitePagePreviewInfo_Status_SUCCESS,
-              pageload_metrics.https_litepage_info().status());
-    EXPECT_EQ(timing().lite_page_redirect_penalty.value(),
-              protobuf_parser::DurationToTimeDelta(
-                  pageload_metrics.https_litepage_info()
-                      .navigation_restart_penalty()));
-    EXPECT_EQ(
-        timing().navigation_start_to_main_frame_fetch_start,
-        protobuf_parser::DurationToTimeDelta(
-            pageload_metrics.navigation_start_to_main_frame_fetch_start()));
-
-    EXPECT_EQ(kSessionKey, pageload_metrics.session_key());
-    EXPECT_EQ(kChannel, pageload_metrics.channel());
-    EXPECT_EQ(kFakeURL, pageload_metrics.first_request_url());
-    EXPECT_EQ(kBytes, pageload_metrics.compressed_page_size_bytes());
-    EXPECT_EQ(kBytesOriginal, pageload_metrics.original_page_size_bytes());
-    EXPECT_EQ(kTotalPageSizeBytes, pageload_metrics.total_page_size_bytes());
-    EXPECT_EQ(kTouchCount, pageload_metrics.touch_count());
-    EXPECT_EQ(kScrollCount, pageload_metrics.scroll_count());
-    EXPECT_EQ(kRedirectCount, pageload_metrics.redirect_count());
-    EXPECT_EQ(kCachedFraction, pageload_metrics.cached_fraction());
-
-    EXPECT_EQ(page_ids.front(), pageload_metrics.page_id());
-    page_ids.pop_front();
-    EXPECT_EQ(
-        PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_OFFLINE,
-        pageload_metrics.effective_connection_type());
-    EXPECT_EQ(PageloadMetrics_ConnectionType_CONNECTION_UNKNOWN,
-              pageload_metrics.connection_type());
-    EXPECT_EQ(PageloadMetrics_PageEndReason_END_NONE,
-              pageload_metrics.page_end_reason());
-    EXPECT_EQ(kRendererMemory, pageload_metrics.renderer_memory_usage_kb());
-  }
-
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 3);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, SendTwoPingbacks) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 2);
-  EXPECT_EQ(num_network_requests(), 1);
-
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 2);
-  histogram_tester().ExpectTotalCount(kHistogramAttempted, 2);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, NoPingbackSent) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(0.0f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, false, 1);
-  histogram_tester().ExpectTotalCount(kHistogramSucceeded, 0);
-  EXPECT_EQ(num_network_requests(), 0);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyReportingBehvaior) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-
-  // Verify that if the random number is less than the reporting fraction, the
-  // pingback is created.
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(0.5f);
-  pingback_client()->OverrideRandom(true, 0.4f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  EXPECT_EQ(num_network_requests(), 1);
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 1);
-
-  // Verify that if the random number is greater than the reporting fraction,
-  // the pingback is not created.
-  pingback_client()->OverrideRandom(true, 0.6f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectBucketCount(kHistogramAttempted, false, 1);
-  EXPECT_EQ(num_network_requests(), 1);
-
-  // Verify that if the random number is equal to the reporting fraction, the
-  // pingback is not created. Specifically, if the reporting fraction is zero,
-  // and the random number is zero, no pingback is sent.
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(0.0f);
-  pingback_client()->OverrideRandom(true, 0.0f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectBucketCount(kHistogramAttempted, false, 2);
-  EXPECT_EQ(num_network_requests(), 1);
-
-  // Verify that the command line flag forces a pingback.
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      data_reduction_proxy::switches::kEnableDataReductionProxyForcePingback);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(0.0f);
-  pingback_client()->OverrideRandom(true, 1.0f);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectBucketCount(kHistogramAttempted, true, 2);
-  EXPECT_EQ(num_network_requests(), 2);
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 2);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, FailedPingback) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  // Simulate a network error.
-  factory()->ClearResponses();
-  factory()->AddResponse(pingback_url().spec(), "", net::HTTP_UNAUTHORIZED);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  EXPECT_EQ(num_network_requests(), 1);
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, false, 1);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyBlackListContent) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  base::Time current_time = base::Time::UnixEpoch();
-  pingback_client()->set_current_time(current_time);
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, false /* renderer_crash */,
-      true /* black_listed */);
-  EXPECT_EQ(num_network_requests(), 1);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ(PageloadMetrics_PreviewsType_CLIENT_BLACKLIST_PREVENTED_PREVIEW,
-            pageload_metrics.previews_type());
-  EXPECT_EQ(PageloadMetrics_PreviewsOptOut_UNKNOWN,
-            pageload_metrics.previews_opt_out());
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyLitePageContent) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  base::Time current_time = base::Time::UnixEpoch();
-  pingback_client()->set_current_time(current_time);
-  CreateAndSendPingback(
-      true /* lite_page_received */, false /* app_background_occurred */,
-      true /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  EXPECT_EQ(num_network_requests(), 1);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 1);
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ(PageloadMetrics_PreviewsType_LITE_PAGE,
-            pageload_metrics.previews_type());
-  EXPECT_EQ(PageloadMetrics_PreviewsOptOut_OPT_OUT,
-            pageload_metrics.previews_opt_out());
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyTwoLitePagePingbacks) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-  base::Time current_time = base::Time::UnixEpoch();
-  pingback_client()->set_current_time(current_time);
-  CreateAndSendPingback(
-      true /* lite_page_received */, false /* app_background_occurred */,
-      true /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  EXPECT_EQ(num_network_requests(), 1);
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ(PageloadMetrics_PreviewsType_LITE_PAGE,
-            pageload_metrics.previews_type());
-  EXPECT_EQ(PageloadMetrics_PreviewsOptOut_OPT_OUT,
-            pageload_metrics.previews_opt_out());
-  CreateAndSendPingback(
-      true /* lite_page_received */, false /* app_background_occurred */,
-      true /* opt_out_occurred */, false /* renderer_crash */,
-      false /* black_listed */);
-  histogram_tester().ExpectUniqueSample(kHistogramAttempted, true, 2);
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ(PageloadMetrics_PreviewsType_LITE_PAGE,
-            pageload_metrics.previews_type());
-  EXPECT_EQ(PageloadMetrics_PreviewsOptOut_OPT_OUT,
-            pageload_metrics.previews_opt_out());
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyCrashOomBehavior) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, true /* renderer_crash */,
-      false /* black_listed */);
-
-  ReportCrash(true /* oom */);
-
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-#if defined(OS_ANDROID)
-  EXPECT_EQ(PageloadMetrics_RendererCrashType_ANDROID_FOREGROUND_OOM,
-            pageload_metrics.renderer_crash_type());
-#else
-  EXPECT_EQ(PageloadMetrics_RendererCrashType_NOT_ANALYZED,
-            pageload_metrics.renderer_crash_type());
-#endif
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 1);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest, VerifyCrashNotOomBehavior) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, true /* renderer_crash */,
-      false /* black_listed */);
-
-  ReportCrash(false /* oom */);
-
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-#if defined(OS_ANDROID)
-  EXPECT_EQ(PageloadMetrics_RendererCrashType_OTHER_CRASH,
-            pageload_metrics.renderer_crash_type());
-#else
-  EXPECT_EQ(PageloadMetrics_RendererCrashType_NOT_ANALYZED,
-            pageload_metrics.renderer_crash_type());
-#endif
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 1);
-}
-
-TEST_F(DataReductionProxyPingbackClientImplTest,
-       VerifyCrashNotAnalyzedBehavior) {
-  Init();
-  EXPECT_EQ(num_network_requests(), 0);
-  pingback_client()->OverrideRandom(true, 0.5f);
-  static_cast<DataReductionProxyPingbackClient*>(pingback_client())
-      ->SetPingbackReportingFraction(1.0f);
-
-  CreateAndSendPingback(
-      false /* lite_page_received */, false /* app_background_occurred */,
-      false /* opt_out_occurred */, true /* renderer_crash */,
-      false /* black_listed */);
-
-  // Don't report the crash dump details.
-  task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(5));
-
-  EXPECT_EQ(upload_content_type(), "application/x-protobuf");
-  RecordPageloadMetricsRequest batched_request;
-  batched_request.ParseFromString(upload_data());
-  EXPECT_EQ(batched_request.pageloads_size(), 1);
-  PageloadMetrics pageload_metrics = batched_request.pageloads(0);
-  EXPECT_EQ(PageloadMetrics_RendererCrashType_NOT_ANALYZED,
-            pageload_metrics.renderer_crash_type());
-  WaitForPingbackResponse();
-  histogram_tester().ExpectUniqueSample(kHistogramSucceeded, true, 1);
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/BUILD.gn b/components/data_reduction_proxy/core/browser/BUILD.gn
index 7620304..498deb0 100644
--- a/components/data_reduction_proxy/core/browser/BUILD.gn
+++ b/components/data_reduction_proxy/core/browser/BUILD.gn
@@ -20,7 +20,6 @@
   "data_reduction_proxy_metrics.h",
   "data_reduction_proxy_mutable_config_values.cc",
   "data_reduction_proxy_mutable_config_values.h",
-  "data_reduction_proxy_pingback_client.h",
   "data_reduction_proxy_prefs.cc",
   "data_reduction_proxy_prefs.h",
   "data_reduction_proxy_request_options.cc",
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc
index c16b136..05d0a31 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc
@@ -501,7 +501,6 @@
   config_storer_.Run(std::string());
   request_options_->Invalidate();
   config_values_->Invalidate();
-  service_->SetPingbackReportingFraction(0.0f);
   config_->OnNewClientConfigFetched();
 }
 
@@ -573,15 +572,6 @@
 bool DataReductionProxyConfigServiceClient::ParseAndApplyProxyConfig(
     const ClientConfig& config) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  float reporting_fraction = 0.0f;
-  if (config.has_pageload_metrics_config() &&
-      config.pageload_metrics_config().has_reporting_fraction()) {
-    reporting_fraction = config.pageload_metrics_config().reporting_fraction();
-  }
-  DCHECK_LE(0.0f, reporting_fraction);
-  DCHECK_GE(1.0f, reporting_fraction);
-  service_->SetPingbackReportingFraction(reporting_fraction);
-
   if (!config.has_proxy_config())
     return false;
 
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc
index d75f250..002b7b8f 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc
@@ -158,37 +158,6 @@
         ProxyServer_ProxyScheme_HTTP, "persisted.net", 80, 0.0f, false);
     loaded_config_ = EncodeConfig(persisted);
 
-    ClientConfig zero_reporting_fraction_config = CreateConfig(
-        kSuccessSessionKey, kConfigRefreshDurationSeconds, 0,
-        ProxyServer_ProxyScheme_HTTPS, "origin.net", 443,
-        ProxyServer_ProxyScheme_HTTP, "origin.net", 0, 0.0f, false);
-    zero_reporting_fraction_encoded_config_ =
-        EncodeConfig(zero_reporting_fraction_config);
-
-    ClientConfig one_reporting_fraction_config =
-        CreateConfig(kSuccessSessionKey, kConfigRefreshDurationSeconds, 0,
-                     ProxyServer_ProxyScheme_HTTPS, "", 443,
-                     ProxyServer_ProxyScheme_HTTP, "", 0, 1.0f, false);
-    one_reporting_fraction_encoded_config_ =
-        EncodeConfig(one_reporting_fraction_config);
-
-    // Passing in -1.0f as the reporting fraction causes the
-    // |empty_reporting_fraction_config| to have no pageload_metrics_config()
-    // set.
-    ClientConfig empty_reporting_fraction_config = CreateConfig(
-        kSuccessSessionKey, kConfigRefreshDurationSeconds, 0,
-        ProxyServer_ProxyScheme_HTTPS, "origin.net", 443,
-        ProxyServer_ProxyScheme_HTTP, "origin.net", 0, -1.0f, false);
-    empty_reporting_fraction_encoded_config_ =
-        EncodeConfig(empty_reporting_fraction_config);
-
-    ClientConfig half_reporting_fraction_config = CreateConfig(
-        kSuccessSessionKey, kConfigRefreshDurationSeconds, 0,
-        ProxyServer_ProxyScheme_HTTPS, "origin.net", 443,
-        ProxyServer_ProxyScheme_HTTP, "origin.net", 0, 0.5f, false);
-    half_reporting_fraction_encoded_config_ =
-        EncodeConfig(half_reporting_fraction_config);
-
     ClientConfig ignore_black_list_config =
         CreateConfig(kSuccessSessionKey, kConfigRefreshDurationSeconds, 0,
                      ProxyServer_ProxyScheme_HTTPS, "origin.net", 443,
@@ -231,7 +200,6 @@
     EXPECT_EQ(kSuccessSessionKey, request_options()->GetSecureSession());
     // The config should be persisted on the pref.
     EXPECT_EQ(encoded_config(), persisted_config());
-    EXPECT_EQ(0.5f, pingback_reporting_fraction());
 
     // Verify that the data reduction proxy servers are correctly set.
     // The first proxy must have type CORE. The second proxy must have type
@@ -334,19 +302,12 @@
     return test_context_->GetConfiguredProxiesForHttp();
   }
 
-  float pingback_reporting_fraction() const {
-    return test_context_->test_data_reduction_proxy_service()
-        ->pingback_reporting_fraction();
-  }
-
   bool ignore_blacklist() const {
     return test_context_->test_data_reduction_proxy_service()
         ->ignore_blacklist();
   }
 
-  void RunUntilIdle() {
-    test_context_->RunUntilIdle();
-  }
+  void RunUntilIdle() { test_context_->RunUntilIdle(); }
 
   void AddMockSuccess() {
     mock_responses_.push_back({success_response(), net::HTTP_OK});
@@ -379,18 +340,6 @@
   const std::string& previous_success_response() const {
     return previous_config_;
   }
-  const std::string& empty_reporting_fraction_encoded_config() const {
-    return empty_reporting_fraction_encoded_config_;
-  }
-  const std::string& one_reporting_fraction_encoded_config() const {
-    return one_reporting_fraction_encoded_config_;
-  }
-  const std::string& zero_reporting_fraction_encoded_config() const {
-    return zero_reporting_fraction_encoded_config_;
-  }
-  const std::string& half_reporting_fraction_encoded_config() const {
-    return half_reporting_fraction_encoded_config_;
-  }
   const std::string& ignore_black_list_encoded_config() const {
     return ignore_black_list_encoded_config_;
   }
@@ -423,18 +372,6 @@
   // An encoded config that represents a previously saved configuration.
   std::string loaded_config_;
 
-  // A configuration where the pingback reporting fraction is not set.
-  std::string empty_reporting_fraction_encoded_config_;
-
-  // A configuration where the pingback reporting fraction is set to 1.0f.
-  std::string one_reporting_fraction_encoded_config_;
-
-  // A configuration where the pingback reporting fraction is set to 0.0f.
-  std::string zero_reporting_fraction_encoded_config_;
-
-  // A configuration where the pingback reporting fraction is set to 0.5f.
-  std::string half_reporting_fraction_encoded_config_;
-
   // A configuration where the black list rules are ignored.
   std::string ignore_black_list_encoded_config_;
 
@@ -823,13 +760,16 @@
     bool expect_valid_config;
   } tests[] = {
       {
-          base::nullopt, true,
+          base::nullopt,
+          true,
       },
       {
-          base::TimeDelta::FromHours(25), false,
+          base::TimeDelta::FromHours(25),
+          false,
       },
       {
-          base::TimeDelta::FromHours(1), true,
+          base::TimeDelta::FromHours(1),
+          true,
       },
   };
 
@@ -1231,51 +1171,6 @@
   EXPECT_FALSE(request_options()->GetSecureSession().empty());
 }
 
-// Verifies that setting a client config sets the pingback reporting fraction
-// correctly to 0.0f.
-TEST_F(DataReductionProxyConfigServiceClientTest,
-       ApplySerializedConfigZeroReportingFraction) {
-  Init();
-  // ApplySerializedConfig should apply the encoded config.
-  config_client()->ApplySerializedConfig(
-      zero_reporting_fraction_encoded_config());
-  EXPECT_EQ(0.0f, pingback_reporting_fraction());
-}
-
-// Verifies that setting a client config sets the pingback reporting fraction
-// correctly to 0.0f when the pingback is not set in the protobuf.
-TEST_F(DataReductionProxyConfigServiceClientTest,
-       ApplySerializedConfigEmptyReportingFraction) {
-  Init();
-  // ApplySerializedConfig should apply the encoded config.
-  config_client()->ApplySerializedConfig(
-      empty_reporting_fraction_encoded_config());
-  EXPECT_EQ(0.0f, pingback_reporting_fraction());
-}
-
-// Verifies that setting a client config sets the pingback reporting fraction
-// correctly to 1.0f.
-TEST_F(DataReductionProxyConfigServiceClientTest,
-       ApplySerializedConfigOneReportingFraction) {
-  Init();
-  // ApplySerializedConfig should apply the encoded config.
-  config_client()->ApplySerializedConfig(
-      one_reporting_fraction_encoded_config());
-  EXPECT_EQ(1.0f, pingback_reporting_fraction());
-}
-
-// Verifies that setting a client config sets the pingback reporting fraction
-// correctly to 0.5f.
-TEST_F(DataReductionProxyConfigServiceClientTest,
-       ApplySerializedConfigHalfReportingFraction) {
-  Init();
-  // ApplySerializedConfig should apply the encoded config.
-  config_client()->ApplySerializedConfig(
-      half_reporting_fraction_encoded_config());
-  EXPECT_EQ(0.5f, pingback_reporting_fraction());
-  EXPECT_FALSE(ignore_blacklist());
-}
-
 TEST_F(DataReductionProxyConfigServiceClientTest,
        ApplySerializedConfigIgnoreBlackList) {
   Init();
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h
deleted file mode 100644
index 1228f86..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_H_
-
-namespace data_reduction_proxy {
-class DataReductionProxyData;
-struct DataReductionProxyPageLoadTiming;
-
-// Manages pingbacks about page load timing information to the data saver proxy
-// server.
-class DataReductionProxyPingbackClient {
- public:
-  virtual ~DataReductionProxyPingbackClient() {}
-
-  // Sends a pingback to the data saver proxy server about various timing
-  // information.
-  virtual void SendPingback(const DataReductionProxyData& data,
-                            const DataReductionProxyPageLoadTiming& timing) = 0;
-
-  // Sets the probability of actually sending a pingback to the server for any
-  // call to SendPingback.
-  virtual void SetPingbackReportingFraction(
-      float pingback_reporting_fraction) = 0;
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_H_
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
index a55c73d..7a5bfdfa 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
@@ -21,7 +21,6 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_mutable_config_values.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h"
@@ -44,7 +43,6 @@
     PrefService* prefs,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     std::unique_ptr<DataStore> store,
-    std::unique_ptr<DataReductionProxyPingbackClient> pingback_client,
     network::NetworkQualityTracker* network_quality_tracker,
     network::NetworkConnectionTracker* network_connection_tracker,
     data_use_measurement::DataUseMeasurement* data_use_measurement,
@@ -54,7 +52,6 @@
     const std::string& channel,
     const std::string& user_agent)
     : url_loader_factory_(std::move(url_loader_factory)),
-      pingback_client_(std::move(pingback_client)),
       settings_(settings),
       prefs_(prefs),
       db_data_owner_(new DBDataOwner(std::move(store))),
@@ -271,12 +268,6 @@
   }
 }
 
-void DataReductionProxyService::SetPingbackReportingFraction(
-    float pingback_reporting_fraction) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  pingback_client_->SetPingbackReportingFraction(pingback_reporting_fraction);
-}
-
 void DataReductionProxyService::OnCacheCleared(const base::Time start,
                                                const base::Time end) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
index 074b222..cfb4eb35 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
@@ -17,7 +17,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h"
 #include "components/data_reduction_proxy/core/browser/db_data_owner.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy.mojom.h"
@@ -35,12 +34,12 @@
 namespace base {
 class SequencedTaskRunner;
 class TimeDelta;
-}
+}  // namespace base
 
 namespace net {
 class HttpRequestHeaders;
 class ProxyList;
-}
+}  // namespace net
 
 namespace data_reduction_proxy {
 
@@ -73,7 +72,6 @@
       PrefService* prefs,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       std::unique_ptr<DataStore> store,
-      std::unique_ptr<DataReductionProxyPingbackClient> pingback_client,
       network::NetworkQualityTracker* network_quality_tracker,
       network::NetworkConnectionTracker* network_connection_tracker,
       data_use_measurement::DataUseMeasurement* data_use_measurement,
@@ -126,15 +124,6 @@
   void DeleteHistoricalDataUsage();
   void DeleteBrowsingHistory(const base::Time& start, const base::Time& end);
 
-  // Sets the reporting fraction in the pingback client. Virtual for testing.
-  virtual void SetPingbackReportingFraction(float pingback_reporting_fraction);
-
-  // Sets |pingback_client_| to be used for testing purposes.
-  void SetPingbackClientForTesting(
-      DataReductionProxyPingbackClient* pingback_client) {
-    pingback_client_.reset(pingback_client);
-  }
-
   void SetSettingsForTesting(DataReductionProxySettings* settings) {
     settings_ = settings;
   }
@@ -182,10 +171,6 @@
     return url_loader_factory_->Clone();
   }
 
-  DataReductionProxyPingbackClient* pingback_client() const {
-    return pingback_client_.get();
-  }
-
   DataReductionProxyConfigurator* configurator() const {
     return configurator_.get();
   }
@@ -271,8 +256,6 @@
   // Tracks compression statistics to be displayed to the user.
   std::unique_ptr<DataReductionProxyCompressionStats> compression_stats_;
 
-  std::unique_ptr<DataReductionProxyPingbackClient> pingback_client_;
-
   DataReductionProxySettings* settings_;
 
   // A prefs service for storing data.
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc
index 9c95ede..b8f5a093 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc
@@ -18,7 +18,6 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_test_utils.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_configurator.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_mutable_config_values.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/core/browser/data_store.h"
@@ -77,8 +76,7 @@
     Client client,
     const std::string& version,
     DataReductionProxyConfig* config)
-    : DataReductionProxyRequestOptions(client, version, config) {
-}
+    : DataReductionProxyRequestOptions(client, version, config) {}
 
 std::string TestDataReductionProxyRequestOptions::GetDefaultKey() const {
   return kTestKey;
@@ -89,8 +87,7 @@
     DataReductionProxyConfig* config)
     : TestDataReductionProxyRequestOptions(client, "1.2.3.4", config) {}
 
-MockDataReductionProxyRequestOptions::~MockDataReductionProxyRequestOptions() {
-}
+MockDataReductionProxyRequestOptions::~MockDataReductionProxyRequestOptions() {}
 
 TestDataReductionProxyConfigServiceClient::
     TestDataReductionProxyConfigServiceClient(
@@ -117,8 +114,7 @@
 }
 
 TestDataReductionProxyConfigServiceClient::
-    ~TestDataReductionProxyConfigServiceClient() {
-}
+    ~TestDataReductionProxyConfigServiceClient() {}
 
 void TestDataReductionProxyConfigServiceClient::SetNow(const base::Time& time) {
   tick_clock_.SetTime(time);
@@ -164,8 +160,7 @@
 
 TestDataReductionProxyConfigServiceClient::TestTickClock::TestTickClock(
     const base::Time& initial_time)
-    : time_(initial_time) {
-}
+    : time_(initial_time) {}
 
 base::TimeTicks
 TestDataReductionProxyConfigServiceClient::TestTickClock::NowTicks() const {
@@ -218,7 +213,6 @@
           prefs,
           std::move(url_loader_factory),
           std::make_unique<TestDataStore>(),
-          nullptr,
           test_network_quality_tracker,
           network::TestNetworkConnectionTracker::GetInstance(),
           nullptr,
@@ -228,8 +222,7 @@
           std::string(),
           std::string()) {}
 
-MockDataReductionProxyService::~MockDataReductionProxyService() {
-}
+MockDataReductionProxyService::~MockDataReductionProxyService() {}
 
 TestDataReductionProxyService::TestDataReductionProxyService(
     DataReductionProxySettings* settings,
@@ -242,7 +235,6 @@
           prefs,
           url_loader_factory,
           std::make_unique<TestDataStore>(),
-          nullptr,
           network_quality_tracker,
           network::TestNetworkConnectionTracker::GetInstance(),
           nullptr,
@@ -250,16 +242,10 @@
           base::TimeDelta(),
           Client::UNKNOWN,
           std::string(),
-          std::string()),
-      pingback_reporting_fraction_(0.0f) {}
+          std::string()) {}
 
 TestDataReductionProxyService::~TestDataReductionProxyService() {}
 
-void TestDataReductionProxyService::SetPingbackReportingFraction(
-    float pingback_reporting_fraction) {
-  pingback_reporting_fraction_ = pingback_reporting_fraction;
-}
-
 void TestDataReductionProxyService::SetIgnoreLongTermBlackListRules(
     bool ignore_long_term_black_list_rules) {
   ignore_blacklist_ = ignore_long_term_black_list_rules;
@@ -639,8 +625,7 @@
 }
 
 MockDataReductionProxyService*
-DataReductionProxyTestContext::mock_data_reduction_proxy_service()
-    const {
+DataReductionProxyTestContext::mock_data_reduction_proxy_service() const {
   DCHECK(!(test_context_flags_ & SKIP_SETTINGS_INITIALIZATION));
   DCHECK(test_context_flags_ & USE_MOCK_SERVICE);
   return reinterpret_cast<MockDataReductionProxyService*>(
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h
index 51fd026a..7d11d0f 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h
@@ -36,7 +36,7 @@
 class SharedURLLoaderFactory;
 class TestNetworkQualityTracker;
 class TestURLLoaderFactory;
-}
+}  // namespace network
 
 namespace data_reduction_proxy {
 
@@ -205,23 +205,13 @@
       const scoped_refptr<base::SequencedTaskRunner>& db_task_runner);
   ~TestDataReductionProxyService() override;
 
-  // Records the reporting fraction that was set by parsing a config.
-  void SetPingbackReportingFraction(float pingback_reporting_fraction) override;
-
   // Records |ignore_long_term_black_list_rules| as |ignore_blacklist_|.
   void SetIgnoreLongTermBlackListRules(
       bool ignore_long_term_black_list_rules) override;
 
-  float pingback_reporting_fraction() const {
-    return pingback_reporting_fraction_;
-  }
-
   bool ignore_blacklist() const { return ignore_blacklist_; }
 
  private:
-  // Reporting fraction last set via SetPingbackReportingFraction.
-  float pingback_reporting_fraction_ = 0.0f;
-
   // Whether the long term blacklist rules should be ignored.
   bool ignore_blacklist_ = false;
 };
@@ -398,13 +388,9 @@
     return settings_->data_reduction_proxy_service()->configurator();
   }
 
-  DataReductionProxySettings* settings() const {
-    return settings_.get();
-  }
+  DataReductionProxySettings* settings() const { return settings_.get(); }
 
-  TestDataReductionProxyParams* test_params() const {
-    return params_;
-  }
+  TestDataReductionProxyParams* test_params() const { return params_; }
 
   network::TestNetworkQualityTracker* test_network_quality_tracker() const {
     return test_network_quality_tracker_.get();
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc
index 3cb61d80..cb52a45 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc
@@ -129,50 +129,6 @@
 
 namespace protobuf_parser {
 
-PageloadMetrics_EffectiveConnectionType
-ProtoEffectiveConnectionTypeFromEffectiveConnectionType(
-    net::EffectiveConnectionType effective_connection_type) {
-  switch (effective_connection_type) {
-    case net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN:
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
-    case net::EFFECTIVE_CONNECTION_TYPE_OFFLINE:
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_OFFLINE;
-    case net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
-    case net::EFFECTIVE_CONNECTION_TYPE_2G:
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_2G;
-    case net::EFFECTIVE_CONNECTION_TYPE_3G:
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_3G;
-    case net::EFFECTIVE_CONNECTION_TYPE_4G:
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_4G;
-    default:
-      NOTREACHED();
-      return PageloadMetrics_EffectiveConnectionType_EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
-  }
-}
-
-PageloadMetrics_ConnectionType ProtoConnectionTypeFromConnectionType(
-    net::NetworkChangeNotifier::ConnectionType connection_type) {
-  switch (connection_type) {
-    case net::NetworkChangeNotifier::CONNECTION_UNKNOWN:
-      return PageloadMetrics_ConnectionType_CONNECTION_UNKNOWN;
-    case net::NetworkChangeNotifier::CONNECTION_ETHERNET:
-      return PageloadMetrics_ConnectionType_CONNECTION_ETHERNET;
-    case net::NetworkChangeNotifier::CONNECTION_WIFI:
-      return PageloadMetrics_ConnectionType_CONNECTION_WIFI;
-    case net::NetworkChangeNotifier::CONNECTION_2G:
-      return PageloadMetrics_ConnectionType_CONNECTION_2G;
-    case net::NetworkChangeNotifier::CONNECTION_3G:
-      return PageloadMetrics_ConnectionType_CONNECTION_3G;
-    case net::NetworkChangeNotifier::CONNECTION_4G:
-      return PageloadMetrics_ConnectionType_CONNECTION_4G;
-    case net::NetworkChangeNotifier::CONNECTION_NONE:
-      return PageloadMetrics_ConnectionType_CONNECTION_NONE;
-    case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH:
-      return PageloadMetrics_ConnectionType_CONNECTION_BLUETOOTH;
-  }
-}
-
 net::ProxyServer::Scheme SchemeFromProxyScheme(
     ProxyServer_ProxyScheme proxy_scheme) {
   switch (proxy_scheme) {
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h
index d562ecb..e513d0f9 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h
@@ -9,7 +9,6 @@
 #include <string>
 
 #include "components/data_reduction_proxy/proto/client_config.pb.h"
-#include "components/data_reduction_proxy/proto/pageload_metrics.pb.h"
 #include "net/base/network_change_notifier.h"
 #include "net/base/proxy_server.h"
 #include "net/nqe/effective_connection_type.h"
@@ -75,17 +74,6 @@
               "If net::EFFECTIVE_CONNECTION_TYPE changes, "
               "PageloadMetrics_EffectiveConnectionType needs to be updated.");
 
-// Returns the PageloadMetrics_EffectiveConnectionType equivalent of
-// |effective_connection_type|.
-PageloadMetrics_EffectiveConnectionType
-ProtoEffectiveConnectionTypeFromEffectiveConnectionType(
-    net::EffectiveConnectionType effective_connection_type);
-
-// Returns the PageloadMetrics_ConnectionType equivalent of
-// |connection_type|.
-PageloadMetrics_ConnectionType ProtoConnectionTypeFromConnectionType(
-    net::NetworkChangeNotifier::ConnectionType connection_type);
-
 // Returns the |net::ProxyServer::Scheme| for a ProxyServer_ProxyScheme.
 net::ProxyServer::Scheme SchemeFromProxyScheme(
     ProxyServer_ProxyScheme proxy_scheme);
diff --git a/components/data_reduction_proxy/proto/BUILD.gn b/components/data_reduction_proxy/proto/BUILD.gn
index 730f7bb..fe6d8b81 100644
--- a/components/data_reduction_proxy/proto/BUILD.gn
+++ b/components/data_reduction_proxy/proto/BUILD.gn
@@ -9,6 +9,5 @@
     "client_config.proto",
     "data_store.proto",
     "network_properties.proto",
-    "pageload_metrics.proto",
   ]
 }
diff --git a/components/data_reduction_proxy/proto/pageload_metrics.proto b/components/data_reduction_proxy/proto/pageload_metrics.proto
deleted file mode 100644
index 8b44d5e..0000000
--- a/components/data_reduction_proxy/proto/pageload_metrics.proto
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-import "client_config.proto";
-
-package data_reduction_proxy;
-
-// Information about the device the user is on.
-message PageloadDeviceInfo {
-  // Kilobytes of total device memory.
-  optional int64 total_device_memory_kb = 1;
-}
-
-// Request message to record metrics for one or more pageloads.
-message RecordPageloadMetricsRequest {
-  // The pageload metrics to record.
-  repeated PageloadMetrics pageloads = 1;
-  // Time metrics were sent.
-  optional Timestamp metrics_sent_time = 2;
-
-  // Added in M65.
-  optional PageloadDeviceInfo device_info = 3;
-}
-
-// Information about an attempted HTTPS Lite Page Redirect Preview.
-message HTTPSLitePagePreviewInfo {
-  // The end result statuses. See
-  // //components/previews/content/previews_user_data.h for more detail.
-  enum Status {
-    UNKNOWN = 0;
-    SUCCESS = 1;
-    BYPASS = 2;
-    REDIRECT = 3;
-    FAILURE = 4;
-    CONTROL = 5;
-  };
-
-  // The end status of the attempted preview.
-  optional Status status = 1;
-
-  // The time spent restarting navigations before the final navigation began.
-  optional Duration navigation_restart_penalty = 2;
-}
-
-// Metrics for a single pageload.
-message PageloadMetrics {
-  // Next ID: 35
-  reserved 3, 26;
-
-  // The possible effective connection type values.
-  // See //net/nqe/effective_connection_type.h for the detailed description of
-  // each of the enum values.
-  enum EffectiveConnectionType {
-    EFFECTIVE_CONNECTION_TYPE_UNKNOWN = 0;
-    EFFECTIVE_CONNECTION_TYPE_OFFLINE = 1;
-    EFFECTIVE_CONNECTION_TYPE_SLOW_2G = 2;
-    EFFECTIVE_CONNECTION_TYPE_2G = 3;
-    EFFECTIVE_CONNECTION_TYPE_3G = 4;
-    EFFECTIVE_CONNECTION_TYPE_4G = 5;
-  };
-
-  // The possible conntion type values. See //net/base/network_change_notifier.h
-  // for a detailed description of the enum values.
-  enum ConnectionType {
-    CONNECTION_UNKNOWN = 0;
-    CONNECTION_ETHERNET = 1;
-    CONNECTION_WIFI = 2;
-    CONNECTION_2G = 3;
-    CONNECTION_3G = 4;
-    CONNECTION_4G = 5;
-    CONNECTION_NONE = 6;
-    CONNECTION_BLUETOOTH = 7;
-  };
-
-  // The various opt out states seen by server previews.
-  enum PreviewsOptOut {
-    // Set for non-previews navigations and app background navigations.
-    UNKNOWN = 0;
-    // Set for previews navigations that clicked "show original".
-    OPT_OUT = 1;
-    // Set for previews navigations that did not click "show original".
-    NON_OPT_OUT = 2;
-  }
-
-  // The various server previews that can be shown.
-  enum PreviewsType {
-    // No server preview was applied, but the URL/navigation was not
-    // blacklisted.
-    NONE = 0;
-    // Image placeholders were used on the page.
-    LOFI = 1;
-    // The main resource was a lite page.
-    LITE_PAGE = 2;
-    // Blacklisting rules caused no server preview to be requested. It's
-    // possible in the future that client previews might be shown when server
-    // previews are blacklisted, currently this is not possible.
-    CLIENT_BLACKLIST_PREVENTED_PREVIEW = 3;
-  }
-
-  // What type of crash occured on the page.
-  enum RendererCrashType {
-    // Reserved default value.
-    UNSPECIFIED = 0;
-    // No renderer crash happened on the page.
-    NO_CRASH = 1;
-    // A crash occured on the page, but the type is unknown. This is reported
-    // for all non-Android crashes and Android crashes that did not have their
-    // crash dump analyzed within 5 seconds of the crash.
-    NOT_ANALYZED = 2;
-    // Any other Android crash where the dump was successfully analyzed.
-    OTHER_CRASH = 3;
-    // A crash where the renderer ran out of memory on the page.
-    ANDROID_FOREGROUND_OOM = 4;
-  }
-
-  enum PageEndReason {
-    // Page lifetime has not yet ended (page is still active).
-    END_NONE = 0;
-    // The page was reloaded, possibly by the user.
-    END_RELOAD = 1;
-    // The page was navigated away from, via a back or forward navigation.
-    END_FORWARD_BACK = 2;
-    // The navigation is replaced with a navigation with the qualifier
-    // ui::PAGE_TRANSITION_CLIENT_REDIRECT, which is caused by Javascript, or
-    // the meta refresh tag.
-    END_CLIENT_REDIRECT = 3;
-    // If the page load is replaced by a new navigation. This includes link
-    // clicks, typing in the omnibox (not a reload), and form submissions.
-    END_NEW_NAVIGATION = 4;
-    // The page load was stopped (e.g. the user presses the stop X button).
-    END_STOP = 5;
-    // Page load ended due to closing the tab or browser.
-    END_CLOSE = 6;
-    // The provisional load for this page load failed before committing.
-    END_PROVISIONAL_LOAD_FAILED = 7;
-    // The render process hosting the page terminated unexpectedly.
-    END_RENDER_PROCESS_GONE = 8;
-    // We don't know why the page load ended. This is the value we assign to a
-    // terminated provisional load if the only signal we get is the load
-    // finished without committing, either without error or with
-    // net::ERR_ABORTED.
-    END_OTHER = 9;
-  }
-
-  // The session key used to load the page.
-  optional string session_key = 1;
-  // The time at which the first request of the pageload was made, according to
-  // the client's clock.
-  optional Timestamp first_request_time = 2;
-  // The URL of the main page request.
-  optional string first_request_url = 4;
-  // The URL of the last request.
-  optional string last_request_url = 5;
-
-  // Time to first contentful paint.
-  optional Duration time_to_first_contentful_paint = 6;
-  // Time to first image paint.
-  optional Duration time_to_first_image_paint = 7;
-  // Time to first byte.
-  optional Duration time_to_first_byte = 8;
-  // Time to onLoad event.
-  optional Duration page_load_time = 9;
-
-  // The sum of original-content-length values, over resources that were not
-  // loaded from browser cache.
-  // Secure resources (i.e., HTTPS) that go into this sum are bucketed.
-  optional int64 original_page_size_bytes = 10;
-  // The sum of (compressed) content-length, over resources that were not loaded
-  // from browser cache.
-  // Secure resources (i.e., HTTPS) that go into this sum are bucketed.
-  optional int64 compressed_page_size_bytes = 11;
-
-  // The effective connection type at the start of the navigation.
-  optional EffectiveConnectionType effective_connection_type = 12;
-
-  // The amount of time the parser was blocked by loading script.
-  optional Duration parse_blocked_on_script_load_duration = 13;
-
-  // Time until parsing finished.
-  optional Duration parse_stop = 14;
-
-  // Time to first meaningful paint. This measure is unstable and will change
-  // over time.
-  optional Duration experimental_time_to_first_meaningful_paint = 15;
-
-  // The unique identifier for the page load.
-  optional uint64 page_id = 16;
-
-  // The opt out state of the page load.
-  optional PreviewsOptOut previews_opt_out = 17;
-
-  // The previews type that was used on the page.
-  optional PreviewsType previews_type = 18;
-
-  // The name of the finch group for the data reduction proxy holdback
-  // experiment. This can be an empty string if not included in a finch group.
-  optional string holdback_group = 19;
-
-  // Kilobytes of memory used by the main renderer process related to this page
-  // load. Recorded after load event starts. 0 if the page closed before or
-  // shortly after load event or the memory dump failed.
-  // Out of process frames will not be tracked in this estimate.
-  optional int64 renderer_memory_usage_kb = 20;
-
-  // The RendererCrashType for the page load.
-  optional RendererCrashType renderer_crash_type = 21;
-
-  // The percent of total_page_size_bytes that were loaded from the cache. This
-  // value is in the range [0.0, 1.0].
-  optional float cached_fraction = 22;
-
-  // The connection type (Wifi, 2G, 3G, 4G, None, etc) reported by the
-  // NetworkChangeNotifier.
-  optional ConnectionType connection_type = 23;
-
-  // The sum of all bytes loaded on a page. This is compressed_page_size_bytes
-  // plus the sum of content-length for all resources loaded from the browser
-  // cache. Secure resources (i.e., HTTPS) that go into this sum are bucketed.
-  optional int64 total_page_size_bytes = 24;
-
-  // The queuing delay for the first user input on the page.
-  optional Duration first_input_delay = 25;
-
-  // The time when the page load was ended.
-  optional Duration page_end_time = 27;
-
-  // The reason that the page load ended.
-  optional PageEndReason page_end_reason = 28;
-
-  // The number of touch events that happened on the page.
-  optional uint32 touch_count = 29;
-
-  // The number of scroll events that happened on the page.
-  optional uint32 scroll_count = 30;
-
-  // The release channel of this Chrome instance, e.g.: "stable", "beta", "dev",
-  // "canary", "unknown".
-  optional string channel = 31;
-
-  // The duration between the navigation start as reported by the navigation
-  // handle, and when the fetchStart of the main page HTML.
-  optional Duration navigation_start_to_main_frame_fetch_start = 32;
-
-  // The number of main frame redirects that occurred before commit.
-  optional uint32 redirect_count = 33;
-
-  // Information about an attempted HTTPS Lite Page Redirect Preview, if one was
-  // attempted.
-  optional HTTPSLitePagePreviewInfo https_litepage_info = 34;
-}
diff --git a/components/guest_os/BUILD.gn b/components/guest_os/BUILD.gn
new file mode 100644
index 0000000..48af535
--- /dev/null
+++ b/components/guest_os/BUILD.gn
@@ -0,0 +1,55 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//testing/test.gni")
+
+static_library("guest_os") {
+  deps = [
+    ":prefs",
+    "//ash/public/cpp",
+    "//chromeos/dbus/power",
+    "//chromeos/dbus/power:power_manager_proto",
+    "//chromeos/dbus/session_manager",
+    "//components/exo",
+    "//components/prefs",
+    "//components/session_manager/core",
+    "//ui/wm/public:public",
+  ]
+  sources = [
+    "guest_os_engagement_metrics.cc",
+    "guest_os_engagement_metrics.h",
+  ]
+}
+
+static_library("prefs") {
+  sources = [
+    "guest_os_prefs.cc",
+    "guest_os_prefs.h",
+  ]
+
+  deps = [
+    "//components/prefs",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  deps = [
+    ":guest_os",
+    ":prefs",
+    "//ash:ash",
+    "//base/test:test_support",
+    "//chromeos/dbus/power:power",
+    "//chromeos/dbus/power:power_manager_proto",
+    "//chromeos/dbus/session_manager",
+    "//components/prefs:test_support",
+    "//components/session_manager/core",
+    "//content/test:test_support",
+    "//testing/gtest",
+    "//ui/aura:test_support",
+  ]
+  sources = [
+    "guest_os_engagement_metrics_unittest.cc",
+  ]
+}
diff --git a/components/guest_os/DEPS b/components/guest_os/DEPS
new file mode 100644
index 0000000..1970e9dd
--- /dev/null
+++ b/components/guest_os/DEPS
@@ -0,0 +1,9 @@
+include_rules = [
+  "+chromeos/dbus",
+  "+components/exo",
+  "+components/prefs",
+  "+components/session_manager/core",
+  "+content/public",
+  "+ui/aura",
+  "+ui/wm/public",
+]
diff --git a/components/guest_os/OWNERS b/components/guest_os/OWNERS
new file mode 100644
index 0000000..dc48383c
--- /dev/null
+++ b/components/guest_os/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/chromeos/guest_os/OWNERS
diff --git a/components/guest_os/README.md b/components/guest_os/README.md
new file mode 100644
index 0000000..22ec68c5
--- /dev/null
+++ b/components/guest_os/README.md
@@ -0,0 +1,2 @@
+The Guest OS component is for code that is shared between multiple Guest OSes
+(Crostini, Plugin VM, ARC++), but doesn't fit in c/b/chromeos/guest\_os.
diff --git a/components/guest_os/guest_os_engagement_metrics.cc b/components/guest_os/guest_os_engagement_metrics.cc
new file mode 100644
index 0000000..df67b35
--- /dev/null
+++ b/components/guest_os/guest_os_engagement_metrics.cc
@@ -0,0 +1,227 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/guest_os/guest_os_engagement_metrics.h"
+
+#include <string>
+#include <utility>
+
+#include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/system/sys_info.h"
+#include "base/time/default_clock.h"
+#include "base/time/default_tick_clock.h"
+#include "chromeos/dbus/power_manager/idle.pb.h"
+#include "chromeos/dbus/session_manager/session_manager_client.h"
+#include "components/exo/wm_helper.h"
+#include "components/guest_os/guest_os_prefs.h"
+#include "components/prefs/pref_service.h"
+#include "components/session_manager/core/session_manager.h"
+
+namespace guest_os {
+
+namespace {
+
+constexpr base::TimeDelta kUpdateEngagementTimePeriod =
+    base::TimeDelta::FromMinutes(1);
+constexpr base::TimeDelta kSaveEngagementTimeToPrefsPeriod =
+    base::TimeDelta::FromMinutes(30);
+
+int GetDayId(const base::Clock* clock) {
+  return clock->Now().LocalMidnight().since_origin().InDays();
+}
+
+}  // namespace
+
+GuestOsEngagementMetrics::GuestOsEngagementMetrics(
+    PrefService* pref_service,
+    WindowMatcher window_matcher,
+    const std::string& pref_prefix,
+    const std::string& uma_name)
+    : pref_service_(pref_service),
+      window_matcher_(window_matcher),
+      pref_prefix_(pref_prefix),
+      uma_name_(uma_name),
+      clock_(base::DefaultClock::GetInstance()),
+      tick_clock_(base::DefaultTickClock::GetInstance()),
+      last_update_ticks_(tick_clock_->NowTicks()) {
+  // If WMHelper doesn't exist, do nothing. This occurs in tests.
+  if (exo::WMHelper::HasInstance())
+    exo::WMHelper::GetInstance()->AddActivationObserver(this);
+
+  session_manager::SessionManager::Get()->AddObserver(this);
+  chromeos::PowerManagerClient::Get()->AddObserver(this);
+
+  DCHECK(pref_service_);
+  RestoreEngagementTimeFromPrefs();
+  update_engagement_time_timer_.Start(
+      FROM_HERE, kUpdateEngagementTimePeriod, this,
+      &GuestOsEngagementMetrics::UpdateEngagementTime);
+  save_engagement_time_to_prefs_timer_.Start(
+      FROM_HERE, kSaveEngagementTimeToPrefsPeriod, this,
+      &GuestOsEngagementMetrics::SaveEngagementTimeToPrefs);
+}
+
+GuestOsEngagementMetrics::~GuestOsEngagementMetrics() {
+  save_engagement_time_to_prefs_timer_.Stop();
+  update_engagement_time_timer_.Stop();
+  UpdateEngagementTime();
+  SaveEngagementTimeToPrefs();
+
+  chromeos::PowerManagerClient::Get()->RemoveObserver(this);
+  session_manager::SessionManager::Get()->RemoveObserver(this);
+
+  // If WMHelper is already destroyed, do nothing.
+  // TODO(crbug.com/748380): Fix shutdown order.
+  if (exo::WMHelper::HasInstance())
+    exo::WMHelper::GetInstance()->RemoveActivationObserver(this);
+}
+
+void GuestOsEngagementMetrics::SetBackgroundActive(bool background_active) {
+  if (background_active_ == background_active)
+    return;
+  UpdateEngagementTime();
+  background_active_ = background_active;
+}
+
+void GuestOsEngagementMetrics::SetClocksForTesting(
+    base::Clock* clock,
+    base::TickClock* tick_clock) {
+  clock_ = clock;
+  tick_clock_ = tick_clock;
+  ResetEngagementTimePrefs();
+}
+
+void GuestOsEngagementMetrics::OnWindowActivated(
+    wm::ActivationChangeObserver::ActivationReason reason,
+    aura::Window* gained_active,
+    aura::Window* lost_active) {
+  UpdateEngagementTime();
+  matched_window_active_ = window_matcher_.Run(gained_active);
+}
+
+void GuestOsEngagementMetrics::OnSessionStateChanged() {
+  UpdateEngagementTime();
+  session_active_ = session_manager::SessionManager::Get()->session_state() ==
+                    session_manager::SessionState::ACTIVE;
+}
+
+void GuestOsEngagementMetrics::ScreenIdleStateChanged(
+    const power_manager::ScreenIdleState& proto) {
+  UpdateEngagementTime();
+  screen_dimmed_ = proto.dimmed();
+}
+
+void GuestOsEngagementMetrics::RestoreEngagementTimeFromPrefs() {
+  // Restore accumulated results only if they were recorded on the same OS
+  // version.
+  if (pref_service_->GetString(pref_prefix_ +
+                               prefs::kEngagementTimeOsVersion) ==
+      base::SysInfo::OperatingSystemVersion()) {
+    day_id_ =
+        pref_service_->GetInteger(pref_prefix_ + prefs::kEngagementTimeDayId);
+    engagement_time_total_ =
+        pref_service_->GetTimeDelta(pref_prefix_ + prefs::kEngagementTimeTotal);
+    engagement_time_foreground_ = pref_service_->GetTimeDelta(
+        pref_prefix_ + prefs::kEngagementTimeForeground);
+    engagement_time_background_ = pref_service_->GetTimeDelta(
+        pref_prefix_ + prefs::kEngagementTimeBackground);
+  } else {
+    ResetEngagementTimePrefs();
+  }
+
+  RecordEngagementTimeToUmaIfNeeded();
+}
+
+void GuestOsEngagementMetrics::SaveEngagementTimeToPrefs() {
+  DCHECK(pref_service_);
+
+  pref_service_->SetString(pref_prefix_ + prefs::kEngagementTimeOsVersion,
+                           base::SysInfo::OperatingSystemVersion());
+  pref_service_->SetInteger(pref_prefix_ + prefs::kEngagementTimeDayId,
+                            day_id_);
+  pref_service_->SetTimeDelta(pref_prefix_ + prefs::kEngagementTimeTotal,
+                              engagement_time_total_);
+  pref_service_->SetTimeDelta(pref_prefix_ + prefs::kEngagementTimeForeground,
+                              engagement_time_foreground_);
+  pref_service_->SetTimeDelta(pref_prefix_ + prefs::kEngagementTimeBackground,
+                              engagement_time_background_);
+}
+
+void GuestOsEngagementMetrics::UpdateEngagementTime() {
+  VLOG(2) << "last state: screen_dimmed=" << screen_dimmed_
+          << " session_active=" << session_active_
+          << " background_active=" << background_active_
+          << " matched_window_active=" << matched_window_active_;
+
+  base::TimeTicks now = tick_clock_->NowTicks();
+  base::TimeDelta elapsed = now - last_update_ticks_;
+
+  if (ShouldAccumulateEngagementTotalTime()) {
+    VLOG(2) << "accumulate to total time " << elapsed;
+    engagement_time_total_ += elapsed;
+    if (ShouldAccumulateEngagementForegroundTime()) {
+      VLOG(2) << "accumulate to foreground time " << elapsed;
+      engagement_time_foreground_ += elapsed;
+    } else if (ShouldAccumulateEngagementBackgroundTime()) {
+      VLOG(2) << "accumulate to background time " << elapsed;
+      engagement_time_background_ += elapsed;
+    }
+  }
+
+  last_update_ticks_ = now;
+  RecordEngagementTimeToUmaIfNeeded();
+}
+
+void GuestOsEngagementMetrics::RecordEngagementTimeToUmaIfNeeded() {
+  if (!ShouldRecordEngagementTimeToUma())
+    return;
+  VLOG(2) << "day changed, recording engagement time to UMA";
+  UmaHistogramCustomTimes(
+      uma_name_ + ".EngagementTime.Total", engagement_time_total_,
+      base::TimeDelta::FromSeconds(1),
+      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
+  UmaHistogramCustomTimes(
+      uma_name_ + ".EngagementTime." + uma_name_ + "Total",
+      engagement_time_foreground_ + engagement_time_background_,
+      base::TimeDelta::FromSeconds(1),
+      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
+  UmaHistogramCustomTimes(
+      uma_name_ + ".EngagementTime.Foreground", engagement_time_foreground_,
+      base::TimeDelta::FromSeconds(1),
+      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
+  UmaHistogramCustomTimes(
+      uma_name_ + ".EngagementTime.Background", engagement_time_background_,
+      base::TimeDelta::FromSeconds(1),
+      base::TimeDelta::FromDays(1) + kUpdateEngagementTimePeriod, 50);
+  ResetEngagementTimePrefs();
+}
+
+void GuestOsEngagementMetrics::ResetEngagementTimePrefs() {
+  day_id_ = GetDayId(clock_);
+  engagement_time_total_ = base::TimeDelta();
+  engagement_time_foreground_ = base::TimeDelta();
+  engagement_time_background_ = base::TimeDelta();
+  SaveEngagementTimeToPrefs();
+}
+
+bool GuestOsEngagementMetrics::ShouldAccumulateEngagementTotalTime() const {
+  return session_active_ && !screen_dimmed_;
+}
+
+bool GuestOsEngagementMetrics::ShouldAccumulateEngagementForegroundTime()
+    const {
+  return matched_window_active_;
+}
+
+bool GuestOsEngagementMetrics::ShouldAccumulateEngagementBackgroundTime()
+    const {
+  return background_active_;
+}
+
+bool GuestOsEngagementMetrics::ShouldRecordEngagementTimeToUma() const {
+  return day_id_ != GetDayId(clock_);
+}
+
+}  // namespace guest_os
diff --git a/components/guest_os/guest_os_engagement_metrics.h b/components/guest_os/guest_os_engagement_metrics.h
new file mode 100644
index 0000000..0b74315
--- /dev/null
+++ b/components/guest_os/guest_os_engagement_metrics.h
@@ -0,0 +1,131 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_GUEST_OS_GUEST_OS_ENGAGEMENT_METRICS_H_
+#define COMPONENTS_GUEST_OS_GUEST_OS_ENGAGEMENT_METRICS_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "chromeos/dbus/power/power_manager_client.h"
+#include "components/session_manager/core/session_manager_observer.h"
+#include "ui/wm/public/activation_change_observer.h"
+
+class PrefService;
+
+namespace aura {
+class Window;
+}  // namespace aura
+
+namespace base {
+class Clock;
+class TickClock;
+}  // namespace base
+
+namespace guest_os {
+
+// A class for recording engagement metrics. Calculates and reports daily
+// totals for the following metrics:
+// - Foo.EngagementTime.Total: Engaged session time, i.e. excluding when the
+// screen is locked or dim due to user idle. To allow comparisons with the
+// other metrics, this class should only be instantiated when the relevant
+// Guest OS is supported.
+// - Foo.EngagementTime.Foreground: Time when the user is engaged and focused
+// on a matching window.
+// - Foo.EngagementTime.Background: Time when the user is engaged and not
+// focused on a matching window, but the Guest OS is otherwise active in the
+// background.
+// - Foo.Engagement.FooTotal: Total of Foreground and Background.
+class GuestOsEngagementMetrics : public wm::ActivationChangeObserver,
+                                 public session_manager::SessionManagerObserver,
+                                 public chromeos::PowerManagerClient::Observer {
+ public:
+  using WindowMatcher = base::RepeatingCallback<bool(const aura::Window*)>;
+
+  GuestOsEngagementMetrics(PrefService* pref_service,
+                           WindowMatcher window_matcher,
+                           const std::string& pref_prefix,
+                           const std::string& uma_name);
+  ~GuestOsEngagementMetrics() override;
+
+  // Instead of using |window_matcher_|, we let consumers define when the Guest
+  // OS is active in the background. This function should be called whenever
+  // changes.
+  void SetBackgroundActive(bool background_active);
+
+  void SetClocksForTesting(base::Clock* clock, base::TickClock* tick_clock);
+
+  // wm::ActivationChangeObserver:
+  void OnWindowActivated(wm::ActivationChangeObserver::ActivationReason reason,
+                         aura::Window* gained_active,
+                         aura::Window* lost_active) override;
+
+  // session_manager::SessionManagerObserver:
+  void OnSessionStateChanged() override;
+
+  // chromeos::PowerManagerClient::Observer:
+  void ScreenIdleStateChanged(
+      const power_manager::ScreenIdleState& proto) override;
+
+ private:
+  // Restores accumulated engagement time in previous sessions from profile
+  // preferences.
+  void RestoreEngagementTimeFromPrefs();
+
+  // Called periodically to save accumulated results to profile preferences.
+  void SaveEngagementTimeToPrefs();
+
+  // Called whenever engagement state is changed. Time spent in last state is
+  // accumulated to corresponding metrics.
+  void UpdateEngagementTime();
+
+  // Records accumulated engagement time metrics to UMA if necessary (i.e. day
+  // has changed).
+  void RecordEngagementTimeToUmaIfNeeded();
+
+  // Resets accumulated engagement times to zero, and updates both OS version
+  // and day ID.
+  void ResetEngagementTimePrefs();
+
+  bool ShouldAccumulateEngagementTotalTime() const;
+  bool ShouldAccumulateEngagementForegroundTime() const;
+  bool ShouldAccumulateEngagementBackgroundTime() const;
+
+  bool ShouldRecordEngagementTimeToUma() const;
+
+  PrefService* const pref_service_;
+
+  WindowMatcher window_matcher_;
+  std::string pref_prefix_;
+  std::string uma_name_;
+
+  // |clock_| is used for determining when to log to UMA, while |tick_clock_|
+  // is used to calculate elapsed time.
+  const base::Clock* clock_;
+  const base::TickClock* tick_clock_;
+  base::RepeatingTimer update_engagement_time_timer_;
+  base::RepeatingTimer save_engagement_time_to_prefs_timer_;
+  base::TimeTicks last_update_ticks_;
+
+  // States for determining which engagement metrics should we accumulate to.
+  bool session_active_ = false;
+  bool screen_dimmed_ = false;
+  bool background_active_ = false;
+  bool matched_window_active_ = false;
+
+  // Accumulated results and associated state which are saved to profile
+  // preferences at fixed interval.
+  int day_id_ = 0;
+  base::TimeDelta engagement_time_total_;
+  base::TimeDelta engagement_time_foreground_;
+  base::TimeDelta engagement_time_background_;
+
+  DISALLOW_COPY_AND_ASSIGN(GuestOsEngagementMetrics);
+};
+
+}  // namespace guest_os
+
+#endif  // COMPONENTS_GUEST_OS_GUEST_OS_ENGAGEMENT_METRICS_H_
diff --git a/components/guest_os/guest_os_engagement_metrics_unittest.cc b/components/guest_os/guest_os_engagement_metrics_unittest.cc
new file mode 100644
index 0000000..cb44d32
--- /dev/null
+++ b/components/guest_os/guest_os_engagement_metrics_unittest.cc
@@ -0,0 +1,220 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/guest_os/guest_os_engagement_metrics.h"
+
+#include <algorithm>
+#include <string>
+#include <utility>
+
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/simple_test_clock.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "chromeos/dbus/power/fake_power_manager_client.h"
+#include "chromeos/dbus/power_manager/idle.pb.h"
+#include "chromeos/dbus/session_manager/session_manager_client.h"
+#include "components/guest_os/guest_os_prefs.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/session_manager/core/session_manager.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/test/test_windows.h"
+
+namespace guest_os {
+namespace {
+
+constexpr char kUmaName[] = "Foo";
+constexpr char kPrefPrefix[] = "Bar";
+
+constexpr char kHistogramTotal[] = "Total";
+constexpr char kHistogramForeground[] = "Foreground";
+constexpr char kHistogramBackground[] = "Background";
+constexpr char kHistogramActiveTotal[] = "FooTotal";
+
+class GuestOsEngagementMetricsTest : public testing::Test {
+ protected:
+  GuestOsEngagementMetricsTest() = default;
+
+  void SetUp() override {
+    chromeos::PowerManagerClient::InitializeFake();
+    chromeos::SessionManagerClient::InitializeFakeInMemory();
+    pref_service_ = std::make_unique<TestingPrefServiceSimple>();
+
+    matched_window_.reset(aura::test::CreateTestWindowWithId(0, nullptr));
+    non_matched_window_.reset(aura::test::CreateTestWindowWithId(0, nullptr));
+
+    prefs::RegisterEngagementProfilePrefs(pref_service_->registry(),
+                                          kPrefPrefix);
+    engagement_metrics_ = std::make_unique<GuestOsEngagementMetrics>(
+        pref_service_.get(),
+        base::BindRepeating(&GuestOsEngagementMetricsTest::MatchWindow,
+                            base::Unretained(this)),
+        kPrefPrefix, kUmaName);
+
+    // The code doesn't work for correctly for a clock just at the epoch so
+    // advance by a day first.
+    test_clock_.Advance(base::TimeDelta::FromDays(1));
+    engagement_metrics_->SetClocksForTesting(&test_clock_, &test_tick_clock_);
+    SetSessionState(session_manager::SessionState::ACTIVE);
+  }
+
+  void TearDown() override {
+    engagement_metrics_.reset();
+    non_matched_window_.reset();
+    matched_window_.reset();
+    pref_service_.reset();
+    chromeos::SessionManagerClient::Shutdown();
+    chromeos::PowerManagerClient::Shutdown();
+  }
+
+  GuestOsEngagementMetrics* engagement_metrics() {
+    return engagement_metrics_.get();
+  }
+
+  void SetSessionState(session_manager::SessionState state) {
+    session_manager_.SetSessionState(state);
+  }
+
+  void SetScreenDimmed(bool is_screen_dimmed) {
+    power_manager::ScreenIdleState screen_idle_state;
+    screen_idle_state.set_dimmed(is_screen_dimmed);
+    static_cast<chromeos::FakePowerManagerClient*>(
+        chromeos::PowerManagerClient::Get())
+        ->SendScreenIdleStateChanged(screen_idle_state);
+  }
+
+  void AdvanceSeconds(int seconds) {
+    test_tick_clock_.Advance(base::TimeDelta::FromSeconds(seconds));
+  }
+
+  void FocusMatchedWindow() {
+    engagement_metrics()->OnWindowActivated(
+        wm::ActivationChangeObserver::ActivationReason::INPUT_EVENT,
+        matched_window_.get(), nullptr);
+  }
+
+  void FocusNonMatchedWindow() {
+    engagement_metrics()->OnWindowActivated(
+        wm::ActivationChangeObserver::ActivationReason::INPUT_EVENT,
+        non_matched_window_.get(), nullptr);
+  }
+
+  void TriggerRecordEngagementTimeToUma() {
+    // Trigger UMA record by changing to next day.
+    test_clock_.Advance(base::TimeDelta::FromDays(1));
+    engagement_metrics_->OnSessionStateChanged();
+  }
+
+  void ExpectTime(const std::string& histogram, int seconds) {
+    tester_.ExpectTimeBucketCount("Foo.EngagementTime." + histogram,
+                                  base::TimeDelta::FromSeconds(seconds), 1);
+  }
+
+ private:
+  bool MatchWindow(const aura::Window* window) {
+    return window == matched_window_.get();
+  }
+
+  content::BrowserTaskEnvironment task_environment_;
+  session_manager::SessionManager session_manager_;
+
+  base::SimpleTestTickClock test_tick_clock_;
+  base::SimpleTestClock test_clock_;
+
+  base::HistogramTester tester_;
+
+  std::unique_ptr<TestingPrefServiceSimple> pref_service_;
+
+  std::unique_ptr<aura::Window> matched_window_;
+  std::unique_ptr<aura::Window> non_matched_window_;
+
+  std::unique_ptr<GuestOsEngagementMetrics> engagement_metrics_;
+
+  DISALLOW_COPY_AND_ASSIGN(GuestOsEngagementMetricsTest);
+};
+
+TEST_F(GuestOsEngagementMetricsTest, RecordEngagementTimeSessionLocked) {
+  SetSessionState(session_manager::SessionState::LOCKED);
+  AdvanceSeconds(1);
+  SetSessionState(session_manager::SessionState::ACTIVE);
+  AdvanceSeconds(5);
+  SetSessionState(session_manager::SessionState::LOCKED);
+  AdvanceSeconds(10);
+
+  TriggerRecordEngagementTimeToUma();
+  ExpectTime(kHistogramTotal, 5);
+  ExpectTime(kHistogramForeground, 0);
+  ExpectTime(kHistogramBackground, 0);
+  ExpectTime(kHistogramActiveTotal, 0);
+}
+
+TEST_F(GuestOsEngagementMetricsTest, RecordEngagementTimeScreenDimmed) {
+  SetScreenDimmed(true);
+  AdvanceSeconds(1);
+  SetScreenDimmed(false);
+  AdvanceSeconds(5);
+  SetScreenDimmed(true);
+  AdvanceSeconds(10);
+
+  TriggerRecordEngagementTimeToUma();
+  ExpectTime(kHistogramTotal, 5);
+  ExpectTime(kHistogramForeground, 0);
+  ExpectTime(kHistogramBackground, 0);
+  ExpectTime(kHistogramActiveTotal, 0);
+}
+
+TEST_F(GuestOsEngagementMetricsTest, RecordEngagementTimeChangeFocus) {
+  FocusMatchedWindow();
+  AdvanceSeconds(2);
+  FocusNonMatchedWindow();
+  AdvanceSeconds(4);
+  FocusMatchedWindow();
+  AdvanceSeconds(10);
+  FocusNonMatchedWindow();
+  AdvanceSeconds(20);
+
+  // No background time is recorded as background activity is based on calls to
+  // SetBackgroundActive and not background windows.
+  TriggerRecordEngagementTimeToUma();
+  ExpectTime(kHistogramTotal, 36);
+  ExpectTime(kHistogramForeground, 12);
+  ExpectTime(kHistogramBackground, 0);
+  ExpectTime(kHistogramActiveTotal, 12);
+}
+
+TEST_F(GuestOsEngagementMetricsTest, RecordEngagementTimeBackgroundActive) {
+  AdvanceSeconds(10);
+  engagement_metrics()->SetBackgroundActive(true);
+  AdvanceSeconds(5);
+  engagement_metrics()->SetBackgroundActive(false);
+  AdvanceSeconds(1);
+
+  TriggerRecordEngagementTimeToUma();
+  ExpectTime(kHistogramTotal, 16);
+  ExpectTime(kHistogramForeground, 0);
+  ExpectTime(kHistogramBackground, 5);
+  ExpectTime(kHistogramActiveTotal, 5);
+}
+
+TEST_F(GuestOsEngagementMetricsTest,
+       RecordEngagementTimeBackgroundAndForeground) {
+  AdvanceSeconds(1);
+  engagement_metrics()->SetBackgroundActive(true);
+  AdvanceSeconds(2);
+  FocusMatchedWindow();
+  AdvanceSeconds(4);
+  FocusNonMatchedWindow();
+  AdvanceSeconds(10);
+  engagement_metrics()->SetBackgroundActive(false);
+  AdvanceSeconds(20);
+
+  TriggerRecordEngagementTimeToUma();
+  ExpectTime(kHistogramTotal, 37);
+  ExpectTime(kHistogramForeground, 4);
+  ExpectTime(kHistogramBackground, 12);
+  ExpectTime(kHistogramActiveTotal, 16);
+}
+
+}  // namespace
+}  // namespace guest_os
diff --git a/components/guest_os/guest_os_prefs.cc b/components/guest_os/guest_os_prefs.cc
new file mode 100644
index 0000000..4211807
--- /dev/null
+++ b/components/guest_os/guest_os_prefs.cc
@@ -0,0 +1,43 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/guest_os/guest_os_prefs.h"
+
+#include "components/prefs/pref_registry_simple.h"
+
+namespace guest_os {
+namespace prefs {
+
+// The following prefs (nested under a provided location, e.g. arc.metrics)
+// persist engagement time across sessions, to be accumulated and sent to UMA
+// once a day.
+
+// Total engagement time of the device.
+const char kEngagementTimeTotal[] = ".engagement_time.total";
+// Time spent with a matched window in the foreground.
+const char kEngagementTimeForeground[] = ".engagement_time.foreground";
+// Time spent without a matched window in the foreground but the guest OS
+// otherwise running in the background.
+const char kEngagementTimeBackground[] = ".engagement_time.background";
+// The OS version when engagement prefs were recorded. Old results will be
+// discarded if a version change is detected.
+const char kEngagementTimeOsVersion[] = ".engagement_time.os_version";
+// The day ID (number of days since origin of Time) when engagement time was
+// last recorded.
+const char kEngagementTimeDayId[] = ".engagement_time.day_id";
+
+void RegisterEngagementProfilePrefs(PrefRegistrySimple* registry,
+                                    const std::string& pref_prefix) {
+  registry->RegisterTimeDeltaPref(pref_prefix + kEngagementTimeBackground,
+                                  base::TimeDelta());
+  registry->RegisterIntegerPref(pref_prefix + kEngagementTimeDayId, 0);
+  registry->RegisterTimeDeltaPref(pref_prefix + kEngagementTimeForeground,
+                                  base::TimeDelta());
+  registry->RegisterStringPref(pref_prefix + kEngagementTimeOsVersion, "");
+  registry->RegisterTimeDeltaPref(pref_prefix + kEngagementTimeTotal,
+                                  base::TimeDelta());
+}
+
+}  // namespace prefs
+}  // namespace guest_os
diff --git a/components/guest_os/guest_os_prefs.h b/components/guest_os/guest_os_prefs.h
new file mode 100644
index 0000000..9c43041
--- /dev/null
+++ b/components/guest_os/guest_os_prefs.h
@@ -0,0 +1,28 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_GUEST_OS_GUEST_OS_PREFS_H_
+#define COMPONENTS_GUEST_OS_GUEST_OS_PREFS_H_
+
+#include <string>
+
+class PrefRegistrySimple;
+
+namespace guest_os {
+namespace prefs {
+
+extern const char kEngagementTimeTotal[];
+extern const char kEngagementTimeForeground[];
+extern const char kEngagementTimeBackground[];
+extern const char kEngagementTimeOsVersion[];
+extern const char kEngagementTimeDayId[];
+
+// Registers prefs used by GuestOsEngagementMetrics.
+void RegisterEngagementProfilePrefs(PrefRegistrySimple* registry,
+                                    const std::string& pref_prefix);
+
+}  // namespace prefs
+}  // namespace guest_os
+
+#endif  // COMPONENTS_GUEST_OS_GUEST_OS_PREFS_H_
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index f994b3cf..11088e3 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -226,6 +226,7 @@
 
       Se esta política não for definida, o código de rede pode sair do processo do navegador, dependendo de testes de campo do experimento do NetworkService.</translation>
 <translation id="1384459581748403878">Referência: <ph name="REFERENCE_URL" /></translation>
+<translation id="138847842893090358">Informar o status de atualização do SO</translation>
 <translation id="1393485621820363363">Impressoras empresariais ativadas</translation>
 <translation id="1397855852561539316">URL sugerido do provedor de pesquisa padrão</translation>
 <translation id="1404043648050567997">O serviço Navegação segura mostra uma página de aviso quando os usuários navegam em sites que são sinalizados como potencialmente mal-intencionados. A ativação dessa configuração impede que os usuários prossigam da página de aviso para o site.
@@ -791,6 +792,10 @@
 
       Se a política estiver definida como verdadeira, os eventos serão registrados.
       Se a política estiver definida como falsa ou não tiver sido definida, os eventos não serão registrados.</translation>
+<translation id="2440773021691931148">Informa estatísticas de hardware e identificadores relacionados à energia.
+
+      Se a política for definida como falsa ou se não for definida, as estatísticas não serão informadas.
+      Se for definida como verdadeira, as estatísticas serão informadas.</translation>
 <translation id="244317009688098048">Ativar atalho do teclado do plano de salvação para login automático.
 
       Se esta política não for definida ou for definida como verdadeira e uma conta local de dispositivo for configurada para login automático com zero atraso, o <ph name="PRODUCT_OS_NAME" /> respeitará o atalho do teclado Ctrl+Alt+S ignorando o login automático e mostrando a tela de login.
@@ -799,6 +804,15 @@
 <translation id="2454228136871844693">Otimiza a estabilidade.</translation>
 <translation id="2463034609187171371">Ativar pacotes de criptografia DHE em TLS</translation>
 <translation id="2463365186486772703">Localidade do aplicativo</translation>
+<translation id="2464012905766911533">Esta política permite que um administrador especifique que uma página pode enviar solicitações XHR síncronas durante a dispensa de páginas.
+
+      Quando a política for definida como ativada, as páginas poderão enviar solicitações XHR síncronas durante a dispensa de páginas.
+
+      Quando a política for definida como desativada ou não for definida, as páginas não poderão enviar solicitações XHR síncronas durante a dispensa de páginas.
+
+      Essa política será removida no Chrome 82.
+
+      Consulte https://www.chromestatus.com/feature/4664843055398912.</translation>
 <translation id="2466131534462628618">A autenticação de portal cativo ignora o proxy</translation>
 <translation id="2466697858869282874">Configura a disponibilidade e o comportamento da funcionalidade de atualização do firmware do <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
@@ -1482,6 +1496,7 @@
           Se esta política não for definida, o "Selecionar para ouvir" será desativado inicialmente, mas poderá ser ativado pelo usuário a qualquer momento.</translation>
 <translation id="3591527072193107424">Ativa o recurso "Suporte a navegadores legados".</translation>
 <translation id="3591584750136265240">Configura o comportamento de autenticação de login</translation>
+<translation id="3617743504695003280">Permite que uma página execute solicitações XHR síncronas durante a dispensa de páginas.</translation>
 <translation id="3627678165642179114">Ativar ou desativar serviço da web de verificação ortográfica</translation>
 <translation id="3628480121685794414">Ativar impressão simplex</translation>
 <translation id="3631099945620529777">Se definida como falsa, o botão "Encerrar processo" será desativado no Gerenciador de tarefas.
@@ -1675,6 +1690,10 @@
       Se esta política de plano de fundo for definida, o dispositivo Chrome OS fará o download da imagem de plano de fundo e a usará na tela de login caso nenhum usuário tenha feito login no dispositivo. Depois que o usuário faz login, a política de plano de fundo dele entra em ação.
 
       Se a política de plano de fundo do dispositivo não for definida, a política de plano de fundo do usuário definirá o que exibir, caso ela tenha sido definida.</translation>
+<translation id="3964606652985594895">Informa estatísticas de hardware e identificadores para dispositivos de armazenamento.
+
+      Se a política for definida como falsa ou se não for definida, as estatísticas não serão informadas.
+      Se for definida como verdadeira, as estatísticas serão informadas.</translation>
 <translation id="3965339130942650562">Tempo limite até que a saída do usuário ocioso seja executada</translation>
 <translation id="3973371701361892765">Nunca ocultar automaticamente a estante</translation>
 <translation id="3984028218719007910">Determina se o <ph name="PRODUCT_OS_NAME" /> deve manter os dados locais da conta após a saída. Se for configurada como true, nenhuma conta persistente será mantida pelo <ph name="PRODUCT_OS_NAME" /> e todos os dados da sessão do usuário serão descartados após a saída. Se esta política for configurada como false ou não for configurada, o dispositivo poderá manter os dados locais do usuário (criptografados).</translation>
@@ -2144,9 +2163,16 @@
 <translation id="4807950475297505572">Os usuários menos utilizados ​​recentemente serão removidos até que haja espaço livre suficiente</translation>
 <translation id="4816674326202173458">Permitir que o usuário corporativo seja ao mesmo tempo primário e secundário (comportamento padrão para usuários não gerenciados)</translation>
 <translation id="4826326557828204741">Ação a ser executada quando o tempo de inatividade for atingido durante execução com bateria</translation>
+<translation id="4830531683854509779">Informa estatísticas de hardware para componentes de SoC.
+
+      Se a política for definida como falsa ou se não for definida, as estatísticas não serão informadas.
+      Se for definida como verdadeira, as estatísticas serão informadas.</translation>
 <translation id="4832852360828533362">Relatórios de usuário e do dispositivo</translation>
 <translation id="4834526953114077364">Os usuários menos utilizados ​​recentemente que não se conectaram nos últimos três meses serão removidos até que haja espaço livre suficiente</translation>
 <translation id="4835622243021053389">Ativar autenticação NTLMv2.</translation>
+<translation id="4856471929724652373">Informar detalhes sobre a atualização do SO, por exemplo, o status da atualização, a versão da plataforma, a última verificação de atualização e a última reinicialização.
+
+      Se a política for definida como falsa ou se não for definida, os detalhes sobre atualização do SO não serão informados. Se for definida como verdadeira, os detalhes sobre atualização do SO serão informados.</translation>
 <translation id="4858735034935305895">Permitir modo de tela cheia</translation>
 <translation id="4861767323695239729">Configurar os métodos de entrada permitidos em uma sessão de usuário</translation>
 <translation id="487460824085252184">Migrar automaticamente, sem autorização do usuário.</translation>
@@ -3138,6 +3164,7 @@
 <translation id="6689792153960219308">Informar status de hardware</translation>
 <translation id="6698632841807204978">Ativar impressão monocromática</translation>
 <translation id="6699880231565102694">Ativar autenticação de dois fatores para hosts de acesso remoto</translation>
+<translation id="670597451099978576">Conceder automaticamente permissão a esses sites para se conectarem a dispositivos USB com determinados IDs de produto e de fornecedor na tela de login.</translation>
 <translation id="6720080634516505446">O <ph name="PRODUCT_NAME" /> proporciona a atualização e a instalação seguras de extensões. No entanto, o conteúdo de algumas extensões hospedadas fora da Chrome Web Store pode ser protegido apenas por algoritmos de hash ou de assinatura inseguros, como SHA1. Quando essa política está desativada, instalações novas e atualizações dessas extensões não são permitidas pelo Chrome (até que os desenvolvedores da extensão a corrijam com algoritmos mais fortes). Quando essa política está ativada, as instalações e atualizações são permitidas.
 
           Se a política não for definida, ela se comportará como ativada por padrão.
@@ -3702,6 +3729,21 @@
       Quando esta política é definida, o código de acesso dos pais pode ser verificado no dispositivo da criança.
       Quando esta política não é definida, não é possível verificar o código de acesso dos pais no dispositivo da criança.</translation>
 <translation id="7625444193696794922">Especifica o canal de liberação ao qual este dispositivo deve ser vinculado.</translation>
+<translation id="7625498350540361483">
+      Se a política for definida como verdadeira, o <ph name="PRODUCT_NAME" /> poderá coletar logs de eventos WebRTC em serviços do Google (por exemplo, no Google Meet) e fazer upload desses registros no Google.
+
+      Se a política for definida como falsa, o <ph name="PRODUCT_NAME" /> não poderá coletar esses registros nem fazer upload deles.
+
+      Se a política não for definida, até a versão M76, o <ph name="PRODUCT_NAME" /> não poderá coletar esses registros nem fazer upload deles.
+
+      Se a política não for definida, a partir da versão M77, o <ph name="PRODUCT_NAME" /> poderá coletar esses registros e fazer upload deles por padrão se o perfil do navegador for considerado gerenciado, isto é, se o perfil receber políticas em nível de nuvem ou de máquina e não for um perfil filho, temporário, de login ou de navegação anônima.
+
+      Esses registros contêm informações de diagnóstico que são úteis durante a depuração de problemas com chamadas de áudio ou videochamadas no Chrome, como o horário e o tamanho de pacotes RTP enviados e recebidos, feedback sobre congestionamento na rede e metadados sobre o tempo e a qualidade de frames de áudio e vídeo. Esses registros não apresentam o conteúdo das chamadas de áudio ou videochamadas.
+
+      Essa coleta de dados feita pelo Chrome só pode ser acionada por serviços da Web do Google, como o Google Hangouts ou o Google Meet.
+
+      Por meio de um código de sessão, o Google pode associar esses registros a outros coletados pelo próprio serviço do Google. Isso é feito para facilitar a depuração.
+      </translation>
 <translation id="7632724434767231364">Nome da biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Configura a localidade do aplicativo em <ph name="PRODUCT_NAME" /> e impede que os usuários a alterem. Se ativar esta configuração, <ph name="PRODUCT_NAME" /> utilizará a localidade especificada. Se a localidade configurada não for compatível, "pt-BR" será utilizada. Se esta configuração for desativada ou não for configurada, <ph name="PRODUCT_NAME" /> utilizará a localidade preferida especificada pelo usuário (se configurada), a localidade do sistema ou a localidade padrão "pt-BR".</translation>
 <translation id="7641363659597330616">Configura os tipos de download que o <ph name="PRODUCT_NAME" /> bloqueará completamente, sem permitir que os usuários modifiquem a decisão de segurança.
@@ -4225,6 +4267,11 @@
       https://support.google.com/a/answer/1668854.
 
       Os usuários não poderão alterar ou modificar esta configuração.</translation>
+<translation id="8625234016727663537">Permite definir uma lista de URLs que especificam quais sites receberão permissão automaticamente para acessar um dispositivo USB com determinados IDs de produto e de fornecedor na tela de login. Cada item da lista precisa conter os dispositivos e URLs para que a política seja válida. Cada item dos dispositivos pode conter um campo de ID de fornecedor e ID de produto. Os IDs omitidos são tratados como um caractere curinga com uma exceção, e isso impede a especificação de um ID de produto sem também especificar um ID de fornecedor. Caso contrário, a política não será válida e será ignorada.
+
+        O modelo de permissão USB usa o URL do site solicitante ("URL solicitante") e o URL do site de frame de nível superior ("URL de incorporação") para conceder permissão ao URL solicitante para acessar o dispositivo USB. O URL solicitante pode ser diferente do URL de incorporação quando o site solicitante está carregado em um iframe. Portanto, o campo "URLs" pode conter até duas strings de URL delimitadas por uma vírgula para especificar os URLs solicitante e de incorporação, respectivamente. Se apenas um URL for especificado, o acesso aos dispositivos USB correspondentes será concedido quando o URL do site solicitante coincidir com esse URL independentemente do status de incorporação. Os URLs contidos em "URLs" precisam ser válidos. Caso contrário, a política será ignorada.
+
+        Se a política não for definida, o valor padrão global será usado para todos os sites (sem acesso automático).</translation>
 <translation id="8631434304112909927">até a versão <ph name="UNTIL_VERSION" /></translation>
 <translation id="8649763579836720255">Os dispositivos Chrome OS podem usar atestado remoto (acesso confirmado) para receber um certificado emitido pelo Chrome OS CA que declare que o dispositivo é qualificado para reproduzir conteúdo protegido. Este processo envolve o envio de informações de endosso de hardware para o Chrome OS CA que identifiquem com exclusividade o dispositivo.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index e313739..44c1142 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -98,6 +98,7 @@
       Nếu bạn không đặt chính sách này, thì GPO đã lưu vào bộ nhớ đệm có thể được sử dụng lại trong tối đa 25 giờ.
 
       Nếu đặt chính sách thành 0, thì tùy chọn lưu GPO vào bộ nhớ đệm sẽ bị tắt. Lưu ý rằng điều này sẽ làm tăng tải của máy chủ vì GPO được tải lại xuống mỗi lần tìm nạp chính sách, ngay cả khi chúng không thay đổi.</translation>
+<translation id="1111470455889178048">Gửi tệp người dùng đã tải lên và tải xuống để quét</translation>
 <translation id="1117462881884985156"><ph name="PRODUCT_NAME" /> sẽ bỏ qua mọi proxy của danh sách máy chủ được cung cấp ở đây.
 
           Chính sách này chỉ có hiệu lực nếu bạn đã chọn các tùy chọn cài đặt proxy thủ công tại phần 'Chọn cách chỉ định cài đặt máy chủ proxy' và nếu bạn chưa chỉ định chính sách <ph name="PROXY_SETTINGS_POLICY_NAME" />.
@@ -403,6 +404,7 @@
       phù hợp, quyền truy cập sẽ tự động bị từ chối.  Các mẫu ký tự đại diện không được phép.</translation>
 <translation id="1634989431648355062">Cho phép plugin <ph name="FLASH_PLUGIN_NAME" /> trên các trang web này</translation>
 <translation id="1645793986494086629">Lược đồ:</translation>
+<translation id="1648816843164517573">Danh sách các tên sẽ được miễn kiểm tra chính sách Bảo mật truyền tải nghiêm ngặt HTTP (HSTS)</translation>
 <translation id="1653229475925941921">Nếu bạn đặt chính sách này, chính sách sẽ kiểm soát loại kính lúp được bật. Đặt chính sách thành ''None'' sẽ tắt kính lúp.
 
           Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hay ghi đè chính sách.
@@ -902,6 +904,7 @@
 <translation id="254653220329944566">Bật tính năng báo cáo đám mây của <ph name="PRODUCT_NAME" /></translation>
 <translation id="2548572254685798999">Báo cáo thông tin Duyệt web an toàn</translation>
 <translation id="2550593661567988768">Chỉ in một mặt</translation>
+<translation id="2551520365302988324">Gửi tệp người dùng đã tải lên để quét</translation>
 <translation id="2552966063069741410">Múi giờ</translation>
 <translation id="2562339630163277285">Chỉ định URL của công cụ tìm kiếm được sử dụng để cung cấp kết quả tức thì. URL phải chứa chuỗi <ph name="SEARCH_TERM_MARKER" />. Chuỗi này sẽ được thay thế tại thời điểm truy vấn bằng văn bản mà người dùng đã nhập từ trước tới nay.
 
@@ -982,6 +985,7 @@
           Chính sách này là tùy chọn. Nếu không thiết lập, mặc định được sử dụng sẽ là UTF-8.
 
           Chính sách này chỉ được áp dụng nếu chính sách 'DefaultSearchProviderEnabled' được bật.</translation>
+<translation id="2679827548357140943">Cần phải kiểm tra danh sách miền của nội dung đã tải lên để xem có chứa phần mềm độc hại hay không</translation>
 <translation id="268577405881275241">Bật tính năng proxy nén dữ liệu</translation>
 <translation id="2693108589792503178">Định cấu hình URL thay đổi mật khẩu.</translation>
 <translation id="2694143893026486692">Đã bật tùy chọn phóng to ở vị trí cố định</translation>
@@ -1359,6 +1363,10 @@
 <translation id="332771718998993005">Xác định tên được quảng cáo là đích <ph name="PRODUCT_NAME" />.
 
           Nếu bạn đặt chính sách này thành một chuỗi không phải là chuỗi trống, thì chuỗi đó sẽ được sử dụng làm tên của đích <ph name="PRODUCT_NAME" />. Nếu không, tên đích sẽ là tên thiết bị. Nếu bạn không đặt chính sách này, thì tên đích sẽ là tên thiết bị và chủ sở hữu thiết bị (hoặc người dùng từ miền quản lý thiết bị) sẽ được phép thay đổi tên đó. Tên có độ dài tối đa là 24 ký tự.</translation>
+<translation id="3331950121151548952">Cần phải kiểm tra danh sách miền của nội dung đã tải lên để xem có chứa phần mềm độc hại hay không.  Chỉ dùng chính sách này nếu bạn đặt <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" /> thành giá trị cho phép hoặc thực thi quá trình kiểm tra phần mềm độc hại đối với nội dung đã tải lên.
+
+      Nếu bạn không đặt hoặc đặt chính sách này thành danh sách miền trống, thì sẽ không cần kiểm tra nội dung đã tải lên xem có chứa phần mềm độc hại hay không.
+      </translation>
 <translation id="3335468714959531450">Cho phép bạn đặt danh sách các mẫu url chỉ định những trang web được phép đặt cookie.
 
           Nếu không đặt chính sách này, thì giá trị mặc định chung sẽ được sử dụng cho tất cả các trang web từ chính sách 'DefaultCookiesSetting', nếu chính sách đó được đặt, hoặc từ cấu hình cá nhân của người dùng.
@@ -1428,6 +1436,15 @@
           Nếu chính sách này bị đặt thành Sai hoặc không được đặt, độ trễ quản lý nguồn và giới hạn thời lượng phiên sẽ bắt đầu chạy ngay lập tức khi bắt đầu phiên.</translation>
 <translation id="3478024346823118645">Xóa dữ liệu người dùng khi đăng xuất</translation>
 <translation id="3480961938508521469">Sạc đầy pin ở tốc độ tiêu chuẩn.</translation>
+<translation id="3483729306380590354">Đặt mức phần trăm bắt đầu sạc pin tùy chỉnh.
+
+          Pin bắt đầu sạc khi lượng pin còn lại thấp hơn giá trị bắt đầu sạc pin tùy chỉnh này.
+
+          <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> phải thấp hơn <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> tối thiểu là 5%.
+
+          Chỉ dùng chính sách này nếu bạn đặt <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> thành <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />.
+
+          Nếu bạn không định cấu hình hoặc không đặt chính sách này, thì chế độ sạc pin <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> sẽ được áp dụng.</translation>
 <translation id="348495353354674884">Bật bàn phím ảo</translation>
 <translation id="3487623755010328395">
         Nếu bạn đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ tìm cách tự đăng ký và áp dụng chính sách đám mây được liên kết cho tất cả hồ sơ.
@@ -1875,6 +1892,15 @@
           Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi hay ghi đè chính sách.
 
           Nếu bạn không đặt chính sách này, thì ban đầu, tính năng tự động nhấp sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
+<translation id="4215197846797661927">Đặt cấu hình ngày cho chế độ sạc pin nâng cao.
+
+          Chỉ dùng chính sách này nếu bạn đặt <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> thành true.
+
+          Nếu bạn không định cấu hình hoặc không đặt chính sách này, thì chế độ sạc pin nâng cao sẽ luôn tắt.
+
+          Lưu ý: <ph name="CHARGE_START_TIME_FIELD_NAME" /> phải nhỏ hơn <ph name="CHARGE_END_TIME_FIELD_NAME" />.
+
+          Lưu ý: các giá trị được phép của trường <ph name="MINUTE_FIELD_NAME" /> trong <ph name="CHARGE_START_TIME_FIELD_NAME" /> và <ph name="CHARGE_END_TIME_FIELD_NAME" /> là 0, 15, 30, 45.</translation>
 <translation id="4224610387358583899">Độ trễ khóa màn hình</translation>
 <translation id="423797045246308574">Cho phép bạn thiết lập danh sách các mẫu URL chỉ định những trang web không được phép sử dụng tạo khóa. Nếu một mẫu URL nằm trong 'KeygenAllowedForUrls', chính sách này sẽ ghi đè các ngoại lệ này.
 
@@ -1940,6 +1966,17 @@
           Phải chỉ định giá trị của chính sách bằng mili giây. Các giá trị được giới hạn ở mức nhỏ hơn hoặc bằng thời gian chờ khi ở chế độ không sử dụng.
 
           Thông báo cảnh báo chỉ hiển thị nếu hành động ở chế độ không sử dụng là hành động đăng xuất hoặc tắt nguồn.</translation>
+<translation id="4342827592971649626">Chính sách này kiểm soát quá trình tính năng Duyệt web an toàn quét sâu các tệp người dùng đã tải xuống. Nếu bạn không đặt hoặc đặt chính sách này thành mặc định là "Không quét tệp", thì tính năng Duyệt web an toàn sẽ không quét các tệp người dùng đã tải xuống.
+
+      Nếu bạn đặt chính sách này thành "Cấm quét tệp", thì người dùng sẽ không được phép quét các tệp họ đã tải xuống. Tùy chọn này khác với tùy chọn mặc định, vì một số người dùng (chẳng hạn như người dùng Chương trình Bảo vệ nâng cao) có thể gửi các tệp họ đã tải xuống để quét. Tùy chọn cài đặt này sẽ ngăn những người dùng này quét tệp.
+
+      Nếu bạn đặt chính sách này thành "Gửi tệp người dùng đã tải xuống để quét", thì các tệp người dùng đã tải xuống sẽ được gửi qua mạng đến tính năng Duyệt web an toàn để quét tìm phần mềm độc hại.
+
+      Nếu bạn đặt chính sách này thành "Gửi tệp người dùng đã tải lên để quét", thì các tệp người dùng đã tải lên sẽ được gửi qua mạng đến tính năng Duyệt web an toàn để quét tìm phần mềm độc hại.
+
+      Nếu bạn đặt chính sách này thành "Gửi tệp người dùng đã tải lên và tải xuống để quét", thì sản phẩm sẽ hoạt động theo các quy tắc nêu trong phần "Gửi tệp người dùng đã tải lên để quét" và "Gửi tệp người dùng đã tải xuống để quét".
+
+      Vui lòng xem chính sách <ph name="DELAY_DELIVER_UNTIL_VERDICT_POLICY_NAME" /> và <ph name="UNSAFE_EVENTS_REPORTING_ENABLED" /> để biết thông tin chi tiết về cách kết quả quét xuất hiện đối với người dùng và quản trị viên.</translation>
 <translation id="4344356660952451291">Cần phải kiểm tra danh sách miền của nội dung tải xuống xem có tuân thủ hay không</translation>
 <translation id="4346674324214534449">Cho phép bạn thiết lập xem có chặn quảng cáo trên các trang web chứa quảng cáo xâm nhập hay không.
 
@@ -2529,6 +2566,16 @@
       Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hoặc ghi đè chính sách.
 
       Nếu bạn không đặt chính sách này, thì người dùng có thể chọn một hình ảnh để hiển thị trên màn hình và trên nền màn hình đăng nhập.</translation>
+<translation id="5437214086679373363">Kiểm soát xem người dùng có được phép tải lên hoặc tải xuống các tệp được bảo vệ bằng mật khẩu hay không khi bắt buộc phải thực hiện quá trình quét.  Hạn chế này chỉ áp dụng với các tệp cần quét theo yêu cầu của <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> và các chính sách kiểm soát danh sách miền được phép thực hiện quá trình kiểm tra.
+
+      Nếu bạn đặt chính sách này thành "None", thì <ph name="PRODUCT_NAME" /> sẽ chặn người dùng tải lên hoặc tải xuống các tệp được bảo vệ bằng mật khẩu.
+
+      Nếu bạn đặt chính sách này thành "Cho phép tải tệp xuống", thì <ph name="PRODUCT_NAME" /> sẽ cho phép người dùng tải các tệp được bảo vệ bằng mật khẩu xuống.
+
+      Nếu bạn đặt chính sách này thành "Cho phép tải tệp lên", thì <ph name="PRODUCT_NAME" /> sẽ cho phép người dùng tải các tệp được bảo vệ bằng mật khẩu lên.
+
+      Nếu bạn không đặt hoặc đặt chính sách này thành "Cho phép tải tệp lên và tải tệp xuống", thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần "Cho phép tải tệp xuống" và "Cho phép tải tệp lên".
+      </translation>
 <translation id="5437733496511628148">Việc bật tùy chọn cài đặt này sẽ ngăn các phần tử trang web không thuộc miền trong thanh địa chỉ của trình duyệt thiết lập cookie.
 
       Việc tắt tùy chọn cài đặt này sẽ cho phép các phần tử trang web không thuộc miền trong thanh địa chỉ của trình duyệt thiết lập cookie và ngăn người dùng thay đổi tùy chọn cài đặt này.
@@ -3451,13 +3498,32 @@
 
       Để biết thêm thông tin về chính sách <ph name="IEEM_SITELIST_POLICY" /> của Internet Explorer, hãy truy cập vào trang web: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
 <translation id="7132877481099023201">Các URL sẽ được cấp quyền truy cập thiết bị quay video mà không cần phải hiển thị lời nhắc</translation>
+<translation id="713712866686796666">Đặt cấu hình ngày cho chế độ chuyển đổi điện năng cao điểm.
+
+          Chỉ dùng chính sách này nếu bạn đặt <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> thành true.
+
+          Nếu bạn không định cấu hình hoặc không đặt chính sách này, thì chế độ chuyển đổi điện năng cao điểm sẽ luôn tắt.
+
+          Lưu ý: các giá trị được phép của trường <ph name="MINUTE_FIELD_NAME" /> trong <ph name="START_TIME_FIELD_NAME" />, <ph name="END_TIME_FIELD_NAME" /> và <ph name="CHARGE_START_TIME_FIELD_NAME" /> là 0, 15, 30, 45.</translation>
 <translation id="7138678301420049075">Khác</translation>
+<translation id="7139809614375682935">Đặt mức phần trăm ngừng sạc pin tùy chỉnh.
+
+          Pin sẽ ngừng sạc khi đạt đến giá trị ngừng sạc pin tùy chỉnh.
+
+          <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> phải thấp hơn <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" /> tối thiểu là 5%.
+
+          Chỉ dùng chính sách này nếu bạn đặt <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME" /> thành <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME" />.
+
+          Nếu bạn không định cấu hình hoặc không đặt chính sách này, thì chế độ sạc pin <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME" /> sẽ được áp dụng.</translation>
 <translation id="7140629953254369759">Hướng dẫn <ph name="PRODUCT_OS_NAME" /> sử dụng cấu hình bộ lập lịch tác vụ dựa trên tên được chỉ định.
 
       Bạn có thể đặt chính sách này là "conservative" (duy trì) và "performance" (hiệu suất), tương ứng với cấu hình thiên về sự ổn định và cấu hình thiên về hiệu suất tối đa.
 
       Nếu bạn không đặt chính sách này, thì người dùng có thể tùy ý lựa chọn.</translation>
 <translation id="7145335384492396213">Chế độ in mã PIN mặc định</translation>
+<translation id="7149042336307555519"> Các loại kết nối được phép dùng để cập nhật hệ điều hành. Quá trình cập nhật hệ điều hành có thể khiến kết nối bị quá tải do kích thước liên quan, đồng thời có thể phát sinh thêm chi phí. Do đó, tùy chọn cập nhật hệ điều hành sẽ bị tắt theo mặc định đối với các loại kết nối được coi là tốn chi phí (hiện chỉ có "cellular").
+
+      Các mã nhận dạng loại kết nối được ghi nhận là <ph name="CONNECTION_TYPE_ETHERNET_NAME" />, <ph name="CONNECTION_TYPE_WIFI_NAME" /> và <ph name="CONNECTION_TYPE_CELLULAR_NAME" />.</translation>
 <translation id="7152605873936173525">Kiểm soát chế độ trình phân giải DNS qua HTTPS. Xin lưu ý rằng chính sách này sẽ chỉ đặt chế độ mặc định cho mỗi truy vấn. Chế độ này có thể bị ghi đè đối với các loại truy vấn đặc biệt, chẳng hạn như yêu cầu phân giải tên máy chủ DNS qua HTTPS.
 
       Chế độ <ph name="SECURE_DNS_MODE_OFF" /> sẽ tắt giao thức DNS qua HTTPS.
@@ -3490,6 +3556,17 @@
           Nếu bạn đặt chính sách này thành false, thì các yêu cầu khóa chế độ thức của màn hình sẽ hạ cấp xuống thành các yêu cầu khóa chế độ thức của hệ thống.</translation>
 <translation id="7177857088692019405">Mở khóa nhanh</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
+<translation id="7187447094921703950">Bật chính sách quản lý điện năng cho chế độ chuyển đổi điện năng cao điểm.
+
+          Chuyển đổi cao điểm là một chính sách tiết kiệm điện năng giúp giảm thiểu việc sử dụng dòng điện xoay chiều trong những thời điểm có mức sử dụng cao điểm trong ngày. Bạn có thể đặt thời gian bắt đầu và thời gian kết thúc để chạy trong chế độ Chuyển đổi điện năng cao điểm cho từng ngày trong tuần. Trong các khoảng thời gian này, hệ thống sẽ chạy bằng pin ngay cả khi được kết nối với dòng điện xoay chiều, miễn là pin ở trên ngưỡng được chỉ định. Sau thời gian kết thúc được chỉ định, hệ thống sẽ chạy bằng dòng điện xoay chiều nếu được kết nối nhưng sẽ không sạc pin. Hệ thống sẽ hoạt động bình thường trở lại bằng dòng điện xoay chiều và sạc lại pin sau Thời gian bắt đầu sạc được chỉ định.
+
+          Nếu bạn đặt chính sách này thành true và đặt <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_NAME" />, <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_NAME" />, thì chế độ chuyển đổi điện năng cao điểm sẽ luôn bật (với điều kiện thiết bị phải hỗ trợ).
+
+          Nếu bạn đặt chính sách này thành false, thì chế độ chuyển đổi điện năng cao điểm sẽ luôn tắt.
+
+          Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hay ghi đè chính sách.
+
+          Nếu bạn không đặt chính sách này, thì chế độ chuyển đổi điện năng cao điểm sẽ tắt ngay từ đầu và người dùng không thể bật được.</translation>
 <translation id="718956142899066210">Các loại kết nối được cho phép để cập nhật</translation>
 <translation id="7190286937411178540">Bật tính năng hỗ trợ tiếp cận về làm nổi bật tiêu điểm bằng bàn phím</translation>
 <translation id="7194407337890404814">Tên nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
@@ -4119,6 +4196,17 @@
 
           Nếu bạn không đặt chính sách này, tùy chọn cài đặt nói trên sẽ được bật.</translation>
 <translation id="8382184662529825177">Cho phép sử dụng chứng thực từ xa để bảo vệ nội dung cho thiết bị</translation>
+<translation id="8382693763260501307">Bật chính sách quản lý nguồn của chế độ sạc pin nâng cao.
+
+          Chế độ sạc pin nâng cao cho phép người dùng tăng tối đa độ bền của pin. Ở chế độ Sạc nâng cao, hệ thống sẽ sử dụng thuật toán sạc tiêu chuẩn và các kỹ thuật khác ngoài giờ làm việc để tăng tối đa độ bền của pin. Trong giờ làm việc, chế độ sạc nhanh được sử dụng. Chế độ sạc nhanh này cho phép sạc pin nhanh hơn. Nhờ đó, pin sẽ sạc đầy nhanh hơn. Mỗi ngày, thời gian hệ thống được dùng nhiều nhất sẽ được chỉ định bằng thời gian bắt đầu và lượng thời gian.
+
+          Nếu bạn đặt chính sách này thành true và đặt <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_NAME" />, thì chế độ sạc pin nâng cao sẽ luôn bật (với điều kiện thiết bị phải hỗ trợ).
+
+          Nếu bạn đặt chính sách này thành false, thì chế độ sạc pin nâng cao sẽ luôn tắt.
+
+          Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hay ghi đè chính sách.
+
+          Nếu bạn không đặt chính sách này, thì chế độ sạc pin nâng cao sẽ tắt và người dùng không thể bật được.</translation>
 <translation id="838870586332499308">Bật chuyển vùng dữ liệu</translation>
 <translation id="8390049129576938611">Tắt trình xem PDF nội bộ trong <ph name="PRODUCT_NAME" />. Thay vào đó, thiết bị sẽ coi các tệp PDF là nội dung tải xuống và cho phép người dùng mở các tệp PDF này bằng ứng dụng mặc định.
 
@@ -4329,9 +4417,15 @@
       Nếu bạn định cấu hình chính sách này, thì nhóm ứng dụng sẽ được cố định và người dùng không thể thay đổi.
 
       Nếu bạn không đặt chính sách này, thì người dùng có thể thay đổi danh sách các ứng dụng được ghim trong trình chạy.</translation>
+<translation id="8779504970846195767">Đặt ngưỡng pin cho chế độ chuyển đổi điện năng cao điểm theo phần trăm.
+
+          Chỉ dùng chính sách này nếu bạn đặt <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_NAME" /> thành true.
+
+          Nếu bạn không định cấu hình hoặc không đặt chính sách này, thì chế độ chuyển đổi điện năng cao điểm sẽ luôn tắt.</translation>
 <translation id="8798099450830957504">Mặc định</translation>
 <translation id="8800453707696044281">Đặt mức phần trăm ngừng sạc pin tùy chỉnh</translation>
 <translation id="8801680448782904838">Thông báo cho người dùng biết họ cần hoặc bắt buộc phải chạy lại trình duyệt hoặc khởi động lại thiết bị</translation>
+<translation id="8802816494059596691">Các tên máy chủ đã chỉ định trong danh sách này sẽ được miễn kiểm tra chính sách HSTS (có thể nâng cấp yêu cầu từ http lên https). Chính sách này chỉ cho phép tên máy chủ một nhãn. Cần phải chuẩn hóa tên máy chủ: mọi IDN phải được chuyển sang định dạng nhãn A và tất cả chữ cái ASCII phải là chữ thường. Chính sách này chỉ áp dụng với các tên máy chủ cụ thể đã chỉ định, chứ không áp dụng với các miền con của tên máy chủ đã chỉ định.</translation>
 <translation id="8818173863808665831">Báo cáo vị trí địa lý của thiết bị.
 
       Nếu chính sách này không được đặt hoặc được đặt thành false, vị trí sẽ không được báo cáo.</translation>
@@ -4494,6 +4588,17 @@
       Nếu bạn đặt giá trị của chính sách thành một mã thông báo tương ứng với Bản dựng Quick Fix, thì thiết bị sẽ được cập nhật lên Bản dựng Quick Fix tương ứng nếu không có chính sách nào khác chặn quá trình cập nhật này.
 
       Nếu bạn không đặt chính sách này hoặc giá trị của chính sách không tương ứng với Bản dựng Quick Fix, thì thiết bị sẽ không được cập nhật lên Bản dựng Quick Fix. Nếu thiết bị đang chạy Bản dựng Quick Fix và bạn không đặt chính sách này nữa hoặc giá trị của chính sách không còn tương ứng với Bản dựng Quick Fix, thì thiết bị sẽ được cập nhật lên bản dựng thông thường nếu không có chính sách nào khác chặn quá trình cập nhật này.</translation>
+<translation id="9053158112041032237">Chỉ định chính sách quản lý nguồn của chế độ sạc pin.
+
+          Chủ động kiểm soát việc sạc pin để giảm thiểu tình trạng hao mòn pin do ứng suất pin, từ đó tăng tuổi thọ pin.
+
+          Nếu chọn chế độ sạc pin tùy chỉnh, thì bạn phải chỉ định <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_NAME" /> và <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_NAME" />.
+
+          Nếu bạn đặt chính sách này, thì chế độ sạc pin sẽ được áp dụng (với điều kiện thiết bị phải hỗ trợ).
+
+          Nếu bạn không đặt chính sách này và chính sách được thiết bị hỗ trợ, thì chế độ sạc pin tiêu chuẩn sẽ được áp dụng và người dùng không thể thay đổi được.
+
+          Lưu ý: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> (nếu đã được chỉ định) sẽ ghi đè chính sách này.</translation>
 <translation id="9054012305936267950">Chính sách này kiểm soát hành vi đăng nhập của trình duyệt. Chính sách cho phép bạn chỉ định xem người dùng có thể đăng nhập vào <ph name="PRODUCT_NAME" /> bằng tài khoản của họ và sử dụng các dịch vụ liên quan đến tài khoản như tính năng đồng bộ hóa trên Chrome hay không.
 
       Nếu bạn đặt chính sách này thành "Vô hiệu hóa đăng nhập vào trình duyệt", thì người dùng sẽ không thể đăng nhập vào trình duyệt và sử dụng các dịch vụ dựa trên tài khoản. Trong trường hợp này, các tính năng ở cấp trình duyệt như tính năng đồng bộ hóa trên Chrome sẽ không sử dụng được và không có sẵn. Nếu người dùng đã đăng nhập và bạn đặt chính sách này thành "Tắt", thì họ sẽ bị đăng xuất khi chạy Chrome vào lần sau. Tuy nhiên, các dữ liệu hồ sơ trên máy của họ như dấu trang, mật khẩu, v.v. sẽ vẫn giữ nguyên. Người dùng vẫn có thể đăng nhập và sử dụng các dịch vụ web của Google như Gmail.
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index fa6f27bf..6dfaa36 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1155,14 +1155,7 @@
 }
 
 bool PrintRenderFrameHelper::OnMessageReceived(const IPC::Message& message) {
-  // The class is not designed to handle recursive messages. This is not
-  // expected during regular flow. However, during rendering of content for
-  // printing, lower level code may run nested run loop. E.g. PDF may has
-  // script to show message box http://crbug.com/502562. In that moment browser
-  // may receive updated printer capabilities and decide to restart print
-  // preview generation. When this happened message handling function may
-  // choose to ignore message or safely crash process.
-  ++ipc_nesting_level_;
+  IPCReceived();
 
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(PrintRenderFrameHelper, message)
@@ -1179,9 +1172,7 @@
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
 
-  --ipc_nesting_level_;
-  if (ipc_nesting_level_ == 0 && render_frame_gone_)
-    base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
+  IPCProcessed();
   return handled;
 }
 
@@ -1202,6 +1193,8 @@
     mojom::PrintRendererAssociatedPtrInfo print_renderer,
     bool has_selection) {
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
+  IPCReceived();
+
   if (ipc_nesting_level_ > 1)
     return;
 
@@ -1221,6 +1214,8 @@
   RequestPrintPreview(has_selection
                           ? PRINT_PREVIEW_USER_INITIATED_SELECTION
                           : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME);
+
+  IPCProcessed();
 #endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
 }
 
@@ -1910,6 +1905,23 @@
   return printed_pages;
 }
 
+void PrintRenderFrameHelper::IPCReceived() {
+  // The class is not designed to handle recursive messages. This is not
+  // expected during regular flow. However, during rendering of content for
+  // printing, lower level code may run a nested run loop. E.g. PDF may have a
+  // script to show message box (http://crbug.com/502562). In that moment, the
+  // browser may receive updated printer capabilities and decide to restart
+  // print preview generation. When this happens, message handling functions may
+  // choose to ignore messages or safely crash the process.
+  ++ipc_nesting_level_;
+}
+
+void PrintRenderFrameHelper::IPCProcessed() {
+  --ipc_nesting_level_;
+  if (ipc_nesting_level_ == 0 && render_frame_gone_)
+    base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
+}
+
 bool PrintRenderFrameHelper::InitPrintSettings(bool fit_to_paper_size) {
   PrintMsg_PrintPages_Params settings;
   Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h
index a4f11e5..00b3e464 100644
--- a/components/printing/renderer/print_render_frame_helper.h
+++ b/components/printing/renderer/print_render_frame_helper.h
@@ -329,6 +329,12 @@
       const MetafileSkia& metafile,
       PrintHostMsg_DidPrintContent_Params* params);
 
+  // Increments the IPC nesting level when an IPC message is received.
+  void IPCReceived();
+
+  // Decrements the IPC nesting level once an IPC message has been processed.
+  void IPCProcessed();
+
   // Helper method to get page layout in points and fit to page if needed.
   static void ComputePageLayoutInPointsForCss(
       blink::WebLocalFrame* frame,
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 5d523219..a996160 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -1078,7 +1078,7 @@
 <translation id="6738516213925468394">Dine data blev krypteret med din <ph name="BEGIN_LINK" />adgangssætning til synkronisering<ph name="END_LINK" /> <ph name="TIME" />. Indtast adgangssætningen for at starte synkroniseringen.</translation>
 <translation id="674375294223700098">Ukendt fejl i servercertifikatet.</translation>
 <translation id="6744009308914054259">Mens du venter på en forbindelse, kan du gå til Downloads for at læse artikler offline.</translation>
-<translation id="6747611005629681221">Advarsel! Udfasede funktioner forude.</translation>
+<translation id="6747611005629681221">Advarsel! Funktionerne her vil blive udfaset.</translation>
 <translation id="6753269504797312559">Politikkens værdi</translation>
 <translation id="6757797048963528358">Din enhed gik i dvale.</translation>
 <translation id="6768213884286397650">Hagaki (Postcard)</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 3977684..dc00b44 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -71,6 +71,7 @@
 <translation id="1292701964462482250">"Pinipigilan ng software sa iyong computer na makakonekta nang ligtas ang Chrome sa web" (mga Windows computer lang)</translation>
 <translation id="1294154142200295408">Mga variation ng command-line</translation>
 <translation id="129553762522093515">Kamakailang isinara</translation>
+<translation id="1298536327547837046">Pag-scan ng Malware</translation>
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />Subukang i-clear ang iyong cookies<ph name="END_LINK" /></translation>
 <translation id="1307966114820526988">Mga Hindi na Ginagamit na Feature</translation>
 <translation id="1320233736580025032">Prc1 (Envelope)</translation>
@@ -429,6 +430,7 @@
 <translation id="320323717674993345">Kanselahin ang Pagbabayad</translation>
 <translation id="3207960819495026254">Naka-bookmark</translation>
 <translation id="3209034400446768650">Puwedeng maningil ang page</translation>
+<translation id="3215092763954878852">Hindi magamit ang WebAuthn</translation>
 <translation id="3225919329040284222">Nagpakita ang server ng certificate na hindi tumutugma sa mga built-in na inaasahan. Ang mga inaasahang ito ay isinama para sa ilang partikular na website na may mataas na antas ng seguridad upang maprotektahan ka.</translation>
 <translation id="3226128629678568754">Pindutin ang button na i-reload upang isumiteng muli ang data na kailangan upang ma-load ang pahina.</translation>
 <translation id="3227137524299004712">Mikropono</translation>
@@ -565,6 +567,7 @@
 <translation id="3964661563329879394">{COUNT,plural, =0{Wala}=1{Mula sa 1 site }one{Mula sa # site }other{Mula sa # na site }}</translation>
 <translation id="397105322502079400">Kinakalkula...</translation>
 <translation id="3973234410852337861">Naka-block ang <ph name="HOST_NAME" /></translation>
+<translation id="3981540111851280311">Na-enable ng <ph name="ENROLLMENT_DOMAIN" /> ang Proteksyon Laban sa Banta ng Chrome Enterprise sa iyong browser. May access ang Proteksyon Laban sa Banta ng Chrome Enterprise sa ilan sa iyong data.</translation>
 <translation id="3987940399970879459">Wala pang 1 MB</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 web page ang malapit}one{# web page ang malapit}other{# na web page ang malapit}}</translation>
 <translation id="4030383055268325496">&amp;I-undo ang pagdagdag</translation>
@@ -633,6 +636,7 @@
 <translation id="4277028893293644418">I-reset ang password</translation>
 <translation id="4279811152705618813">Ang iyong <ph name="DEVICE_TYPE" /> ay pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="428639260510061158">{NUM_CARDS,plural, =1{Na-save na ang card na ito sa iyong Google Account}one{Na-save na ang mga card na ito sa iyong Google Account}other{Na-save na ang mga card na ito sa iyong Google Account}}</translation>
+<translation id="428847186335018806">I-scan ang mga file na dina-download o ina-upload mo sa Chrome.</translation>
 <translation id="42981349822642051">Palawakin</translation>
 <translation id="4302965934281694568">Chou3 (Envelope)</translation>
 <translation id="4305817255990598646">Lumipat</translation>
@@ -671,6 +675,7 @@
 <translation id="4506176782989081258">Error sa pagpapatunay: <ph name="VALIDATION_ERROR" /></translation>
 <translation id="4506599922270137252">Makipag-ugnayan sa admin ng system</translation>
 <translation id="450710068430902550">Pagbabahagi sa Administrator</translation>
+<translation id="4508814173490746936">Hindi magamit ang Touch ID</translation>
 <translation id="4510487217173779431">Chou4 (Envelope)</translation>
 <translation id="4515275063822566619">Ang mga card at address ay mula sa Chrome at sa iyong Google Account (<ph name="ACCOUNT_EMAIL" />). Maaari mong pamahalaan ang mga ito sa <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation>
 <translation id="4517607026994743406">Comm-10 (Envelope)</translation>
@@ -766,6 +771,7 @@
 <translation id="5045550434625856497">Hindi wastong password</translation>
 <translation id="5056549851600133418">Mga artikulo para sa iyo</translation>
 <translation id="5068524481479508725">A10</translation>
+<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 ang ginagamit)}one{(# ang ginagamt)}other{(# ang ginagamit)}}</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Suriin ang proxy address<ph name="END_LINK" /></translation>
 <translation id="5087286274860437796">Hindi angkop ang certificate ng server sa oras na ito.</translation>
 <translation id="5087580092889165836">Magdagdag ng card</translation>
@@ -995,6 +1001,7 @@
 <translation id="6302269476990306341">Ihinihinto ang Google Assistant sa Chrome</translation>
 <translation id="6305205051461490394">Hindi makakonekta sa <ph name="URL" />.</translation>
 <translation id="6321917430147971392">Suriin ang iyong mga setting ng DNS</translation>
+<translation id="6322182122604171028">Hindi magamit ang Windows Hello</translation>
 <translation id="6328639280570009161">Subukang i-disable ang paghula ng network</translation>
 <translation id="6328784461820205019">"Hindi pribado ang iyong koneksyon" o "&lt;span class="error-code"&gt;NET::ERR_CERT_AUTHORITY_INVALID&lt;/span&gt;" o "&lt;span class="error-code"&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/span&gt;" o "&lt;span class="error-code"&gt;NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM&lt;/span&gt;" o "&lt;span class="error-code"&gt;ERR_CERT_SYMANTEC_LEGACY&lt;/span&gt;" o "SSL certificate error"</translation>
 <translation id="6328786501058569169">Mapanlinlang ang site na ito</translation>
@@ -1018,6 +1025,7 @@
 <translation id="6433490469411711332">I-edit ang impormasyon sa pakikipag-ugnayan</translation>
 <translation id="6433595998831338502">Tumangging kumonekta ang <ph name="HOST_NAME" />.</translation>
 <translation id="6434309073475700221">Itapon</translation>
+<translation id="6435221585574090192">Ibahagi ang data tungkol sa mga pangyayari sa seguridad na na-flag ng Proteksyon Laban sa Banta ng Chrome Enterprise sa iyong Administrator. Puwedeng kasama sa mga ito ang mga url ng page, pangalan ng file, at metadata ng file, username ng iyong device at username sa Chrome.</translation>
 <translation id="6440503408713884761">Binalewala</translation>
 <translation id="6446163441502663861">Kahu (Envelope)</translation>
 <translation id="6446608382365791566">Magdagdag ng higit pang impormasyon</translation>
@@ -1062,6 +1070,7 @@
 <translation id="6671697161687535275">Gusto mo bang alisin ang form para sa suhestyon sa Chromium?</translation>
 <translation id="6685834062052613830">Mag-sign out at kumpletuhin ang setup</translation>
 <translation id="6689271823431384964">Nag-aalok ang Chrome na i-save ang iyong mga card sa Google Account mo dahil naka-sign in ka. Puwede mong baguhin ang gawing ito sa mga setting. Mula sa iyong account ang pangalan ng cardholder.</translation>
+<translation id="6707256370811247129">I-scan ang mga content ng cache at mga file na ida-download o ia-upload mo sa Chrome.</translation>
 <translation id="6710213216561001401">Nakaraan</translation>
 <translation id="6710594484020273272">&lt;I-type ang termino para sa paghahanap&gt;</translation>
 <translation id="671076103358959139">Token sa Pag-enroll</translation>
@@ -1080,6 +1089,7 @@
 <translation id="681021252041861472">Kinakailangang Field</translation>
 <translation id="6810899417690483278">Customization ID</translation>
 <translation id="6825578344716086703">Tinangka mong abutin ang <ph name="DOMAIN" />, ngunit nagpakita ang server ng certificate na nilagdaan gamit ang isang mahinang signature algorithm (tulad ng SHA-1). Nangangahulugan ito na maaaring pineke ang mga panseguridad na kredensyal na ipinakita ng server, at ang server ay maaaring hindi ang server na inaasahan mo (maaaring nakikipag-ugnayan ka sa isang attacker).</translation>
+<translation id="6826370046007623921">Pag-iwas sa Pagkawala ng Data</translation>
 <translation id="6831043979455480757">Isalin</translation>
 <translation id="6839929833149231406">Lugar</translation>
 <translation id="6852204201400771460">I-reload ang app?</translation>
@@ -1226,6 +1236,7 @@
 <translation id="7542995811387359312">Hindi pinagana ang awtomatikong pagpuno ng credit card dahil ang form na ito ay hindi gumagamit ng secure na koneksyon.</translation>
 <translation id="7548892272833184391">Ayusin ang mga error sa koneksyon</translation>
 <translation id="7549584377607005141">Kinakailangan ng webpage na ito ng data na inilagay mo dati upang maipakita nang maayos. Maipapadala mong muli ang data na ito, ngunit kapag ginawa mo iyon, mauulit ang anumang pagkilos na isinagawa dati ng pahinang ito.</translation>
+<translation id="7550637293666041147">Username ng iyong device at username sa Chrome</translation>
 <translation id="7552846755917812628">Subukan ang mga sumusunod na tip:</translation>
 <translation id="7554791636758816595">Bagong Tab</translation>
 <translation id="7564049878696755256">Maaari kang mawalan ng access sa iyong account sa <ph name="ORG_NAME" /> o manakawan ng pagkakakilanlan. Inirerekomenda ng Chrome na palitan ang iyong password ngayon.</translation>
@@ -1240,6 +1251,7 @@
 <translation id="7610193165460212391">Wala sa sakop ang halaga <ph name="VALUE" />.</translation>
 <translation id="7613889955535752492">Exp: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="7615602087246926389">Mayroon ka nang data na na-encrypt gamit ang ibang bersyon ng iyong password ng Google Account. Pakilagay ito sa ibaba.</translation>
+<translation id="7625784245512586808">Proteksyon Laban sa Banta ng Chrome Enterprise</translation>
 <translation id="7633909222644580952">Date ng performance at mga ulat ng pag-crash</translation>
 <translation id="7637571805876720304">Gusto mo bang alisin ang credit card sa Chromium?</translation>
 <translation id="7638605456503525968">Mga serial port</translation>
@@ -1350,6 +1362,7 @@
 <translation id="8211406090763984747">Secure ang koneksyon</translation>
 <translation id="8218327578424803826">Itinakdang Lokasyon:</translation>
 <translation id="8220146938470311105">C7/C6 (Envelope)</translation>
+<translation id="8220639454292072926">Pag-uulat ng Enterprise</translation>
 <translation id="8225771182978767009">Pinili ng taong nag-set up ng computer na ito na i-block ang site na ito.</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8238581221633243064">Buksan ang page sa bagong Incognito tab</translation>
@@ -1432,6 +1445,7 @@
 <translation id="8740359287975076522">Hindi makita ang &lt;abbr id="dnsDefinition"&gt;DNS address&lt;/abbr&gt; ng <ph name="HOST_NAME" />. Dina-diagnose ang problema.</translation>
 <translation id="874846938927089722">Mga Tinatanggap na Credit at Prepaid Card</translation>
 <translation id="874918643257405732">I-bookmark ang tab na ito</translation>
+<translation id="8751426954251315517">Pakisubukang muli sa susunod</translation>
 <translation id="8759274551635299824">Nag-expire na ang card na ito</translation>
 <translation id="8761567432415473239">Ang Google Safe Browsing ay may <ph name="BEGIN_LINK" />natagpuang mga nakakasirang program<ph name="END_LINK" /> sa <ph name="SITE" /> kamakailan.</translation>
 <translation id="8763927697961133303">USB device</translation>
@@ -1496,6 +1510,7 @@
 <translation id="9080712759204168376">Buod ng Order</translation>
 <translation id="9089260154716455634">Patakaran sa Mga Off Hour:</translation>
 <translation id="9095388113577226029">Higit pang wika...</translation>
+<translation id="9098981495403789647">Na-enable ng iyong administrator ang Proteksyon Laban sa Banta ng Chrome Enterprise sa browser mo. May access ang Proteksyon Laban sa Banta ng Chrome Enterprise sa ilan sa iyong data.</translation>
 <translation id="9103872766612412690">Karaniwang gumagamit ang <ph name="SITE" /> ng pag-encrypt upang protektahan ang iyong impormasyon. Noong sinubukang kumonekta ng Chromium sa <ph name="SITE" /> sa pagkakataong ito, nagbalik ang website ng mga hindi pangkaraniwan at maling kredensyal. Maaari itong mangyari kapag sinusubukan ng isang attacker na magpanggap bilang <ph name="SITE" />, o naputol ang koneksyon dahil sa isang screen ng pag-sign in sa Wi-Fi. Secure pa rin ang iyong impormasyon dahil inihinto ng Chromium ang koneksyon bago magkaroon ng palitan ng anumang data.</translation>
 <translation id="9106062320799175032">Magdagdag ng Billing Address</translation>
 <translation id="9114524666733003316">Kinukumpirma ang card...</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 5d26419..e68209f 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -71,6 +71,7 @@
 <translation id="1292701964462482250">"आपके कंप्यूटर पर मौजूद सॉफ़्टवेयर Chrome को सुरक्षित रूप से वेब से कनेक्ट होने से रोक रहा है" (केवल Windows कंप्यूटर)</translation>
 <translation id="1294154142200295408">अलग-अलग तरह की कमांड-लाइन</translation>
 <translation id="129553762522093515">हाल ही में बंद किए गए</translation>
+<translation id="1298536327547837046">मैलवेयर स्कैनिंग</translation>
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />अपनी कुकी साफ़ करके देखें<ph name="END_LINK" /></translation>
 <translation id="1307966114820526988">बंद की गई सुविधाएं</translation>
 <translation id="1320233736580025032">पीआरसी1 (एन्वेलप)</translation>
@@ -426,6 +427,7 @@
 <translation id="320323717674993345">भुगतान रद्द करें</translation>
 <translation id="3207960819495026254">बुकमार्क किया गया</translation>
 <translation id="3209034400446768650">पेज पर शुल्क लिया जा सकता है</translation>
+<translation id="3215092763954878852">WebAuthn का इस्तेमाल नहीं किया जा सका</translation>
 <translation id="3225919329040284222">सर्वर द्वारा कोई प्रमाणपत्र प्रस्‍तुत किया गया, जो बिल्‍ट-इन अपेक्षाओं से मिलान नहीं करता. इन अपेक्षाओं को आपकी सुरक्षा करने के लिए कुछ, उच्‍च-सुरक्षा वेबसाइटों के लिए शामिल किया गया है.</translation>
 <translation id="3226128629678568754">पेज को लोड करने के लिए ज़रूरी डेटा फिर सबमिट करने के लिए 'फिर लोड करें' बटन दबाएं.</translation>
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
@@ -562,6 +564,7 @@
 <translation id="3964661563329879394">{COUNT,plural, =0{कुछ नहीं}=1{1 साइट से }one{# साइटों से }other{# साइटों से }}</translation>
 <translation id="397105322502079400">गणना की जा रही है...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> को ब्लॉक किया गया है</translation>
+<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" /> ने आपके ब्राउज़र पर Chrome Enterprise की खतरे से बचाने की सुविधा चालू की है. Chrome Enterprise की खतरे से बचाने की सुविधा आपका कुछ डेटा ऐक्सेस कर सकती है.</translation>
 <translation id="3987940399970879459">एक एमबी से कम</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{आस-पास 1 वेब पेज है}one{आस-पास # वेब पेज हैं}other{आस-पास # वेब पेज हैं}}</translation>
 <translation id="4030383055268325496">&amp;जोड़ना वापस लाएं</translation>
@@ -630,6 +633,7 @@
 <translation id="4277028893293644418">पासवर्ड रीसेट करें</translation>
 <translation id="4279811152705618813">आपके <ph name="DEVICE_TYPE" /> का प्रबंधन <ph name="ENROLLMENT_DOMAIN" /> करता है</translation>
 <translation id="428639260510061158">{NUM_CARDS,plural, =1{यह कार्ड आपके Google खाते में सेव कर लिया गया है}one{ये कार्ड आपके Google खाते में सेव कर लिए गए हैं}other{ये कार्ड आपके Google खाते में सेव कर लिए गए हैं}}</translation>
+<translation id="428847186335018806">Chrome में डाउनलोड या अपलोड किए जाने वाली फ़ाइलों को स्कैन करें.</translation>
 <translation id="42981349822642051">विस्तृत करें</translation>
 <translation id="4302965934281694568">शू3 (एन्वेलप)</translation>
 <translation id="4305817255990598646">बदलें</translation>
@@ -668,6 +672,7 @@
 <translation id="4506176782989081258">सत्‍यापन गड़बड़ी: <ph name="VALIDATION_ERROR" /></translation>
 <translation id="4506599922270137252">सिस्टम व्यवस्थापक से संपर्क करें</translation>
 <translation id="450710068430902550">व्यवस्थापक के साथ शेयर करना</translation>
+<translation id="4508814173490746936">टच आईडी का इस्तेमाल नहीं किया जा सका</translation>
 <translation id="4510487217173779431">शू4 (एन्वेलप)</translation>
 <translation id="4515275063822566619">कार्ड और पते की जानकारी Chrome और आपके Google खाते (<ph name="ACCOUNT_EMAIL" />) से ली जाती है. आप उन्हें <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में जाकर प्रबंधित कर सकते हैं.</translation>
 <translation id="4517607026994743406">कॉम-10 (एन्वेलप)</translation>
@@ -763,6 +768,7 @@
 <translation id="5045550434625856497">ग़लत पासवर्ड</translation>
 <translation id="5056549851600133418">आपके लिए लेख</translation>
 <translation id="5068524481479508725">ए10</translation>
+<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1 कुकी इस्तेमाल में है)}one{(# कुकी इस्तेमाल में हैं)}other{(# कुकी इस्तेमाल में हैं)}}</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />प्रॉक्सी पते की जाँच करें<ph name="END_LINK" /></translation>
 <translation id="5087286274860437796">सर्वर का प्रमाण पत्र इस समय मान्य नहीं है.</translation>
 <translation id="5087580092889165836">कार्ड जोड़ें</translation>
@@ -991,6 +997,7 @@
 <translation id="6302269476990306341">'Chrome में Google Assistant' को रोका जा रहा है</translation>
 <translation id="6305205051461490394"><ph name="URL" /> तक नहीं पहुंचा जा सकता.</translation>
 <translation id="6321917430147971392">अपनी DNS सेटिंग जांचे</translation>
+<translation id="6322182122604171028">Windows Hello का इस्तेमाल नहीं किया जा सका</translation>
 <translation id="6328639280570009161">नेटवर्क पूर्वानुमान को अक्षम करके देखें</translation>
 <translation id="6328784461820205019">"आपका कनेक्शन निजी नहीं है" या "&lt;span class="error-code"&gt;NET::ERR_CERT_AUTHORITY_INVALID&lt;/span&gt;" या "&lt;span class="error-code"&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/span&gt;" या "&lt;span class="error-code"&gt;NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM&lt;/span&gt;" या "&lt;span class="error-code"&gt;ERR_CERT_SYMANTEC_LEGACY&lt;/span&gt;" या "एसएसएल प्रमाणपत्र गड़बड़ी"</translation>
 <translation id="6328786501058569169">यह साइट भ्रामक है</translation>
@@ -1014,6 +1021,7 @@
 <translation id="6433490469411711332">संपर्क जानकारी में बदलाव करें</translation>
 <translation id="6433595998831338502"><ph name="HOST_NAME" /> ने कनेक्ट करने से मना कर दिया है.</translation>
 <translation id="6434309073475700221">खारिज करें</translation>
+<translation id="6435221585574090192">सुरक्षा से जुड़ी उन गतिविधियों के बारे में डेटा शेयर करें जिन्हें Chrome Enterprise की खतरे से बचाने वाली सुविधा ने आपके एडमिन को फ़्लैग किया है. इनमें पेज के यूआरएल, फ़ाइल का नाम, और फ़ाइल का मेटाडेटा, आपके डिवाइस का उपयोगकर्ता नाम और Chrome उपयोगकर्ता नाम शामिल हो सकते हैं.</translation>
 <translation id="6440503408713884761">अनदेखा किया गया</translation>
 <translation id="6446163441502663861">काहू (एन्वेलप)</translation>
 <translation id="6446608382365791566">और जानकारी जोड़ें</translation>
@@ -1058,6 +1066,7 @@
 <translation id="6671697161687535275">क्रोमियम से फ़ॉर्म सुझाव निकालें?</translation>
 <translation id="6685834062052613830">प्रस्थान करें और सेटअप पूरा करें</translation>
 <translation id="6689271823431384964">आपके साइन इन किए होने की वजह से, Chrome आपको Google खाते में कार्ड सेव करने की सुविधा देता है. आप 'सेटिंग' में जाकर इसे बदल सकते हैं. कार्डधारक का नाम आपके खाते से लिया जाता है.</translation>
+<translation id="6707256370811247129">कैश मेमोरी की सामग्री और फ़ाइलों को स्कैन करें जिन्हें आप Chrome में डाउनलोड या अपलोड करते हैं.</translation>
 <translation id="6710213216561001401">पिछला</translation>
 <translation id="6710594484020273272">&lt;खोज शब्द लिखें&gt;</translation>
 <translation id="671076103358959139">नाम दर्ज करने का टोकन:</translation>
@@ -1076,6 +1085,7 @@
 <translation id="681021252041861472">ज़रूरी फ़ील्ड</translation>
 <translation id="6810899417690483278">कस्टमाइज़ेशन आईडी</translation>
 <translation id="6825578344716086703">आपने <ph name="DOMAIN" /> तक पहुंचने की कोशिश की थी, लेकिन सर्वर ने कमज़ोर हस्ताक्षर एल्गोरिद्म (जैसे कि SHA-1) वाला प्रमाणपत्र प्रस्तुत किया. इसका मतलब है कि सर्वर की ओर से प्रस्तुत किए गए सुरक्षा क्रेडेंशियल नकली हो सकते हैं और हो सकता है कि सर्वर आपका अपेक्षित सर्वर न हो (हो सकता है कि आप किसी हमलावर से बातचीत कर रहे हों).</translation>
+<translation id="6826370046007623921">डेटा लीक होने की रोकथाम</translation>
 <translation id="6831043979455480757">अनुवाद करें</translation>
 <translation id="6839929833149231406">क्षेत्र</translation>
 <translation id="6852204201400771460">ऐप्लिकेशन फिर लोड करें?</translation>
@@ -1222,6 +1232,7 @@
 <translation id="7542995811387359312">अपने आप क्रेडिट कार्ड भरना अक्षम किया गया है क्योंकि यह फ़ॉर्म किसी सुरक्षित कनेक्शन का उपयोग नहीं करता है.</translation>
 <translation id="7548892272833184391">कनेक्शन गड़बड़ियां ठीक करना</translation>
 <translation id="7549584377607005141">इस वेबपेज को उस डेटा की ज़रुरत है जो आपने पहले दर्ज की थी ताकि इसे सही रूप में डिस्प्ले किया जा सके. आप यह डेटा फिर से भेज सकते हैं, लेकिन ऐसा करके आप इस पेज की इससे पहले की जा चुकी कोई कार्रवाई दोहराएंगे.</translation>
+<translation id="7550637293666041147">आपके डिवाइस का उपयोगकर्ता नाम और Chrome उपयोगकर्ता नाम</translation>
 <translation id="7552846755917812628">ये टिप्स आज़माएं:</translation>
 <translation id="7554791636758816595">नया टैब</translation>
 <translation id="7564049878696755256">आपके <ph name="ORG_NAME" /> खाते का एक्सेस खो सकता है या पहचान चोरी हो सकती है. Chrome आपको अभी अपना पासवर्ड बदलने का सुझाव देता है.</translation>
@@ -1236,6 +1247,7 @@
 <translation id="7610193165460212391"><ph name="VALUE" /> मान सीमा से बाहर है.</translation>
 <translation id="7613889955535752492">समय-सीमा खत्म: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="7615602087246926389">आपके पास पहले से ऐसा डेटा है, जिसे आपके Google खाते के पासवर्ड के किसी अलग वर्शन का इस्तेमाल करके सुरक्षित किया गया है. कृपया उसे नीचे लिखें.</translation>
+<translation id="7625784245512586808">Chrome Enterprise की खतरे से बचाने की सुविधा</translation>
 <translation id="7633909222644580952">परफ़ॉर्मेंस डेटा और क्रैश रिपोर्ट</translation>
 <translation id="7637571805876720304">क्रोमियम से क्रेडिट कार्ड निकालें?</translation>
 <translation id="7638605456503525968">सीरियल पोर्ट</translation>
@@ -1346,6 +1358,7 @@
 <translation id="8211406090763984747">कनेक्शन सुरक्षित है</translation>
 <translation id="8218327578424803826">सौंपा गया स्‍थान:</translation>
 <translation id="8220146938470311105">सी7/सी6 (एन्वेलप)</translation>
+<translation id="8220639454292072926">एंटरप्राइज़ रिपोर्टिंग</translation>
 <translation id="8225771182978767009">जिस व्यक्ति ने इस कंप्यूटर को सेट किया है, उसने इस साइट को ब्लॉक करना चुना है.</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8238581221633243064">पेज को नए गुप्त टैब में खोलें</translation>
@@ -1429,6 +1442,7 @@
 <translation id="8740359287975076522"><ph name="HOST_NAME" /> का &lt;abbr id="dnsDefinition"&gt;DNS पता&lt;/abbr&gt; नहीं पाया जा सका. समस्या का निदान किया जा रहा है.</translation>
 <translation id="874846938927089722">स्वीकार किए जाने वाले क्रेडिट और प्रीपेड कार्ड</translation>
 <translation id="874918643257405732">इस टैब को बुकमार्क करें</translation>
+<translation id="8751426954251315517">कृपया बाद में कोशिश करें</translation>
 <translation id="8759274551635299824">इस कार्ड की अवधि खत्म हो चुकी है</translation>
 <translation id="8761567432415473239">Google सुरक्षित ब्राउज़िंग को <ph name="SITE" /> पर हाल ही में <ph name="BEGIN_LINK" />हानिकारक प्रोग्राम मिले हैं<ph name="END_LINK" />.</translation>
 <translation id="8763927697961133303">USB डिवाइस</translation>
@@ -1493,6 +1507,7 @@
 <translation id="9080712759204168376">ऑर्डर की जानकारी</translation>
 <translation id="9089260154716455634">बंद रहने के समय के लिए नीति:</translation>
 <translation id="9095388113577226029">और भाषाएं...</translation>
+<translation id="9098981495403789647">एडमिन ने आपके ब्राउज़र पर Chrome Enterprise की खतरे से बचाने की सुविधा चालू की है. Chrome Enterprise की खतरे से बचाने की सुविधा आपका कुछ डेटा ऐक्सेस कर सकती है.</translation>
 <translation id="9103872766612412690">आपकी जानकारी की सुरक्षा करने के लिए <ph name="SITE" /> आम तौर पर, सुरक्षित करने के तरीके (एन्क्रिप्शन) का उपयोग करती है. जब 'क्रोमियम' ने इस बार <ph name="SITE" /> से कनेक्ट करने की कोशिश की तो, वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने की कोशिश कर रहा हो या किसी वाई-फ़ाई 'साइन इन स्क्रीन' की वजह से कनेक्शन में खराबी आ गई हो. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा को एक्सचेंज करने से पहले ही 'क्रोमियम' ने कनेक्शन रोक दिया था.</translation>
 <translation id="9106062320799175032">बिलिंग पता जोड़ें</translation>
 <translation id="9114524666733003316">कार्ड की पुष्टि की जा रही है...</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 45fcee6..e3946c9 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -71,6 +71,7 @@
 <translation id="1292701964462482250">'컴퓨터의 소프트웨어로 인해 Chrome이 안전하게 웹에 접속할 수 없습니다'(Windows 컴퓨터만 해당)</translation>
 <translation id="1294154142200295408">명령줄 변형</translation>
 <translation id="129553762522093515">최근에 닫은 탭</translation>
+<translation id="1298536327547837046">멀웨어 검사</translation>
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />쿠키 삭제해 보기<ph name="END_LINK" /></translation>
 <translation id="1307966114820526988">지원 중단 기능</translation>
 <translation id="1320233736580025032">Prc1(봉투)</translation>
@@ -427,6 +428,7 @@
 <translation id="320323717674993345">결제 취소</translation>
 <translation id="3207960819495026254">북마크에 추가됨</translation>
 <translation id="3209034400446768650">페이지에서 요금을 청구할 수 있음</translation>
+<translation id="3215092763954878852">WebAuthn을 사용할 수 없음</translation>
 <translation id="3225919329040284222">서버가 내장된 기대치와 일치하지 않는 인증서를 전달했습니다. 이러한 기대치는 사용자를 보호하기 위해 보안이 엄격한 특정 웹사이트에 포함됩니다.</translation>
 <translation id="3226128629678568754">페이지 로드에 필요한 데이터를 다시 제출하려면 새로고침 버튼을 누릅니다.</translation>
 <translation id="3227137524299004712">마이크</translation>
@@ -563,6 +565,7 @@
 <translation id="3964661563329879394">{COUNT,plural, =0{없음}=1{사이트 1개 }other{사이트 #개 }}</translation>
 <translation id="397105322502079400">계산 중...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" />이(가) 차단됨</translation>
+<translation id="3981540111851280311"><ph name="ENROLLMENT_DOMAIN" />에서 브라우저의 Chrome Enterprise Threat Protection을 사용 설정했습니다. Chrome Enterprise Threat Protection에서 내 데이터 중 일부에 액세스할 권한이 있습니다.</translation>
 <translation id="3987940399970879459">1MB 미만</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{주변 웹페이지 1개}other{주변 웹페이지 #개}}</translation>
 <translation id="4030383055268325496">추가 실행 취소(&amp;U)</translation>
@@ -631,6 +634,7 @@
 <translation id="4277028893293644418">비밀번호 재설정</translation>
 <translation id="4279811152705618813"><ph name="ENROLLMENT_DOMAIN" />에서 <ph name="DEVICE_TYPE" />을(를) 관리합니다</translation>
 <translation id="428639260510061158">{NUM_CARDS,plural, =1{다음 카드가 Google 계정에 저장되었습니다.}other{다음 카드가 Google 계정에 저장되었습니다.}}</translation>
+<translation id="428847186335018806">Chrome에서 다운로드 또는 업로드한 파일을 검사합니다.</translation>
 <translation id="42981349822642051">펼치기</translation>
 <translation id="4302965934281694568">Chou3(봉투)</translation>
 <translation id="4305817255990598646">전환</translation>
@@ -669,6 +673,7 @@
 <translation id="4506176782989081258">유효성 검사 오류 <ph name="VALIDATION_ERROR" /></translation>
 <translation id="4506599922270137252">시스템 관리자에게 문의</translation>
 <translation id="450710068430902550">관리자와 공유</translation>
+<translation id="4508814173490746936">Touch ID를 사용할 수 없음</translation>
 <translation id="4510487217173779431">Chou4(봉투)</translation>
 <translation id="4515275063822566619">카드와 주소는 Chrome 및 Google 계정(<ph name="ACCOUNT_EMAIL" />)에서 가져왔습니다. 이 정보는 <ph name="BEGIN_LINK" />설정<ph name="END_LINK" />에서 관리할 수 있습니다.</translation>
 <translation id="4517607026994743406">Comm-10(봉투)</translation>
@@ -764,6 +769,7 @@
 <translation id="5045550434625856497">비밀번호가 잘못되었습니다.</translation>
 <translation id="5056549851600133418">추천 기사</translation>
 <translation id="5068524481479508725">A10</translation>
+<translation id="5068778127327928576">{NUM_COOKIES,plural, =1{(1개 사용 중)}other{(#개 사용 중)}}</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />프록시 주소 확인<ph name="END_LINK" /></translation>
 <translation id="5087286274860437796">서버의 인증서가 현재 유효하지 않습니다.</translation>
 <translation id="5087580092889165836">카드 추가</translation>
@@ -992,6 +998,7 @@
 <translation id="6302269476990306341">Chrome의 Google 어시스턴트 중지하는 중</translation>
 <translation id="6305205051461490394"><ph name="URL" />에 연결할 수 없습니다.</translation>
 <translation id="6321917430147971392">DNS 설정 확인</translation>
+<translation id="6322182122604171028">Windows Hello를 사용할 수 없음</translation>
 <translation id="6328639280570009161">네트워크 예측을 사용 중지해 보세요.</translation>
 <translation id="6328784461820205019">'연결이 비공개로 설정되어 있지 않습니다.', '&lt;span class="error-code"&gt;NET::ERR_CERT_AUTHORITY_INVALID&lt;/span&gt;', '&lt;span class="error-code"&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/span&gt;', '&lt;span class="error-code"&gt;NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM&lt;/span&gt;', '&lt;span class="error-code"&gt;ERR_CERT_SYMANTEC_LEGACY&lt;/span&gt;' 또는 'SSL 인증서 오류'</translation>
 <translation id="6328786501058569169">사기성 사이트</translation>
@@ -1015,6 +1022,7 @@
 <translation id="6433490469411711332">연락처 정보 수정</translation>
 <translation id="6433595998831338502"><ph name="HOST_NAME" />에서 연결을 거부했습니다.</translation>
 <translation id="6434309073475700221">중지</translation>
+<translation id="6435221585574090192">Chrome Enterprise Threat Protection에서 신고한 보안 이벤트에 관한 데이터를 관리자와 공유합니다. 여기에는 페이지 URL, 파일 이름, 파일 메타데이터, 기기 사용자 이름 및 Chrome 사용자 이름이 포함될 수 있습니다.</translation>
 <translation id="6440503408713884761">무시됨</translation>
 <translation id="6446163441502663861">Kahu(봉투)</translation>
 <translation id="6446608382365791566">자세한 정보 추가</translation>
@@ -1059,6 +1067,7 @@
 <translation id="6671697161687535275">Chromium에서 자동완성 항목 추천을 삭제하시겠습니까?</translation>
 <translation id="6685834062052613830">로그아웃 후 설정 완료</translation>
 <translation id="6689271823431384964">Google 계정에 로그인되어 있기 때문에 Chrome에서 계정에 카드를 저장할지 묻는 메시지가 표시됩니다. 설정에서 이 동작을 변경할 수 있습니다. 카드 소지자 이름은 계정에서 가져온 것입니다.</translation>
+<translation id="6707256370811247129">Chrome에서 다운로드 또는 업로드하는 캐시와 파일의 내용을 검사합니다.</translation>
 <translation id="6710213216561001401">이전</translation>
 <translation id="6710594484020273272">&lt;검색어 입력&gt;</translation>
 <translation id="671076103358959139">등록 토큰:</translation>
@@ -1077,6 +1086,7 @@
 <translation id="681021252041861472">필수 입력란</translation>
 <translation id="6810899417690483278">맞춤설정 ID</translation>
 <translation id="6825578344716086703"><ph name="DOMAIN" />에 접속하려 했으나 서버에서 안전성이 낮은 서명 알고리즘을 사용하여 서명된 인증서(예: SHA-1)를 전달했습니다. 이는 서버에서 전달한 보안 사용자 인증 정보가 위조되었을 수 있으며 사용하려는 서버가 아님을 의미합니다. 서버를 가장한 공격자와 통신 중일 수 있습니다.</translation>
+<translation id="6826370046007623921">데이터 손실 방지</translation>
 <translation id="6831043979455480757">번역</translation>
 <translation id="6839929833149231406">지구</translation>
 <translation id="6852204201400771460">앱을 새로고침하시겠습니까?</translation>
@@ -1222,6 +1232,7 @@
 <translation id="7542995811387359312">양식에 보안 연결이 사용되지 않아 신용카드 자동 채우기가 사용 중지되었습니다.</translation>
 <translation id="7548892272833184391">연결 문제해결</translation>
 <translation id="7549584377607005141">이 웹페이지를 제대로 표시하려면 이전에 입력한 데이터가 필요합니다. 이 데이터를 다시 보낼 수 있지만 이 경우 해당 페이지에서 이전에 수행한 작업이 반복됩니다.</translation>
+<translation id="7550637293666041147">기기 사용자 이름 및 Chrome 사용자 이름</translation>
 <translation id="7552846755917812628">다음 도움말을 확인해 보세요.</translation>
 <translation id="7554791636758816595">새 탭</translation>
 <translation id="7564049878696755256"><ph name="ORG_NAME" /> 계정에 액세스할 수 없게 되거나 신원 도용이 발생할 수도 있습니다. 따라서 지금 비밀번호를 변경하는 것이 좋습니다.</translation>
@@ -1236,6 +1247,7 @@
 <translation id="7610193165460212391">값(<ph name="VALUE" />)이 범위를 벗어났습니다.</translation>
 <translation id="7613889955535752492">만료일: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="7615602087246926389">다른 Google 계정 비밀번호 버전을 사용하여 암호화된 데이터가 이미 있습니다. 아래에 암호를 입력하시기 바랍니다.</translation>
+<translation id="7625784245512586808">Chrome Enterprise Threat Protection</translation>
 <translation id="7633909222644580952">성능 데이터 및 비정상 종료 보고서</translation>
 <translation id="7637571805876720304">Chromium에서 신용카드를 삭제하시겠습니까?</translation>
 <translation id="7638605456503525968">직렬 포트</translation>
@@ -1346,6 +1358,7 @@
 <translation id="8211406090763984747">이 사이트는 보안 연결(HTTPS)이 사용되었습니다.</translation>
 <translation id="8218327578424803826">지정된 위치:</translation>
 <translation id="8220146938470311105">C7/C6(봉투)</translation>
+<translation id="8220639454292072926">엔터프라이즈 보고</translation>
 <translation id="8225771182978767009">컴퓨터를 설정한 사용자가 이 사이트를 차단했습니다.</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8238581221633243064">새 시크릿 창에서 페이지 열기</translation>
@@ -1428,6 +1441,7 @@
 <translation id="8740359287975076522"><ph name="HOST_NAME" />의 &lt;abbr id="dnsDefinition"&gt;DNS 주소&lt;/abbr&gt;를 찾을 수 없습니다. 문제를 진단하는 중입니다.</translation>
 <translation id="874846938927089722">사용 가능한 신용카드 및 선불카드</translation>
 <translation id="874918643257405732">현재 탭을 북마크에 추가</translation>
+<translation id="8751426954251315517">나중에 다시 시도해 주세요.</translation>
 <translation id="8759274551635299824">만료된 카드입니다.</translation>
 <translation id="8761567432415473239">Google 세이프 브라우징 결과 <ph name="SITE" />에서 최근 <ph name="BEGIN_LINK" />악성 프로그램이 발견<ph name="END_LINK" />되었습니다.</translation>
 <translation id="8763927697961133303">USB 기기</translation>
@@ -1492,6 +1506,7 @@
 <translation id="9080712759204168376">주문 요약</translation>
 <translation id="9089260154716455634">제한 완화 시간 정책:</translation>
 <translation id="9095388113577226029">다른 언어...</translation>
+<translation id="9098981495403789647">관리자가 브라우저에서 Chrome Enterprise Threat Protection을 사용 설정했습니다. Chrome Enterprise Threat Protection에서 내 데이터 중 일부에 액세스할 권한이 있습니다.</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>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index ca7775b..4b41c84c 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -151,7 +151,7 @@
 <translation id="1663943134801823270">कार्ड आणि पत्ते Chrome कडील आहेत. तुम्ही त्यांना <ph name="BEGIN_LINK" />सेटिंग्‍ज<ph name="END_LINK" /> मधून व्यवस्थापित करू शकता.</translation>
 <translation id="1669987054044193553">निश्चित करा आणि सेव्ह करा</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" /> असल्याची बतावणी करण्याचा प्रयत्न करतो तेव्‍हा किंवा वाय-फाय साइन इन स्क्रीनने कनेक्शनमध्ये व्यत्यय आणले तेव्‍हा हे घडू शकते. कोणत्याही डेटाची अदलाबदल करण्यापूर्वी Google Chrome ने कनेक्शन थांबविल्यामुळे तुमची माहिती अद्याप सुरक्षित आहे.</translation>
+<translation id="1676269943528358898"><ph name="SITE" /> तुमची माहिती संरक्षित करण्यासाठी सामान्यतः एंक्रिप्शन वापरते. Google Chrome ने यावेळी <ph name="SITE" /> शी कनेक्‍ट करण्‍याचा प्रयत्न केला तेव्‍हा, वेबसाइटने असामान्य आणि अयोग्य क्रेडेंशियल परत पाठवले. एकतर आक्रमणकर्ता <ph name="SITE" /> असल्याची बतावणी करण्याचा प्रयत्न करतो तेव्‍हा किंवा वाय-फाय साइन इन स्क्रीनने कनेक्शनमध्ये व्यत्यय आणले तेव्‍हा हे घडू शकते. कोणत्याही डेटाची अदलाबदल करण्यापूर्वी Google Chrome ने कनेक्शन थांबविल्यामुळे तुमची माहिती अद्याप सुरक्षित आहे.</translation>
 <translation id="168841957122794586">सर्व्हर सर्टिफिकेटमध्ये एक कमकुवत क्रिप्टोग्राफिक की आहे.</translation>
 <translation id="1697532407822776718">तुम्ही पूर्णपणे तयार आहात!</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -173,7 +173,7 @@
 <translation id="1753706481035618306">पृष्ठ क्रमांक</translation>
 <translation id="1763864636252898013">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता सर्टिफिकेट तुम्हाला डिव्हाइसच्या ऑपरेटिंग सिस्टमद्वारे विश्वसनीय नाही. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा हल्लेखोराने तुमचे कनेक्शन इंटरसेप्ट केल्यामुळे झाले असू शकते.</translation>
 <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows नेटवर्क निदान चालवून पहा<ph name="END_LINK" />.</translation>
-<translation id="1783075131180517613">कृपया तुमचे सिंक सांकेतिक पासफ्रेझ अपडेट करा.</translation>
+<translation id="1783075131180517613">कृपया तुमचे सिंक केलेली सांकेतिक पासफ्रेज अपडेट करा.</translation>
 <translation id="1787142507584202372">तुमचे खुले टॅब येथे दिसतात</translation>
 <translation id="1791429645902722292">Google Smart Lock</translation>
 <translation id="1800473098294731951">B9</translation>
@@ -417,7 +417,7 @@
 <translation id="3150653042067488994">तात्पुरती सर्व्हर एरर</translation>
 <translation id="3154506275960390542">या पेजवर एक फॉर्म आहे जो कदाचित सुरक्षितपणे सबमिट होणार नाही. तुम्ही पाठविलेला डेटा प्रवासादरम्यान इतर पाहू शकतात किंवा सर्व्हर प्राप्त करत असलेल्या आक्रमणकर्त्याद्वारे सुधारित केले जाऊ शकते.</translation>
 <translation id="3157931365184549694">पुनर्संचयित करा</translation>
-<translation id="3162559335345991374">तुम्ही वापरत असलेल्या वाय-फाय च्या लॉग इन पेजला तुमच्या भेट देण्याची आवश्यकता असू शकते.</translation>
+<translation id="3162559335345991374">तुम्ही वापरत असलेल्या वाय-फाय च्या लॉग इन पेजला तुम्हाला भेट देण्याची आवश्यकता असू शकते.</translation>
 <translation id="3167968892399408617">गुप्त मोडमध्‍ये तुम्ही पाहता ती पृष्‍ठे तुम्ही तुमचे सर्व गुप्त टॅब बंद केल्‍यानंतर तुमचा ब्राउझर इतिहास, कुकी स्टोअर किंवा शोध इतिहासामध्‍ये असणार नाहीत. तुम्ही डाउनलोड करता त्या कोणत्याही फायली किंवा तुम्ही केलेले बुकमार्क ठेवले जातील.</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174168572213147020">बेट</translation>
@@ -580,6 +580,7 @@
 <translation id="4103249731201008433">डिव्हाइस सिरीयल क्रमांक चुकीचा आहे</translation>
 <translation id="410351446219883937">ऑटोप्ले</translation>
 <translation id="4103763322291513355">तुमच्या सिस्टम अॅडमिनिस्ट्रेटरद्वारे प्रवर्तित ब्लॅकलिस्टीतील URLs आणि अन्य धोरणांची सूची पाहण्यासाठी &lt;strong&gt;chrome://policy&lt;/strong&gt; ला भेट द्या.</translation>
+<translation id="4108231218301530806">या कार्डची पुढच्या वेळी पडताळणी करण्यासाठी फिंगरप्रिंट वापरा.</translation>
 <translation id="4110652170750985508">तुमचे पेमेंट पुन्हा एकदा तपासा</translation>
 <translation id="4112140312785995938">मागे शोधा</translation>
 <translation id="4116663294526079822">या साइटवर नेहमी अनुमती द्या</translation>
@@ -1282,7 +1283,7 @@
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Chrome मधून सूचना फॉर्म काढून टाकायचा?</translation>
 <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' साठी <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> सापडले</translation>
-<translation id="782886543891417279">तुम्ही वापरत असलेल्या (<ph name="WIFI_NAME" />) वाय-फाय च्या लॉग इन पेजला तुमच्या भेट देण्याची आवश्यकता असू शकते.</translation>
+<translation id="782886543891417279">तुम्ही वापरत असलेल्या (<ph name="WIFI_NAME" />) वाय-फाय च्या लॉग इन पेजला तुम्हाला भेट देण्याची आवश्यकता असू शकते.</translation>
 <translation id="7836231406687464395">Postfix (Envelope)</translation>
 <translation id="7844689747373518809">{COUNT,plural, =0{काहीही नाही}=1{एक अ‍ॅप <ph name="EXAMPLE_APP_1" />}=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>
@@ -1495,7 +1496,7 @@
 <translation id="9080712759204168376">मागणी सारांश</translation>
 <translation id="9089260154716455634">कामाच्या तासानंतरचे धोरण:</translation>
 <translation id="9095388113577226029">आणखी भाषा...</translation>
-<translation id="9103872766612412690"><ph name="SITE" /> तुमची माहिती संरक्षित करण्यासाठी सामान्यतः एंक्रिप्शन वापरते. Chromium ने यावेळी <ph name="SITE" /> शी कनेक्‍ट करण्‍याचा प्रयत्न केला तेव्‍हा, वेबसाइटने असामान्य आणि अयोग्य क्रेडेन्शियल परत पाठविले. एकतर आक्रमणकर्ता <ph name="SITE" /> असल्याची बतावणी करण्याचा प्रयत्न करतो तेव्‍हा किंवा वाय-फाय साइन इन स्क्रीनने कनेक्शनमध्ये व्यत्यय आणले तेव्‍हा हे घडू शकते. कोणत्याही डेटाची अदलाबदल करण्यापूर्वी Chromium ने कनेक्शन थांबविल्यामुळे तुमची माहिती अद्याप सुरक्षित आहे.</translation>
+<translation id="9103872766612412690"><ph name="SITE" /> तुमची माहिती संरक्षित करण्यासाठी सामान्यतः एंक्रिप्शन वापरते. Chromium ने यावेळी <ph name="SITE" /> शी कनेक्‍ट करण्‍याचा प्रयत्न केला तेव्‍हा, वेबसाइटने असामान्य आणि अयोग्य क्रेडेंशियल परत पाठवले. एकतर आक्रमणकर्ता <ph name="SITE" /> असल्याची बतावणी करण्याचा प्रयत्न करतो तेव्‍हा किंवा वाय-फाय साइन इन स्क्रीनने कनेक्शनमध्ये व्यत्यय आणले तेव्‍हा हे घडू शकते. कोणत्याही डेटाची अदलाबदल करण्यापूर्वी Chromium ने कनेक्शन थांबविल्यामुळे तुमची माहिती अद्याप सुरक्षित आहे.</translation>
 <translation id="9106062320799175032">बिलिंग पत्ता जोडा</translation>
 <translation id="9114524666733003316">कार्डची निश्चिती करत आहे...</translation>
 <translation id="9128870381267983090">नेटवर्कशी कनेक्ट करा</translation>
diff --git a/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc b/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc
index bb569124..3c5eaf1 100644
--- a/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc
+++ b/components/viz/service/display_embedder/compositing_mode_reporter_impl.cc
@@ -10,9 +10,9 @@
 
 CompositingModeReporterImpl::~CompositingModeReporterImpl() = default;
 
-void CompositingModeReporterImpl::BindRequest(
-    mojom::CompositingModeReporterRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+void CompositingModeReporterImpl::BindReceiver(
+    mojo::PendingReceiver<mojom::CompositingModeReporter> receiver) {
+  receivers_.Add(this, std::move(receiver));
 }
 
 void CompositingModeReporterImpl::SetUsingSoftwareCompositing() {
diff --git a/components/viz/service/display_embedder/compositing_mode_reporter_impl.h b/components/viz/service/display_embedder/compositing_mode_reporter_impl.h
index 5188a03..fef75a14 100644
--- a/components/viz/service/display_embedder/compositing_mode_reporter_impl.h
+++ b/components/viz/service/display_embedder/compositing_mode_reporter_impl.h
@@ -7,8 +7,8 @@
 
 #include "base/macros.h"
 #include "components/viz/service/viz_service_export.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/viz/public/mojom/compositing/compositing_mode_watcher.mojom.h"
 
@@ -23,8 +23,9 @@
   ~CompositingModeReporterImpl() override;
 
   // Called for each consumer of the CompositingModeReporter interface, to
-  // fulfill a mojo pointer for them.
-  void BindRequest(mojom::CompositingModeReporterRequest request);
+  // bind a receiver for them.
+  void BindReceiver(
+      mojo::PendingReceiver<mojom::CompositingModeReporter> receiver);
 
   // Call to inform the reporter that software compositing is being used instead
   // of gpu. This is a one-way setting that can not be reverted. This will
@@ -37,7 +38,7 @@
 
  private:
   bool gpu_ = true;
-  mojo::BindingSet<mojom::CompositingModeReporter> bindings_;
+  mojo::ReceiverSet<mojom::CompositingModeReporter> receivers_;
   mojo::RemoteSet<mojom::CompositingModeWatcher> watchers_;
 };
 
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb
index 1d10c2d..b3baf6c9 100644
--- a/content/app/strings/translations/content_strings_fil.xtb
+++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -186,6 +186,7 @@
 <translation id="709897737746224366">Pakitugma ang hiniling na format.</translation>
 <translation id="7118469954320184356">Walang available na paglalarawan.</translation>
 <translation id="7139483182332611405">preface</translation>
+<translation id="7214187073215825913">impormasyon ng content</translation>
 <translation id="7263440858009898357">Mangyaring pumili ng item sa listahan.</translation>
 <translation id="727747134524199931">header ng column</translation>
 <translation id="7320576522385648310">nagba-buffer</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb
index 35720792..774c3bd0 100644
--- a/content/app/strings/translations/content_strings_hi.xtb
+++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -186,6 +186,7 @@
 <translation id="709897737746224366">कृपया अनुरोधित प्रारूप का मिलान करें.</translation>
 <translation id="7118469954320184356">कोई जानकारी मौजूद नहीं है.</translation>
 <translation id="7139483182332611405">आमुख</translation>
+<translation id="7214187073215825913">सामग्री की जानकारी</translation>
 <translation id="7263440858009898357">कृपया सूची में किसी आइटम को चुनें.</translation>
 <translation id="727747134524199931">स्तंभ शीर्षलेख</translation>
 <translation id="7320576522385648310">बफ़र हो रहा है</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb
index 8f16e08..279cfe5 100644
--- a/content/app/strings/translations/content_strings_ko.xtb
+++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -186,6 +186,7 @@
 <translation id="709897737746224366">요청한 형식과 일치시키세요.</translation>
 <translation id="7118469954320184356">설명이 없습니다.</translation>
 <translation id="7139483182332611405">머리말</translation>
+<translation id="7214187073215825913">콘텐츠 정보</translation>
 <translation id="7263440858009898357">목록에서 항목을 선택하세요.</translation>
 <translation id="727747134524199931">열 헤더</translation>
 <translation id="7320576522385648310">버퍼링</translation>
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 28521684..4b4a82b 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -1193,13 +1193,13 @@
 #endif
 
 void BrowserMainLoop::GetCompositingModeReporter(
-    viz::mojom::CompositingModeReporterRequest request) {
+    mojo::PendingReceiver<viz::mojom::CompositingModeReporter> receiver) {
 #if defined(OS_ANDROID)
   // Android doesn't support non-gpu compositing modes, and doesn't make a
   // CompositingModeReporter.
   return;
 #else
-  compositing_mode_reporter_impl_->BindRequest(std::move(request));
+  compositing_mode_reporter_impl_->BindReceiver(std::move(receiver));
 #endif
 }
 
diff --git a/content/browser/browser_main_loop.h b/content/browser/browser_main_loop.h
index 306dfc80..7af714d 100644
--- a/content/browser/browser_main_loop.h
+++ b/content/browser/browser_main_loop.h
@@ -217,9 +217,9 @@
   viz::ServerSharedBitmapManager* GetServerSharedBitmapManager() const;
 #endif
 
-  // Fulfills a mojo pointer to the singleton CompositingModeReporter.
+  // Binds a receiver to the singleton CompositingModeReporter.
   void GetCompositingModeReporter(
-      viz::mojom::CompositingModeReporterRequest request);
+      mojo::PendingReceiver<viz::mojom::CompositingModeReporter> receiver);
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
   media::DeviceMonitorMac* device_monitor_mac() const {
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index 9d51df4..56dba2e 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -129,7 +129,6 @@
           .SetSession(!cookie.IsPersistent())
           .Build();
 
-  DCHECK(net::IsValidSameSiteValue(cookie.SameSite()));
   switch (cookie.SameSite()) {
     case net::CookieSameSite::STRICT_MODE:
       devtools_cookie->SetSameSite(Network::CookieSameSiteEnum::Strict);
@@ -143,7 +142,7 @@
     case net::CookieSameSite::NO_RESTRICTION:
       devtools_cookie->SetSameSite(Network::CookieSameSiteEnum::None);
       break;
-    default:
+    case net::CookieSameSite::UNSPECIFIED:
       break;
   }
   return devtools_cookie;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 5c6f6ae..42b0475b 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1530,8 +1530,8 @@
     mojo::ScopedInterfaceEndpointHandle handle) {
   ContentBrowserClient* browser_client = GetContentClient()->browser();
   if (!associated_registry_->TryBindInterface(interface_name, &handle) &&
-      !browser_client->BindAssociatedInterfaceRequestFromFrame(
-          this, interface_name, &handle)) {
+      !browser_client->BindAssociatedReceiverFromFrame(this, interface_name,
+                                                       &handle)) {
     delegate_->OnAssociatedInterfaceRequest(this, interface_name,
                                             std::move(handle));
   }
diff --git a/content/browser/hid/hid_service.cc b/content/browser/hid/hid_service.cc
index 8c52086..7810d13 100644
--- a/content/browser/hid/hid_service.cc
+++ b/content/browser/hid/hid_service.cc
@@ -108,10 +108,11 @@
   std::move(callback).Run(std::move(device));
 }
 
-void HidService::FinishConnect(ConnectCallback callback,
-                               device::mojom::HidConnectionPtr connection) {
+void HidService::FinishConnect(
+    ConnectCallback callback,
+    mojo::PendingRemote<device::mojom::HidConnection> connection) {
   if (!connection) {
-    std::move(callback).Run(nullptr);
+    std::move(callback).Run(mojo::NullRemote());
     return;
   }
 
diff --git a/content/browser/hid/hid_service.h b/content/browser/hid/hid_service.h
index 2d1b6a1..8792d8db 100644
--- a/content/browser/hid/hid_service.h
+++ b/content/browser/hid/hid_service.h
@@ -44,8 +44,9 @@
                         std::vector<device::mojom::HidDeviceInfoPtr> devices);
   void FinishRequestDevice(RequestDeviceCallback callback,
                            device::mojom::HidDeviceInfoPtr device);
-  void FinishConnect(ConnectCallback callback,
-                     device::mojom::HidConnectionPtr connection);
+  void FinishConnect(
+      ConnectCallback callback,
+      mojo::PendingRemote<device::mojom::HidConnection> connection);
 
   // The last shown HID chooser UI.
   std::unique_ptr<HidChooser> chooser_;
diff --git a/content/browser/hid/hid_service_unittest.cc b/content/browser/hid/hid_service_unittest.cc
index 0a270e1..e8a3c24 100644
--- a/content/browser/hid/hid_service_unittest.cc
+++ b/content/browser/hid/hid_service_unittest.cc
@@ -12,6 +12,7 @@
 #include "content/test/test_render_view_host.h"
 #include "content/test/test_web_contents.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "services/device/public/cpp/hid/fake_hid_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -181,11 +182,12 @@
       hid_connection_client.InitWithNewPipeAndPassReceiver());
 
   base::RunLoop run_loop;
-  device::mojom::HidConnectionPtr connection;
+  mojo::PendingRemote<device::mojom::HidConnection> connection;
   service->Connect(
       kTestGuid, std::move(hid_connection_client),
       base::BindLambdaForTesting(
-          [&run_loop, &connection](device::mojom::HidConnectionPtr c) {
+          [&run_loop,
+           &connection](mojo::PendingRemote<device::mojom::HidConnection> c) {
             connection = std::move(c);
             run_loop.Quit();
           }));
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index d18cfd28..b57702db0 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2240,9 +2240,9 @@
 }
 
 void RenderProcessHostImpl::BindCompositingModeReporter(
-    viz::mojom::CompositingModeReporterRequest request) {
+    mojo::PendingReceiver<viz::mojom::CompositingModeReporter> receiver) {
   BrowserMainLoop::GetInstance()->GetCompositingModeReporter(
-      std::move(request));
+      std::move(receiver));
 }
 
 void RenderProcessHostImpl::CreateStoragePartitionService(
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 48a5266..55e0b12 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -592,7 +592,7 @@
   void BindFrameSinkProvider(
       mojo::PendingReceiver<mojom::FrameSinkProvider> receiver);
   void BindCompositingModeReporter(
-      viz::mojom::CompositingModeReporterRequest request);
+      mojo::PendingReceiver<viz::mojom::CompositingModeReporter> receiver);
   void CreateStoragePartitionService(
       mojo::PendingReceiver<blink::mojom::StoragePartitionService> receiver);
   void CreateBroadcastChannelProvider(
diff --git a/content/browser/service_worker/service_worker_object_host_unittest.cc b/content/browser/service_worker/service_worker_object_host_unittest.cc
index c114ced..de01a6a2 100644
--- a/content/browser/service_worker/service_worker_object_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_object_host_unittest.cc
@@ -252,14 +252,9 @@
   version_->SetTickClockForTesting(&tick_clock);
 
   // Make sure worker has a non-zero timeout.
-  bool called = false;
-  blink::ServiceWorkerStatusCode status =
-      blink::ServiceWorkerStatusCode::kErrorFailed;
-  version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN,
-                        base::BindOnce(&SaveStatusCallback, &called, &status));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status);
+  ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk,
+            StartServiceWorker(version_.get()));
+
   version_->StartRequestWithCustomTimeout(
       ServiceWorkerMetrics::EventType::ACTIVATE, base::DoNothing(),
       base::TimeDelta::FromSeconds(10), ServiceWorkerVersion::KILL_ON_TIMEOUT);
@@ -286,8 +281,9 @@
   // by calling DispatchExtendableMessageEvent on |object_host|.
   blink::TransferableMessage message;
   SetUpDummyMessagePort(&message.ports);
-  called = false;
-  status = blink::ServiceWorkerStatusCode::kErrorFailed;
+  bool called = false;
+  blink::ServiceWorkerStatusCode status =
+      blink::ServiceWorkerStatusCode::kErrorFailed;
   CallDispatchExtendableMessageEvent(
       object_host, std::move(message),
       base::BindOnce(&SaveStatusCallback, &called, &status));
@@ -310,9 +306,7 @@
   // Timeout of message event should not have extended life of service worker.
   EXPECT_EQ(remaining_time, version_->remaining_timeout());
   // Clean up.
-  base::RunLoop stop_loop;
-  version_->StopWorker(stop_loop.QuitClosure());
-  stop_loop.Run();
+  StopServiceWorker(version_.get());
 }
 
 // Tests postMessage() from a page to a service worker.
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index d4193341..ea6ac1c 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -13440,8 +13440,10 @@
 // Verify the feature where hidden tabs with crashed subframes are marked for
 // reload.  This avoids showing crashed subframes if a hidden tab is eventually
 // shown.  See https://crbug.com/841572.
+
+// TODO(crbug.com/1005049) Disabled due to test flake
 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
-                       ReloadHiddenTabWithCrashedSubframe) {
+                       DISABLED_ReloadHiddenTabWithCrashedSubframe) {
   base::test::ScopedFeatureList feature_list_;
   feature_list_.InitAndEnableFeature(
       features::kReloadHiddenTabsWithCrashedSubframes);
diff --git a/content/browser/speech/speech_recognition_dispatcher_host.cc b/content/browser/speech/speech_recognition_dispatcher_host.cc
index fea528f..fe6ebc11 100644
--- a/content/browser/speech/speech_recognition_dispatcher_host.cc
+++ b/content/browser/speech/speech_recognition_dispatcher_host.cc
@@ -199,11 +199,11 @@
 // ---------------------- SpeechRecognizerSession -----------------------------
 
 SpeechRecognitionSession::SpeechRecognitionSession(
-    blink::mojom::SpeechRecognitionSessionClientPtrInfo client_ptr_info)
+    mojo::PendingRemote<blink::mojom::SpeechRecognitionSessionClient> client)
     : session_id_(SpeechRecognitionManager::kSessionIDInvalid),
-      client_(std::move(client_ptr_info)),
+      client_(std::move(client)),
       stopped_(false) {
-  client_.set_connection_error_handler(
+  client_.set_disconnect_handler(
       base::BindOnce(&SpeechRecognitionSession::ConnectionErrorHandler,
                      base::Unretained(this)));
 }
diff --git a/content/browser/speech/speech_recognition_dispatcher_host.h b/content/browser/speech/speech_recognition_dispatcher_host.h
index e373c23..4621340 100644
--- a/content/browser/speech/speech_recognition_dispatcher_host.h
+++ b/content/browser/speech/speech_recognition_dispatcher_host.h
@@ -15,6 +15,8 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/speech_recognition_event_listener.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/speech/speech_recognizer.mojom.h"
 
 namespace network {
@@ -74,13 +76,14 @@
 // SpeechRecognitionSession implements the
 // blink::mojom::SpeechRecognitionSession interface for a particular session. It
 // also acts as a proxy for events sent from SpeechRecognitionManager, and
-// forwards the events to the renderer using a SpeechRecognitionSessionClientPtr
-// (that is passed from the render process).
+// forwards the events to the renderer using a
+// mojo::Remote<SpeechRecognitionSessionClient> (that is passed from the render
+// process).
 class SpeechRecognitionSession : public blink::mojom::SpeechRecognitionSession,
                                  public SpeechRecognitionEventListener {
  public:
   explicit SpeechRecognitionSession(
-      blink::mojom::SpeechRecognitionSessionClientPtrInfo client_ptr_info);
+      mojo::PendingRemote<blink::mojom::SpeechRecognitionSessionClient> client);
   ~SpeechRecognitionSession() override;
   base::WeakPtr<SpeechRecognitionSession> AsWeakPtr();
 
@@ -113,7 +116,7 @@
   void ConnectionErrorHandler();
 
   int session_id_;
-  blink::mojom::SpeechRecognitionSessionClientPtr client_;
+  mojo::Remote<blink::mojom::SpeechRecognitionSessionClient> client_;
   bool stopped_;
 
   base::WeakPtrFactory<SpeechRecognitionSession> weak_factory_{this};
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 6d2b19d..16ad4be 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -600,7 +600,7 @@
   return false;
 }
 
-bool ContentBrowserClient::BindAssociatedInterfaceRequestFromFrame(
+bool ContentBrowserClient::BindAssociatedReceiverFromFrame(
     RenderFrameHost* render_frame_host,
     const std::string& interface_name,
     mojo::ScopedInterfaceEndpointHandle* handle) {
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index c021a78c..97d1018 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -949,10 +949,10 @@
       RenderFrameHost* render_frame_host,
       mojo::PendingReceiver<blink::mojom::CredentialManager> receiver) {}
 
-  // Content was unable to bind a request for this associated interface, so the
+  // Content was unable to bind a receiver for this associated interface, so the
   // embedder should try. Returns true if the |handle| was actually taken and
   // bound; false otherwise.
-  virtual bool BindAssociatedInterfaceRequestFromFrame(
+  virtual bool BindAssociatedReceiverFromFrame(
       RenderFrameHost* render_frame_host,
       const std::string& interface_name,
       mojo::ScopedInterfaceEndpointHandle* handle);
diff --git a/content/renderer/media/inspector_media_event_handler.cc b/content/renderer/media/inspector_media_event_handler.cc
index 700146cd..504b278b 100644
--- a/content/renderer/media/inspector_media_event_handler.cc
+++ b/content/renderer/media/inspector_media_event_handler.cc
@@ -54,6 +54,14 @@
           event.type == media::MediaLogEvent::MEDIA_DEBUG_LOG_ENTRY) {
         event_type = blink::InspectorPlayerEvent::MESSAGE_EVENT;
       }
+      if (event.params.size() == 0) {
+        blink::InspectorPlayerEvent ev = {
+            blink::InspectorPlayerEvent::PLAYBACK_EVENT, event.time,
+            blink::WebString::FromUTF8("Event"),
+            blink::WebString::FromUTF8(
+                media::MediaLog::EventTypeToString(event.type))};
+        events.emplace_back(ev);
+      }
       for (auto&& itr : event.params.DictItems()) {
         blink::InspectorPlayerEvent ev = {event_type, event.time,
                                           blink::WebString::FromUTF8(itr.first),
diff --git a/content/renderer/media/inspector_media_event_handler_unittest.cc b/content/renderer/media/inspector_media_event_handler_unittest.cc
index 2564f99..fbcdbee 100644
--- a/content/renderer/media/inspector_media_event_handler_unittest.cc
+++ b/content/renderer/media/inspector_media_event_handler_unittest.cc
@@ -203,4 +203,26 @@
   handler_->SendQueuedMediaEvents(events);
 }
 
+TEST_F(InspectorMediaEventHandlerTest, PassesPlayAndPauseEvents) {
+  std::vector<media::MediaLogEvent> events = {
+      CreateEvent(media::MediaLogEvent::PLAY),
+      CreateEvent(media::MediaLogEvent::PAUSE)};
+
+  blink::InspectorPlayerEvents expected_events;
+  blink::InspectorPlayerEvent play = {
+      blink::InspectorPlayerEvent::PLAYBACK_EVENT, base::TimeTicks(),
+      blink::WebString::FromUTF8("Event"), blink::WebString::FromUTF8("PLAY")};
+  blink::InspectorPlayerEvent pause = {
+      blink::InspectorPlayerEvent::PLAYBACK_EVENT, base::TimeTicks(),
+      blink::WebString::FromUTF8("Event"), blink::WebString::FromUTF8("PAUSE")};
+  expected_events.emplace_back(play);
+  expected_events.emplace_back(pause);
+
+  EXPECT_CALL(*mock_context_,
+              MockNotifyPlayerEvents(EventsEqualTo(expected_events)))
+      .Times(1);
+
+  handler_->SendQueuedMediaEvents(events);
+}
+
 }  // namespace content
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 1ed4369a..ed589ca 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1095,7 +1095,7 @@
 }
 
 void RenderViewImpl::ApplyNewDisplayModeForWidget(
-    const blink::WebDisplayMode& new_display_mode) {
+    blink::WebDisplayMode new_display_mode) {
   webview()->SetDisplayMode(new_display_mode);
 }
 
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index fdf433b7..025be54 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -398,7 +398,7 @@
   bool ShouldAckSyntheticInputImmediately() override;
   void CancelPagePopupForWidget() override;
   void ApplyNewDisplayModeForWidget(
-      const blink::WebDisplayMode& new_display_mode) override;
+      blink::WebDisplayMode new_display_mode) override;
   void ApplyAutoResizeLimitsForWidget(const gfx::Size& min_size,
                                       const gfx::Size& max_size) override;
   void DisableAutoResizeForWidget() override;
diff --git a/content/renderer/render_widget_delegate.h b/content/renderer/render_widget_delegate.h
index 1259a59..1c4d714 100644
--- a/content/renderer/render_widget_delegate.h
+++ b/content/renderer/render_widget_delegate.h
@@ -52,7 +52,7 @@
   // display mode that will be applied to the RenderWidget. The display mode in
   // the RenderWidget is already changed when this method is called.
   virtual void ApplyNewDisplayModeForWidget(
-      const blink::WebDisplayMode& new_display_mode) = 0;
+      blink::WebDisplayMode new_display_mode) = 0;
   // Called during handling a SynchronizeVisualProperties message, if auto
   // resize is enabled, with the new auto size limits.
   virtual void ApplyAutoResizeLimitsForWidget(const gfx::Size& min_size,
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc
index 54e63b3..b43164a 100644
--- a/content/renderer/render_widget_unittest.cc
+++ b/content/renderer/render_widget_unittest.cc
@@ -537,7 +537,7 @@
   bool ShouldAckSyntheticInputImmediately() override { return true; }
   void CancelPagePopupForWidget() override {}
   void ApplyNewDisplayModeForWidget(
-      const blink::WebDisplayMode& new_display_mode) override {}
+      blink::WebDisplayMode new_display_mode) override {}
   void ApplyAutoResizeLimitsForWidget(const gfx::Size& min_size,
                                       const gfx::Size& max_size) override {}
   void DisableAutoResizeForWidget() override {}
diff --git a/device/fido/hid/fake_hid_impl_for_testing.cc b/device/fido/hid/fake_hid_impl_for_testing.cc
index 0ee4ba3..a81999c 100644
--- a/device/fido/hid/fake_hid_impl_for_testing.cc
+++ b/device/fido/hid/fake_hid_impl_for_testing.cc
@@ -25,9 +25,9 @@
 
 MockFidoHidConnection::MockFidoHidConnection(
     device::mojom::HidDeviceInfoPtr device,
-    device::mojom::HidConnectionRequest request,
+    mojo::PendingReceiver<device::mojom::HidConnection> receiver,
     std::array<uint8_t, 4> connection_channel_id)
-    : binding_(this, std::move(request)),
+    : receiver_(this, std::move(receiver)),
       device_(std::move(device)),
       connection_channel_id_(connection_channel_id) {}
 
@@ -156,9 +156,7 @@
     GetDevicesCallback callback) {
   GetDevices(std::move(callback));
 
-  device::mojom::HidManagerClientAssociatedPtr client_ptr;
-  client_ptr.Bind(std::move(client));
-  clients_.AddPtr(std::move(client_ptr));
+  clients_.Add(std::move(client));
 }
 
 void FakeFidoHidManager::GetDevices(GetDevicesCallback callback) {
@@ -176,7 +174,7 @@
   auto device_it = devices_.find(device_guid);
   auto connection_it = connections_.find(device_guid);
   if (device_it == devices_.end() || connection_it == connections_.end()) {
-    std::move(callback).Run(nullptr);
+    std::move(callback).Run(mojo::NullRemote());
     return;
   }
 
@@ -185,16 +183,15 @@
 
 void FakeFidoHidManager::AddDevice(device::mojom::HidDeviceInfoPtr device) {
   device::mojom::HidDeviceInfo* device_info = device.get();
-  clients_.ForAllPtrs([device_info](device::mojom::HidManagerClient* client) {
+  for (auto& client : clients_)
     client->DeviceAdded(device_info->Clone());
-  });
 
   devices_[device->guid] = std::move(device);
 }
 
 void FakeFidoHidManager::AddDeviceAndSetConnection(
     device::mojom::HidDeviceInfoPtr device,
-    device::mojom::HidConnectionPtr connection) {
+    mojo::PendingRemote<device::mojom::HidConnection> connection) {
   connections_[device->guid] = std::move(connection);
   AddDevice(std::move(device));
 }
@@ -205,9 +202,8 @@
     return;
 
   device::mojom::HidDeviceInfo* device_info = it->second.get();
-  clients_.ForAllPtrs([device_info](device::mojom::HidManagerClient* client) {
+  for (auto& client : clients_)
     client->DeviceRemoved(device_info->Clone());
-  });
   devices_.erase(it);
 }
 
diff --git a/device/fido/hid/fake_hid_impl_for_testing.h b/device/fido/hid/fake_hid_impl_for_testing.h
index 0908a4c..d72f4c3e 100644
--- a/device/fido/hid/fake_hid_impl_for_testing.h
+++ b/device/fido/hid/fake_hid_impl_for_testing.h
@@ -14,10 +14,11 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "device/fido/fido_constants.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/public/mojom/hid.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
@@ -29,9 +30,10 @@
 
 class MockFidoHidConnection : public device::mojom::HidConnection {
  public:
-  explicit MockFidoHidConnection(device::mojom::HidDeviceInfoPtr device,
-                                 device::mojom::HidConnectionRequest request,
-                                 std::array<uint8_t, 4> connection_channel_id);
+  explicit MockFidoHidConnection(
+      device::mojom::HidDeviceInfoPtr device,
+      mojo::PendingReceiver<device::mojom::HidConnection> receiver,
+      std::array<uint8_t, 4> connection_channel_id);
 
   ~MockFidoHidConnection() override;
   MOCK_METHOD1(ReadPtr, void(ReadCallback* callback));
@@ -62,7 +64,7 @@
   const std::vector<uint8_t>& nonce() const { return nonce_; }
 
  private:
-  mojo::Binding<device::mojom::HidConnection> binding_;
+  mojo::Receiver<device::mojom::HidConnection> receiver_;
   device::mojom::HidDeviceInfoPtr device_;
   std::vector<uint8_t> nonce_;
   std::array<uint8_t, 4> connection_channel_id_;
@@ -115,14 +117,16 @@
   void AddReceiver(mojo::ScopedMessagePipeHandle handle);
   void AddReceiver2(mojo::PendingReceiver<device::mojom::HidManager> receiver);
   void AddDevice(device::mojom::HidDeviceInfoPtr device);
-  void AddDeviceAndSetConnection(device::mojom::HidDeviceInfoPtr device,
-                                 device::mojom::HidConnectionPtr connection);
+  void AddDeviceAndSetConnection(
+      device::mojom::HidDeviceInfoPtr device,
+      mojo::PendingRemote<device::mojom::HidConnection> connection);
   void RemoveDevice(const std::string device_guid);
 
  private:
   std::map<std::string, device::mojom::HidDeviceInfoPtr> devices_;
-  std::map<std::string, device::mojom::HidConnectionPtr> connections_;
-  mojo::AssociatedInterfacePtrSet<device::mojom::HidManagerClient> clients_;
+  std::map<std::string, mojo::PendingRemote<device::mojom::HidConnection>>
+      connections_;
+  mojo::AssociatedRemoteSet<device::mojom::HidManagerClient> clients_;
   mojo::ReceiverSet<device::mojom::HidManager> receivers_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeFidoHidManager);
diff --git a/device/fido/hid/fido_hid_device.cc b/device/fido/hid/fido_hid_device.cc
index a90c2a7..d581712e 100644
--- a/device/fido/hid/fido_hid_device.cc
+++ b/device/fido/hid/fido_hid_device.cc
@@ -181,7 +181,8 @@
                         std::move(callback));
 }
 
-void FidoHidDevice::OnConnect(device::mojom::HidConnectionPtr connection) {
+void FidoHidDevice::OnConnect(
+    mojo::PendingRemote<device::mojom::HidConnection> connection) {
   timeout_callback_.Cancel();
 
   if (!connection) {
@@ -189,7 +190,7 @@
     return;
   }
 
-  connection_ = std::move(connection);
+  connection_.Bind(std::move(connection));
   // Send random nonce to device to verify received message.
   std::vector<uint8_t> nonce(8);
   crypto::RandBytes(nonce.data(), nonce.size());
diff --git a/device/fido/hid/fido_hid_device.h b/device/fido/hid/fido_hid_device.h
index 8c4bc8c5..c36efd70 100644
--- a/device/fido/hid/fido_hid_device.h
+++ b/device/fido/hid/fido_hid_device.h
@@ -19,6 +19,8 @@
 #include "components/apdu/apdu_command.h"
 #include "components/apdu/apdu_response.h"
 #include "device/fido/fido_device.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
 namespace device {
@@ -92,7 +94,7 @@
 
   // Open a connection to this device.
   void Connect(device::mojom::HidManager::ConnectCallback callback);
-  void OnConnect(device::mojom::HidConnectionPtr connection);
+  void OnConnect(mojo::PendingRemote<device::mojom::HidConnection> connection);
   void OnInitWriteComplete(std::vector<uint8_t> nonce, bool success);
   // Ask device to allocate a unique channel id for this connection.
   void OnAllocateChannel(std::vector<uint8_t> nonce,
@@ -145,7 +147,7 @@
   // U2fRequest.
   device::mojom::HidManager* hid_manager_;
   device::mojom::HidDeviceInfoPtr device_info_;
-  device::mojom::HidConnectionPtr connection_;
+  mojo::Remote<device::mojom::HidConnection> connection_;
   base::WeakPtrFactory<FidoHidDevice> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(FidoHidDevice);
diff --git a/device/fido/hid/fido_hid_device_unittest.cc b/device/fido/hid/fido_hid_device_unittest.cc
index a40e701..c229fc1 100644
--- a/device/fido/hid/fido_hid_device_unittest.cc
+++ b/device/fido/hid/fido_hid_device_unittest.cc
@@ -136,12 +136,13 @@
     FakeFidoHidManager* fake_hid_manager,
     ::testing::Sequence sequence) {
   auto hid_device = TestHidDevice();
-  device::mojom::HidConnectionPtr connection_client;
+  mojo::PendingRemote<device::mojom::HidConnection> connection_client;
 
   // Replace device HID connection with custom client connection bound to mock
   // server-side mojo connection.
   auto mock_connection = std::make_unique<MockFidoHidConnection>(
-      hid_device.Clone(), mojo::MakeRequest(&connection_client), channel_id);
+      hid_device.Clone(), connection_client.InitWithNewPipeAndPassReceiver(),
+      channel_id);
 
   // Initial write for establishing channel ID.
   mock_connection->ExpectWriteHidInit();
@@ -283,9 +284,10 @@
 
   // Replace device HID connection with custom client connection bound to mock
   // server-side mojo connection.
-  device::mojom::HidConnectionPtr connection_client;
+  mojo::PendingRemote<device::mojom::HidConnection> connection_client;
   MockFidoHidConnection mock_connection(
-      hid_device.Clone(), mojo::MakeRequest(&connection_client), kChannelId);
+      hid_device.Clone(), connection_client.InitWithNewPipeAndPassReceiver(),
+      kChannelId);
 
   // Initial write for establishing a channel ID.
   mock_connection.ExpectWriteHidInit();
@@ -883,9 +885,10 @@
 
   // Replace device HID connection with custom client connection bound to mock
   // server-side mojo connection.
-  device::mojom::HidConnectionPtr connection_client;
+  mojo::PendingRemote<device::mojom::HidConnection> connection_client;
   MockFidoHidConnection mock_connection(
-      hid_device.Clone(), mojo::MakeRequest(&connection_client), kChannelId);
+      hid_device.Clone(), connection_client.InitWithNewPipeAndPassReceiver(),
+      kChannelId);
 
   // Initial write for establishing a channel ID.
   mock_connection.ExpectWriteHidInit();
@@ -943,9 +946,10 @@
 
   // Replace device HID connection with custom client connection bound to mock
   // server-side mojo connection.
-  device::mojom::HidConnectionPtr connection_client;
+  mojo::PendingRemote<device::mojom::HidConnection> connection_client;
   MockFidoHidConnection mock_connection(
-      hid_device.Clone(), mojo::MakeRequest(&connection_client), kChannelId);
+      hid_device.Clone(), connection_client.InitWithNewPipeAndPassReceiver(),
+      kChannelId);
 
   // Initial write for establishing a channel ID.
   mock_connection.ExpectWriteHidInit();
@@ -998,9 +1002,10 @@
 
   // Replace device HID connection with custom client connection bound to mock
   // server-side mojo connection.
-  device::mojom::HidConnectionPtr connection_client;
+  mojo::PendingRemote<device::mojom::HidConnection> connection_client;
   MockFidoHidConnection mock_connection(
-      hid_device.Clone(), mojo::MakeRequest(&connection_client), kChannelId);
+      hid_device.Clone(), connection_client.InitWithNewPipeAndPassReceiver(),
+      kChannelId);
 
   // Initial write for establishing a channel ID.
   mock_connection.ExpectWriteHidInit();
diff --git a/device/fido/hid/fido_hid_discovery.cc b/device/fido/hid/fido_hid_discovery.cc
index eb75c3bd..cd80cf0f 100644
--- a/device/fido/hid/fido_hid_discovery.cc
+++ b/device/fido/hid/fido_hid_discovery.cc
@@ -8,7 +8,6 @@
 
 #include "base/bind.h"
 #include "device/fido/hid/fido_hid_device.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
 #include "services/device/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
@@ -16,8 +15,7 @@
 
 FidoHidDiscovery::FidoHidDiscovery(::service_manager::Connector* connector)
     : FidoDeviceDiscovery(FidoTransportProtocol::kUsbHumanInterfaceDevice),
-      connector_(connector),
-      binding_(this) {
+      connector_(connector) {
   // TODO(piperc@): Give this constant a name.
   filter_.SetUsagePage(0xf1d0);
 }
@@ -28,12 +26,11 @@
   DCHECK(connector_);
   connector_->Connect(device::mojom::kServiceName,
                       hid_manager_.BindNewPipeAndPassReceiver());
-  device::mojom::HidManagerClientAssociatedPtrInfo client;
-  binding_.Bind(mojo::MakeRequest(&client));
 
   hid_manager_->GetDevicesAndSetClient(
-      std::move(client), base::BindOnce(&FidoHidDiscovery::OnGetDevices,
-                                        weak_factory_.GetWeakPtr()));
+      receiver_.BindNewEndpointAndPassRemote(),
+      base::BindOnce(&FidoHidDiscovery::OnGetDevices,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void FidoHidDiscovery::DeviceAdded(
diff --git a/device/fido/hid/fido_hid_discovery.h b/device/fido/hid/fido_hid_discovery.h
index 03322c10..25772ae2 100644
--- a/device/fido/hid/fido_hid_discovery.h
+++ b/device/fido/hid/fido_hid_discovery.h
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "device/fido/fido_device_discovery.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/cpp/hid/hid_device_filter.h"
 #include "services/device/public/mojom/hid.mojom.h"
@@ -45,7 +45,7 @@
 
   service_manager::Connector* connector_;
   mojo::Remote<device::mojom::HidManager> hid_manager_;
-  mojo::AssociatedBinding<device::mojom::HidManagerClient> binding_;
+  mojo::AssociatedReceiver<device::mojom::HidManagerClient> receiver_{this};
   HidDeviceFilter filter_;
   base::WeakPtrFactory<FidoHidDiscovery> weak_factory_{this};
 
diff --git a/device/gamepad/gamepad_monitor.cc b/device/gamepad/gamepad_monitor.cc
index 905fb7b..f88e28b 100644
--- a/device/gamepad/gamepad_monitor.cc
+++ b/device/gamepad/gamepad_monitor.cc
@@ -14,10 +14,10 @@
 
 namespace device {
 
-GamepadMonitor::GamepadMonitor() : is_started_(false) {}
+GamepadMonitor::GamepadMonitor() = default;
 
 GamepadMonitor::~GamepadMonitor() {
-  if (is_started_)
+  if (is_registered_consumer_)
     GamepadService::GetInstance()->RemoveConsumer(this);
 }
 
@@ -49,6 +49,7 @@
 void GamepadMonitor::GamepadStartPolling(GamepadStartPollingCallback callback) {
   DCHECK(!is_started_);
   is_started_ = true;
+  is_registered_consumer_ = true;
 
   GamepadService* service = GamepadService::GetInstance();
   service->ConsumerBecameActive(this);
diff --git a/device/gamepad/gamepad_monitor.h b/device/gamepad/gamepad_monitor.h
index 870b97d..9092f8c 100644
--- a/device/gamepad/gamepad_monitor.h
+++ b/device/gamepad/gamepad_monitor.h
@@ -37,7 +37,12 @@
 
  private:
   mojo::Remote<mojom::GamepadObserver> gamepad_observer_remote_;
-  bool is_started_;
+
+  // True if this monitor is an active gamepad consumer.
+  bool is_started_ = false;
+
+  // True if this monitor has been registered with the gamepad service.
+  bool is_registered_consumer_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(GamepadMonitor);
 };
diff --git a/device/gamepad/nintendo_controller.cc b/device/gamepad/nintendo_controller.cc
index 278e252..375c8df3 100644
--- a/device/gamepad/nintendo_controller.cc
+++ b/device/gamepad/nintendo_controller.cc
@@ -1147,9 +1147,10 @@
                         std::move(callback));
 }
 
-void NintendoController::OnConnect(mojom::HidConnectionPtr connection) {
+void NintendoController::OnConnect(
+    mojo::PendingRemote<mojom::HidConnection> connection) {
   if (connection) {
-    connection_ = std::move(connection);
+    connection_.Bind(std::move(connection));
     ReadInputReport();
     StartInitSequence();
   }
diff --git a/device/gamepad/nintendo_controller.h b/device/gamepad/nintendo_controller.h
index 0a2cb9c1..4fcda6b1 100644
--- a/device/gamepad/nintendo_controller.h
+++ b/device/gamepad/nintendo_controller.h
@@ -15,6 +15,8 @@
 #include "device/gamepad/gamepad_id_list.h"
 #include "device/gamepad/gamepad_standard_mappings.h"
 #include "device/gamepad/public/cpp/gamepad.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
 namespace device {
@@ -238,7 +240,7 @@
   void Connect(mojom::HidManager::ConnectCallback callback);
 
   // Completion callback for the HID connection request.
-  void OnConnect(mojom::HidConnectionPtr connection);
+  void OnConnect(mojo::PendingRemote<mojom::HidConnection> connection);
 
   // Initiate the sequence of exchanges to prepare the device to provide
   // controller data.
@@ -398,7 +400,7 @@
   mojom::HidManager* const hid_manager_;
 
   // The open connection to the underlying HID device.
-  mojom::HidConnectionPtr connection_;
+  mojo::Remote<mojom::HidConnection> connection_;
 
   // A closure, provided in the call to Open, to be called once the device
   // becomes ready.
diff --git a/device/gamepad/nintendo_data_fetcher.cc b/device/gamepad/nintendo_data_fetcher.cc
index 97a801f..ee356fc 100644
--- a/device/gamepad/nintendo_data_fetcher.cc
+++ b/device/gamepad/nintendo_data_fetcher.cc
@@ -14,7 +14,7 @@
 
 namespace device {
 
-NintendoDataFetcher::NintendoDataFetcher() : binding_(this) {}
+NintendoDataFetcher::NintendoDataFetcher() = default;
 
 NintendoDataFetcher::~NintendoDataFetcher() {
   for (auto& entry : controllers_) {
@@ -32,11 +32,10 @@
   // OnGetDevices will be called with a list of connected HID devices.
   connector()->Connect(mojom::kServiceName,
                        hid_manager_.BindNewPipeAndPassReceiver());
-  mojom::HidManagerClientAssociatedPtrInfo client;
-  binding_.Bind(mojo::MakeRequest(&client));
   hid_manager_->GetDevicesAndSetClient(
-      std::move(client), base::BindOnce(&NintendoDataFetcher::OnGetDevices,
-                                        weak_factory_.GetWeakPtr()));
+      receiver_.BindNewEndpointAndPassRemote(),
+      base::BindOnce(&NintendoDataFetcher::OnGetDevices,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void NintendoDataFetcher::OnGetDevices(
diff --git a/device/gamepad/nintendo_data_fetcher.h b/device/gamepad/nintendo_data_fetcher.h
index 8437aac4..776544e 100644
--- a/device/gamepad/nintendo_data_fetcher.h
+++ b/device/gamepad/nintendo_data_fetcher.h
@@ -14,7 +14,7 @@
 #include "device/gamepad/gamepad_data_fetcher.h"
 #include "device/gamepad/nintendo_controller.h"
 #include "device/gamepad/public/cpp/gamepads.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
@@ -112,7 +112,7 @@
   ControllerMap controllers_;
 
   mojo::Remote<mojom::HidManager> hid_manager_;
-  mojo::AssociatedBinding<mojom::HidManagerClient> binding_;
+  mojo::AssociatedReceiver<mojom::HidManagerClient> receiver_{this};
   base::WeakPtrFactory<NintendoDataFetcher> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(NintendoDataFetcher);
diff --git a/extensions/browser/api/declarative_net_request/action_tracker.cc b/extensions/browser/api/declarative_net_request/action_tracker.cc
index 037a9d4..f0ffa24d 100644
--- a/extensions/browser/api/declarative_net_request/action_tracker.cc
+++ b/extensions/browser/api/declarative_net_request/action_tracker.cc
@@ -22,21 +22,18 @@
   DCHECK(actions_matched_.empty());
 }
 
-void ActionTracker::OnRuleMatched(const std::vector<ExtensionId>& extension_ids,
-                                  int tab_id) {
+void ActionTracker::OnRuleMatched(const ExtensionId& extension_id, int tab_id) {
   if (tab_id == extension_misc::kUnknownTabId)
     return;
 
-  for (const auto& extension_id : extension_ids) {
-    auto key = std::make_pair(extension_id, tab_id);
-    int action_count = ++actions_matched_[key];
+  auto key = std::make_pair(extension_id, tab_id);
+  int action_count = ++actions_matched_[key];
 
-    if (extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)) {
-      DCHECK(ExtensionsAPIClient::Get());
-      ExtensionsAPIClient::Get()->UpdateActionCount(
-          browser_context_, extension_id, tab_id, action_count,
-          false /* clear_badge_text */);
-    }
+  if (extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)) {
+    DCHECK(ExtensionsAPIClient::Get());
+    ExtensionsAPIClient::Get()->UpdateActionCount(
+        browser_context_, extension_id, tab_id, action_count,
+        false /* clear_badge_text */);
   }
 }
 
diff --git a/extensions/browser/api/declarative_net_request/action_tracker.h b/extensions/browser/api/declarative_net_request/action_tracker.h
index 3933d7e..02cdb2eb 100644
--- a/extensions/browser/api/declarative_net_request/action_tracker.h
+++ b/extensions/browser/api/declarative_net_request/action_tracker.h
@@ -27,7 +27,7 @@
   ~ActionTracker();
 
   // Called whenever a request matches with a rule.
-  void OnRuleMatched(const std::vector<ExtensionId>& extension_ids, int tab_id);
+  void OnRuleMatched(const ExtensionId& extension_id, int tab_id);
 
   // Updates the action count for all tabs for the specified |extension_id|'s
   // extension action. Called when chrome.setActionCountAsBadgeText(true) is
diff --git a/extensions/browser/api/declarative_net_request/composite_matcher.cc b/extensions/browser/api/declarative_net_request/composite_matcher.cc
index 1a1e635..d1aabd6 100644
--- a/extensions/browser/api/declarative_net_request/composite_matcher.cc
+++ b/extensions/browser/api/declarative_net_request/composite_matcher.cc
@@ -189,14 +189,16 @@
 }
 
 uint8_t CompositeMatcher::GetRemoveHeadersMask(const RequestParams& params,
-                                               uint8_t current_mask) const {
-  uint8_t mask = current_mask;
+                                               uint8_t ignored_mask) const {
+  uint8_t mask = 0;
   for (const auto& matcher : matchers_) {
     // The allow rule will override lower priority remove header rules.
     if (HasMatchingAllowRule(matcher.get(), params))
       return mask;
-    mask |= matcher->GetRemoveHeadersMask(params, mask);
+    mask |= matcher->GetRemoveHeadersMask(params, mask | ignored_mask);
   }
+
+  DCHECK(!(mask & ignored_mask));
   return mask;
 }
 
diff --git a/extensions/browser/api/declarative_net_request/composite_matcher.h b/extensions/browser/api/declarative_net_request/composite_matcher.h
index 0976f55..b4cf781 100644
--- a/extensions/browser/api/declarative_net_request/composite_matcher.h
+++ b/extensions/browser/api/declarative_net_request/composite_matcher.h
@@ -60,11 +60,12 @@
       const RequestParams& params,
       PermissionsData::PageAccess page_access) const;
 
-  // Returns the bitmask of headers to remove from the request. The bitmask
-  // corresponds to RemoveHeadersMask type. |current_mask| denotes the current
-  // mask of headers to be removed and is included in the return value.
+  // Returns the bitmask of headers to remove from the request corresponding to
+  // rules matched from this extension. The bitmask corresponds to
+  // RemoveHeadersMask type. |ignored_mask| denotes the current mask of headers
+  // to be skipped for evaluation and is excluded in the return value.
   uint8_t GetRemoveHeadersMask(const RequestParams& params,
-                               uint8_t current_mask) const;
+                               uint8_t ignored_mask) const;
 
   // Returns whether this modifies "extraHeaders".
   bool HasAnyExtraHeadersMatcher() const;
diff --git a/extensions/browser/api/declarative_net_request/ruleset_manager.cc b/extensions/browser/api/declarative_net_request/ruleset_manager.cc
index a8f1ebd..61bd400 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_manager.cc
+++ b/extensions/browser/api/declarative_net_request/ruleset_manager.cc
@@ -326,7 +326,7 @@
   ClearRendererCacheOnNavigation();
 }
 
-const RulesetManager::Action& RulesetManager::EvaluateRequest(
+const std::vector<RulesetManager::Action>& RulesetManager::EvaluateRequest(
     const WebRequestInfo& request,
     bool is_incognito_context) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -337,10 +337,12 @@
   // |is_incognito_context| will stay the same for a given |request|. This also
   // assumes that the core state of the WebRequestInfo isn't changed between the
   // different EvaluateRequest invocations.
-  if (!request.dnr_action)
-    request.dnr_action = EvaluateRequestInternal(request, is_incognito_context);
+  if (request.dnr_actions.empty()) {
+    request.dnr_actions =
+        EvaluateRequestInternal(request, is_incognito_context);
+  }
 
-  return *request.dnr_action;
+  return request.dnr_actions;
 }
 
 bool RulesetManager::HasAnyExtraHeadersMatcher() const {
@@ -357,7 +359,8 @@
 bool RulesetManager::HasExtraHeadersMatcherForRequest(
     const WebRequestInfo& request,
     bool is_incognito_context) const {
-  const Action& action = EvaluateRequest(request, is_incognito_context);
+  const std::vector<Action>& actions =
+      EvaluateRequest(request, is_incognito_context);
 
   // We only support removing a subset of extra headers currently. If that
   // changes, the implementation here should change as well.
@@ -365,7 +368,12 @@
                 "Modify this method to ensure HasExtraHeadersMatcherForRequest "
                 "is updated as new actions are added.");
 
-  return action.type == Action::Type::REMOVE_HEADERS;
+  for (const auto& action : actions) {
+    if (action.type == Action::Type::REMOVE_HEADERS)
+      return true;
+  }
+
+  return false;
 }
 
 void RulesetManager::SetObserverForTest(TestObserver* observer) {
@@ -404,7 +412,7 @@
       Action action = ShouldCollapseResourceType(params.element_type)
                           ? Action(Action::Type::COLLAPSE)
                           : Action(Action::Type::BLOCK);
-      action.extension_ids.push_back(ruleset->extension_id);
+      action.extension_id = ruleset->extension_id;
       return action;
     }
   }
@@ -451,48 +459,59 @@
 
     Action action(Action::Type::REDIRECT);
     action.redirect_url = std::move(redirect_action.redirect_url);
-    action.extension_ids.push_back(ruleset->extension_id);
+    action.extension_id = ruleset->extension_id;
     return action;
   }
 
   return base::nullopt;
 }
 
-base::Optional<RulesetManager::Action> RulesetManager::GetRemoveHeadersAction(
+std::vector<RulesetManager::Action> RulesetManager::GetRemoveHeadersActions(
     const std::vector<const ExtensionRulesetData*>& rulesets,
     const RequestParams& params) const {
-  Action action(Action::Type::REMOVE_HEADERS);
-  uint8_t mask = 0;
-  for (const ExtensionRulesetData* ruleset : rulesets) {
-    uint8_t ruleset_mask = ruleset->matcher->GetRemoveHeadersMask(params, mask);
-    if (ruleset_mask)
-      action.extension_ids.push_back(ruleset->extension_id);
+  std::vector<Action> remove_headers_actions;
 
-    mask |= ruleset_mask;
+  // Keep a combined mask of all headers to be removed to be passed into
+  // GetRemoveHeadersMask. This is done to ensure the ruleset matchers will skip
+  // matching rules for headers already slated to be removed.
+  uint8_t combined_mask = 0;
+  for (const ExtensionRulesetData* ruleset : rulesets) {
+    uint8_t ruleset_mask = ruleset->matcher->GetRemoveHeadersMask(
+        params, combined_mask /* ignored_mask */);
+    if (!ruleset_mask)
+      continue;
+
+    Action action(Action::Type::REMOVE_HEADERS);
+    PopulateHeadersFromMask(ruleset_mask, &action.request_headers_to_remove,
+                            &action.response_headers_to_remove);
+    action.extension_id = ruleset->extension_id;
+    remove_headers_actions.push_back(std::move(action));
+    combined_mask |= ruleset_mask;
   }
 
-  if (!mask)
-    return base::nullopt;
-
-  PopulateHeadersFromMask(mask, &action.request_headers_to_remove,
-                          &action.response_headers_to_remove);
-  return action;
+  return remove_headers_actions;
 }
 
-RulesetManager::Action RulesetManager::EvaluateRequestInternal(
+std::vector<RulesetManager::Action> RulesetManager::EvaluateRequestInternal(
     const WebRequestInfo& request,
     bool is_incognito_context) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!request.dnr_action);
+  DCHECK(request.dnr_actions.empty());
 
-  if (!ShouldEvaluateRequest(request))
-    return Action(Action::Type::NONE);
+  std::vector<Action> actions;
+
+  if (!ShouldEvaluateRequest(request)) {
+    actions.emplace_back(Action::Type::NONE);
+    return actions;
+  }
 
   if (test_observer_)
     test_observer_->OnEvaluateRequest(request, is_incognito_context);
 
-  if (rulesets_.empty())
-    return Action(Action::Type::NONE);
+  if (rulesets_.empty()) {
+    actions.emplace_back(Action::Type::NONE);
+    return actions;
+  }
 
   SCOPED_UMA_HISTOGRAM_TIMER(
       "Extensions.DeclarativeNetRequest.EvaluateRequestTime.AllExtensions2");
@@ -532,24 +551,31 @@
   // If the request is blocked, no further modifications can happen.
   base::Optional<Action> action =
       GetBlockOrCollapseAction(rulesets_to_evaluate, params);
-  if (action)
-    return std::move(*action);
+  if (action) {
+    actions.push_back(std::move(std::move(*action)));
+    return actions;
+  }
 
   // If the request is redirected, no further modifications can happen. A new
   // request will be created and subsequently evaluated.
   action = GetRedirectOrUpgradeAction(rulesets_to_evaluate, request, tab_id,
                                       crosses_incognito, params);
-  if (action)
-    return std::move(*action);
+  if (action) {
+    actions.push_back(std::move(std::move(*action)));
+    return actions;
+  }
 
   // Removing headers doesn't require host permissions.
   // Note: If we add other "non-destructive" actions (i.e., actions that don't
   // end the request), we should combine them with the remove-headers action.
-  action = GetRemoveHeadersAction(rulesets_to_evaluate, params);
-  if (action)
-    return std::move(*action);
+  std::vector<Action> remove_headers_actions =
+      GetRemoveHeadersActions(rulesets_to_evaluate, params);
 
-  return Action(Action::Type::NONE);
+  if (!remove_headers_actions.empty())
+    return remove_headers_actions;
+
+  actions.emplace_back(Action::Type::NONE);
+  return actions;
 }
 
 bool RulesetManager::ShouldEvaluateRequest(
diff --git a/extensions/browser/api/declarative_net_request/ruleset_manager.h b/extensions/browser/api/declarative_net_request/ruleset_manager.h
index 7f7bef6..df3c237 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_manager.h
+++ b/extensions/browser/api/declarative_net_request/ruleset_manager.h
@@ -62,10 +62,9 @@
     // Valid iff |type| is |REDIRECT|.
     base::Optional<GURL> redirect_url;
 
-    // The ids of the extensions the action is attributed to.
-    // TODO(crbug.com/991420): This is not exactly correct for attributing
-    // an Action to the extension(s) for |REMOVE_HEADERS| rules.
-    std::vector<ExtensionId> extension_ids;
+    // The id of the extension the action is attributed to. Valid iff |type| is
+    // not |NONE|.
+    base::Optional<ExtensionId> extension_id;
 
     // Valid iff |type| is |REMOVE_HEADERS|. The vectors point to strings of
     // static storage duration.
@@ -113,8 +112,8 @@
   // Precedence order: Allow > Blocking > Redirect rules.
   // For redirect rules, most recently installed extensions are given
   // preference.
-  const Action& EvaluateRequest(const WebRequestInfo& request,
-                                bool is_incognito_context) const;
+  const std::vector<Action>& EvaluateRequest(const WebRequestInfo& request,
+                                             bool is_incognito_context) const;
 
   // Returns true if there is an active matcher which modifies "extraHeaders".
   bool HasAnyExtraHeadersMatcher() const;
@@ -162,13 +161,13 @@
       const int tab_id,
       const bool crosses_incognito,
       const RequestParams& params) const;
-  base::Optional<Action> GetRemoveHeadersAction(
+  std::vector<Action> GetRemoveHeadersActions(
       const std::vector<const ExtensionRulesetData*>& rulesets,
       const RequestParams& params) const;
 
   // Helper for EvaluateRequest.
-  Action EvaluateRequestInternal(const WebRequestInfo& request,
-                                 bool is_incognito_context) const;
+  std::vector<Action> EvaluateRequestInternal(const WebRequestInfo& request,
+                                              bool is_incognito_context) const;
 
   // Returns true if the given |request| should be evaluated for
   // blocking/redirection.
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher.cc b/extensions/browser/api/declarative_net_request/ruleset_matcher.cc
index 0e8e5a3..b146e0b 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_matcher.cc
+++ b/extensions/browser/api/declarative_net_request/ruleset_matcher.cc
@@ -351,8 +351,8 @@
 RulesetMatcher::~RulesetMatcher() = default;
 
 uint8_t RulesetMatcher::GetRemoveHeadersMask(const RequestParams& params,
-                                             uint8_t current_mask) const {
-  uint8_t mask = current_mask;
+                                             uint8_t ignored_mask) const {
+  uint8_t mask = 0;
 
   static_assert(kRemoveHeadersMask_Max <= std::numeric_limits<uint8_t>::max(),
                 "RemoveHeadersMask can't fit in a uint8_t");
@@ -365,21 +365,21 @@
         break;
       case dnr_api::REMOVE_HEADER_TYPE_COOKIE:
         bit = kRemoveHeadersMask_Cookie;
-        if (mask & bit)
+        if (ignored_mask & bit)
           break;
         if (GetMatchingRule(params, flat::ActionIndex_remove_cookie_header))
           mask |= bit;
         break;
       case dnr_api::REMOVE_HEADER_TYPE_REFERER:
         bit = kRemoveHeadersMask_Referer;
-        if (mask & bit)
+        if (ignored_mask & bit)
           break;
         if (GetMatchingRule(params, flat::ActionIndex_remove_referer_header))
           mask |= bit;
         break;
       case dnr_api::REMOVE_HEADER_TYPE_SETCOOKIE:
         bit = kRemoveHeadersMask_SetCookie;
-        if (mask & bit)
+        if (ignored_mask & bit)
           break;
         if (GetMatchingRule(params, flat::ActionIndex_remove_set_cookie_header))
           mask |= bit;
@@ -387,6 +387,7 @@
     }
   }
 
+  DCHECK(!(mask & ignored_mask));
   return mask;
 }
 
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher.h b/extensions/browser/api/declarative_net_request/ruleset_matcher.h
index bab2d624..3535d9f 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_matcher.h
+++ b/extensions/browser/api/declarative_net_request/ruleset_matcher.h
@@ -53,8 +53,7 @@
 // RulesetMatcher encapsulates the Declarative Net Request API ruleset
 // corresponding to a single RulesetSource. This uses the url_pattern_index
 // component to achieve fast matching of network requests against declarative
-// rules. Since this class is immutable, it is thread-safe. In practice it is
-// accessed on the IO thread but created on a sequence where file IO is allowed.
+// rules. Since this class is immutable, it is thread-safe.
 class RulesetMatcher {
  public:
   // Describes the result of creating a RulesetMatcher instance.
@@ -105,10 +104,10 @@
   }
 
   // Returns the bitmask of headers to remove from the request. The bitmask
-  // corresponds to RemoveHeadersMask type. |current_mask| denotes the current
-  // mask of headers to be removed and is included in the return value.
+  // corresponds to RemoveHeadersMask type. |ignored_mask| denotes the mask of
+  // headers to be skipped for evaluation and is excluded in the return value.
   uint8_t GetRemoveHeadersMask(const RequestParams& params,
-                               uint8_t current_mask) const;
+                               uint8_t ignored_mask) const;
 
   // Returns the ruleset's matching redirect rule and populates
   // |redirect_url| if there is a matching redirect rule, otherwise returns
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc b/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
index 3df466c..54cfa1f 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
+++ b/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
@@ -193,25 +193,30 @@
   params.url = &example_url;
   params.element_type = url_pattern_index::flat::ElementType_SUBDOCUMENT;
   params.is_third_party = true;
-  EXPECT_EQ(0u, matcher->GetRemoveHeadersMask(params, 0u /* current_mask */));
+  EXPECT_EQ(0u, matcher->GetRemoveHeadersMask(params, 0u /* ignored_mask */));
 
   rule.action->type = std::string("removeHeaders");
   rule.action->remove_headers_list =
-      std::vector<std::string>({"referer", "setCookie"});
+      std::vector<std::string>({"referer", "cookie", "setCookie"});
   ASSERT_TRUE(CreateVerifiedMatcher({rule}, CreateTemporarySource(), &matcher));
   EXPECT_TRUE(matcher->IsExtraHeadersMatcher());
-  EXPECT_EQ(kRemoveHeadersMask_Referer | kRemoveHeadersMask_SetCookie,
-            matcher->GetRemoveHeadersMask(params, 0u /* current_mask */));
+  EXPECT_EQ(kRemoveHeadersMask_Referer | kRemoveHeadersMask_Cookie |
+                kRemoveHeadersMask_SetCookie,
+            matcher->GetRemoveHeadersMask(params, 0u /* ignored_mask */));
 
   GURL google_url("http://google.com");
   params.url = &google_url;
-  EXPECT_EQ(0u, matcher->GetRemoveHeadersMask(params, 0u /* current_mask */));
+  EXPECT_EQ(0u, matcher->GetRemoveHeadersMask(params, 0u /* ignored_mask */));
 
-  // The current mask is ignored while matching and returned as part of the
-  // result.
-  uint8_t current_mask =
+  uint8_t ignored_mask =
       kRemoveHeadersMask_Referer | kRemoveHeadersMask_SetCookie;
-  EXPECT_EQ(current_mask, matcher->GetRemoveHeadersMask(params, current_mask));
+  EXPECT_EQ(0u, matcher->GetRemoveHeadersMask(params, ignored_mask));
+
+  // The current mask is ignored while matching and is not returned as part of
+  // the result.
+  params.url = &example_url;
+  EXPECT_EQ(kRemoveHeadersMask_Cookie,
+            matcher->GetRemoveHeadersMask(params, ignored_mask));
 }
 
 // Tests a rule to redirect to an extension path.
diff --git a/extensions/browser/api/device_permissions_prompt.cc b/extensions/browser/api/device_permissions_prompt.cc
index 7a43763f..e0a35f0e 100644
--- a/extensions/browser/api/device_permissions_prompt.cc
+++ b/extensions/browser/api/device_permissions_prompt.cc
@@ -20,8 +20,7 @@
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/api/usb/usb_device_manager.h"
 #include "extensions/common/extension.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/cpp/hid/hid_device_filter.h"
 #include "services/device/public/cpp/hid/hid_usage_and_page.h"
@@ -195,8 +194,7 @@
       : Prompt(extension, context, multiple),
         initialized_(false),
         filters_(filters),
-        callback_(callback),
-        binding_(this) {}
+        callback_(callback) {}
 
  private:
   ~HidDevicePermissionsPrompt() override {}
@@ -221,11 +219,8 @@
     connector->Connect(device::mojom::kServiceName,
                        hid_manager_.BindNewPipeAndPassReceiver());
 
-    device::mojom::HidManagerClientAssociatedPtrInfo client;
-    binding_.Bind(mojo::MakeRequest(&client));
-
     hid_manager_->GetDevicesAndSetClient(
-        std::move(client),
+        receiver_.BindNewEndpointAndPassRemote(),
         base::BindOnce(&HidDevicePermissionsPrompt::OnDevicesEnumerated, this));
 
     initialized_ = true;
@@ -300,7 +295,7 @@
   std::vector<HidDeviceFilter> filters_;
   mojo::Remote<device::mojom::HidManager> hid_manager_;
   DevicePermissionsPrompt::HidDevicesCallback callback_;
-  mojo::AssociatedBinding<device::mojom::HidManagerClient> binding_;
+  mojo::AssociatedReceiver<device::mojom::HidManagerClient> receiver_{this};
 };
 
 }  // namespace
diff --git a/extensions/browser/api/hid/hid_api.cc b/extensions/browser/api/hid/hid_api.cc
index 887aac3..e2a99c1c 100644
--- a/extensions/browser/api/hid/hid_api.cc
+++ b/extensions/browser/api/hid/hid_api.cc
@@ -176,7 +176,7 @@
 }
 
 void HidConnectFunction::OnConnectComplete(
-    device::mojom::HidConnectionPtr connection) {
+    mojo::PendingRemote<device::mojom::HidConnection> connection) {
   if (!connection) {
     Respond(Error(kErrorFailedToOpenDevice));
     return;
diff --git a/extensions/browser/api/hid/hid_api.h b/extensions/browser/api/hid/hid_api.h
index bd90473e..bb5ee5ff 100644
--- a/extensions/browser/api/hid/hid_api.h
+++ b/extensions/browser/api/hid/hid_api.h
@@ -17,6 +17,7 @@
 #include "extensions/browser/api/hid/hid_device_manager.h"
 #include "extensions/browser/extension_function.h"
 #include "extensions/common/api/hid.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
 namespace extensions {
@@ -72,7 +73,8 @@
   // ExtensionFunction:
   ResponseAction Run() override;
 
-  void OnConnectComplete(device::mojom::HidConnectionPtr connection);
+  void OnConnectComplete(
+      mojo::PendingRemote<device::mojom::HidConnection> connection);
 
   ApiResourceManager<HidConnectionResource>* connection_manager_;
 
diff --git a/extensions/browser/api/hid/hid_connection_resource.cc b/extensions/browser/api/hid/hid_connection_resource.cc
index a86118e0..25dd195 100644
--- a/extensions/browser/api/hid/hid_connection_resource.cc
+++ b/extensions/browser/api/hid/hid_connection_resource.cc
@@ -25,7 +25,7 @@
 
 HidConnectionResource::HidConnectionResource(
     const std::string& owner_extension_id,
-    device::mojom::HidConnectionPtr connection)
+    mojo::PendingRemote<device::mojom::HidConnection> connection)
     : ApiResource(owner_extension_id), connection_(std::move(connection)) {}
 
 HidConnectionResource::~HidConnectionResource() {
diff --git a/extensions/browser/api/hid/hid_connection_resource.h b/extensions/browser/api/hid/hid_connection_resource.h
index e04777dc..bade1e7 100644
--- a/extensions/browser/api/hid/hid_connection_resource.h
+++ b/extensions/browser/api/hid/hid_connection_resource.h
@@ -11,6 +11,8 @@
 #include "base/memory/ref_counted.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/api/api_resource.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
 namespace extensions {
@@ -20,8 +22,9 @@
   static const content::BrowserThread::ID kThreadId =
       content::BrowserThread::UI;
 
-  HidConnectionResource(const std::string& owner_extension_id,
-                        device::mojom::HidConnectionPtr connection);
+  HidConnectionResource(
+      const std::string& owner_extension_id,
+      mojo::PendingRemote<device::mojom::HidConnection> connection);
   ~HidConnectionResource() override;
 
   device::mojom::HidConnection* connection() const { return connection_.get(); }
@@ -31,7 +34,7 @@
   static const char* service_name() { return "HidConnectionResourceManager"; }
 
  private:
-  device::mojom::HidConnectionPtr connection_;
+  mojo::Remote<device::mojom::HidConnection> connection_;
 
   DISALLOW_COPY_AND_ASSIGN(HidConnectionResource);
 };
diff --git a/extensions/browser/api/hid/hid_device_manager.cc b/extensions/browser/api/hid/hid_device_manager.cc
index 98a13d3..9ccc847 100644
--- a/extensions/browser/api/hid/hid_device_manager.cc
+++ b/extensions/browser/api/hid/hid_device_manager.cc
@@ -23,7 +23,6 @@
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/common/permissions/usb_device_permission.h"
 #include "mojo/public/cpp/bindings/callback_helpers.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/device/public/cpp/hid/hid_device_filter.h"
 #include "services/device/public/cpp/hid/hid_usage_and_page.h"
@@ -102,7 +101,7 @@
 };
 
 HidDeviceManager::HidDeviceManager(content::BrowserContext* context)
-    : browser_context_(context), binding_(this) {
+    : browser_context_(context) {
   event_router_ = EventRouter::Get(context);
   if (event_router_) {
     event_router_->RegisterObserver(this, hid::OnDeviceAdded::kEventName);
@@ -176,7 +175,7 @@
   hid_manager_->Connect(
       device_guid, mojo::PendingRemote<device::mojom::HidConnectionClient>(),
       mojo::WrapCallbackWithDefaultInvokeIfNotRun(std::move(callback),
-                                                  nullptr));
+                                                  mojo::NullRemote()));
 }
 
 bool HidDeviceManager::HasPermission(
@@ -296,10 +295,8 @@
   }
   // Enumerate HID devices and set client.
   std::vector<device::mojom::HidDeviceInfoPtr> empty_devices;
-  device::mojom::HidManagerClientAssociatedPtrInfo client;
-  binding_.Bind(mojo::MakeRequest(&client));
   hid_manager_->GetDevicesAndSetClient(
-      std::move(client),
+      receiver_.BindNewEndpointAndPassRemote(),
       mojo::WrapCallbackWithDefaultInvokeIfNotRun(
           base::BindOnce(&HidDeviceManager::OnEnumerationComplete,
                          weak_factory_.GetWeakPtr()),
diff --git a/extensions/browser/api/hid/hid_device_manager.h b/extensions/browser/api/hid/hid_device_manager.h
index 0057c56..d1f653c 100644
--- a/extensions/browser/api/hid/hid_device_manager.h
+++ b/extensions/browser/api/hid/hid_device_manager.h
@@ -18,7 +18,7 @@
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_event_histogram_value.h"
 #include "extensions/common/api/hid.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/hid.mojom.h"
@@ -125,7 +125,7 @@
   EventRouter* event_router_ = nullptr;
   bool initialized_ = false;
   mojo::Remote<device::mojom::HidManager> hid_manager_;
-  mojo::AssociatedBinding<device::mojom::HidManagerClient> binding_;
+  mojo::AssociatedReceiver<device::mojom::HidManagerClient> receiver_{this};
   bool enumeration_ready_ = false;
   std::vector<std::unique_ptr<GetApiDevicesParams>> pending_enumerations_;
   int next_resource_id_ = 0;
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index eb12419..4a83f20 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -488,47 +488,57 @@
     LogEventListenerFlag(WebRequestEventListenerFlag::kExtraHeaders);
 }
 
-// Helper to remove headers from |response_headers|. Populates
-// |headers_filtered| depending on whether any headers were removed.
-scoped_refptr<const net::HttpResponseHeaders> FilterResponseHeaders(
-    scoped_refptr<const net::HttpResponseHeaders> response_headers,
-    const std::vector<const char*>& headers_to_remove,
-    bool* headers_filtered) {
-  DCHECK(headers_filtered);
-  *headers_filtered = false;
-
-  if (!response_headers || headers_to_remove.empty())
-    return response_headers;
-
-  scoped_refptr<net::HttpResponseHeaders> result;
+// Helper to remove headers from |response_headers|. Returns whether or not any
+// headers were removed.
+bool FilterResponseHeaders(net::HttpResponseHeaders* response_headers,
+                           const std::vector<const char*>& headers_to_remove) {
+  bool headers_filtered = false;
   for (const char* header : headers_to_remove) {
     if (!response_headers->HasHeader(header))
       continue;
 
-    // Lazily initialize |result|.
-    if (!result) {
-      result = base::MakeRefCounted<net::HttpResponseHeaders>(
-          response_headers->raw_headers());
-      *headers_filtered = true;
-    }
-
-    result->RemoveHeader(header);
+    headers_filtered = true;
+    response_headers->RemoveHeader(header);
   }
 
-  return *headers_filtered ? result : response_headers;
+  return headers_filtered;
 }
 
 // Helper to record a matched DNR action in RulesetManager's ActionTracker.
-void OnDNRActionMatched(content::BrowserContext* browser_context,
-                        const WebRequestInfo& request) {
-  DCHECK(request.dnr_action.has_value());
-
+void OnDNRActionMatched(
+    content::BrowserContext* browser_context,
+    const declarative_net_request::RulesetManager::Action& action,
+    int tab_id) {
   declarative_net_request::ActionTracker& action_tracker =
       declarative_net_request::RulesMonitorService::Get(browser_context)
           ->ruleset_manager()
           ->action_tracker();
-  action_tracker.OnRuleMatched(request.dnr_action->extension_ids,
-                               request.frame_data.tab_id);
+
+  DCHECK(action.extension_id.has_value());
+  action_tracker.OnRuleMatched(action.extension_id.value(), tab_id);
+}
+
+// Helper to remove request headers based on a matched DNR action. Returns
+// whether or not request headers were actually removed and populates the
+// removed headers in |removed_headers|.
+bool RemoveRequestHeadersForAction(
+    net::HttpRequestHeaders* headers,
+    const declarative_net_request::RulesetManager::Action& action,
+    std::set<std::string>* removed_headers) {
+  bool headers_removed = false;
+
+  for (const char* header : action.request_headers_to_remove) {
+    if (!headers->HasHeader(header))
+      continue;
+
+    removed_headers->insert(header);
+    headers_removed = true;
+    do {
+      headers->RemoveHeader(header);
+    } while (headers->HasHeader(header));
+  }
+
+  return headers_removed;
 }
 
 }  // namespace
@@ -1034,7 +1044,7 @@
   DCHECK(should_collapse_initiator);
 
   if (ShouldHideEvent(browser_context, *request)) {
-    request->dnr_action.emplace(Action::Type::NONE);
+    request->dnr_actions.emplace_back(Action::Type::NONE);
     return net::OK;
   }
 
@@ -1085,32 +1095,43 @@
   // currently only depend on the request url, initiator and resource type,
   // which should stay the same during the diffierent network request stages. A
   // redirect should cause another OnBeforeRequest call.
-  const Action& action =
+  const std::vector<Action>& actions =
       declarative_net_request::RulesMonitorService::Get(browser_context)
           ->ruleset_manager()
           ->EvaluateRequest(*request, is_incognito_context);
-  switch (action.type) {
-    case Action::Type::NONE:
-      break;
-    case Action::Type::BLOCK:
-      ClearPendingCallbacks(*request);
-      OnDNRActionMatched(browser_context, *request);
-      return net::ERR_BLOCKED_BY_CLIENT;
-    case Action::Type::COLLAPSE:
-      ClearPendingCallbacks(*request);
-      OnDNRActionMatched(browser_context, *request);
-      *should_collapse_initiator = true;
-      return net::ERR_BLOCKED_BY_CLIENT;
-    case Action::Type::REDIRECT:
-      ClearPendingCallbacks(*request);
-      DCHECK(action.redirect_url);
-      OnDNRActionMatched(browser_context, *request);
-      *new_url = action.redirect_url.value();
-      return net::OK;
-    case Action::Type::REMOVE_HEADERS:
-      DCHECK(request->dnr_action.has_value());
-      DCHECK_EQ(request->dnr_action->type, Action::Type::REMOVE_HEADERS);
-      break;
+  for (const auto& action : actions) {
+    switch (action.type) {
+      case Action::Type::NONE:
+        DCHECK_EQ(1u, actions.size());
+        break;
+      case Action::Type::BLOCK:
+        ClearPendingCallbacks(*request);
+        DCHECK_EQ(1u, actions.size());
+        OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
+        return net::ERR_BLOCKED_BY_CLIENT;
+      case Action::Type::COLLAPSE:
+        ClearPendingCallbacks(*request);
+        DCHECK_EQ(1u, actions.size());
+        OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
+        *should_collapse_initiator = true;
+        return net::ERR_BLOCKED_BY_CLIENT;
+      case Action::Type::REDIRECT:
+        ClearPendingCallbacks(*request);
+        DCHECK_EQ(1u, actions.size());
+        DCHECK(action.redirect_url);
+        OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
+        *new_url = action.redirect_url.value();
+        return net::OK;
+      case Action::Type::REMOVE_HEADERS:
+        // Unlike other actions, allow web request extensions to intercept the
+        // request here. The headers will be removed during subsequent request
+        // stages.
+        DCHECK(std::all_of(request->dnr_actions.begin(),
+                           request->dnr_actions.end(), [](const auto& action) {
+                             return action.type == Action::Type::REMOVE_HEADERS;
+                           }));
+        break;
+    }
   }
 
   if (!initialize_blocked_requests)
@@ -1142,23 +1163,17 @@
   // Remove request headers for the Declarative Net Request API. It is given
   // preference over the Web Request API and this also hides the removed headers
   // from extensions using the Web Request API.
-  DCHECK(request->dnr_action.has_value());
+  DCHECK(!request->dnr_actions.empty());
   std::set<std::string> removed_headers;
-  for (const char* header : request->dnr_action->request_headers_to_remove) {
-    if (!headers->HasHeader(header))
-      continue;
 
-    removed_headers.insert(header);
-    do {
-      headers->RemoveHeader(header);
-    } while (headers->HasHeader(header));
+  for (const auto& action : request->dnr_actions) {
+    bool headers_removed_for_action =
+        RemoveRequestHeadersForAction(headers, action, &removed_headers);
+
+    if (headers_removed_for_action)
+      OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
   }
 
-  // TODO(crbug.com/991420): This does not properly associate which headers are
-  // removed by which extensions.
-  if (!removed_headers.empty())
-    OnDNRActionMatched(browser_context, *request);
-
   bool initialize_blocked_requests = false;
 
   initialize_blocked_requests |=
@@ -1235,27 +1250,48 @@
     const net::HttpResponseHeaders* original_response_headers,
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
     GURL* allowed_unsafe_redirect_url) {
+  using Action = declarative_net_request::RulesetManager::Action;
+
   if (ShouldHideEvent(browser_context, *request))
     return net::OK;
 
   // Handle header removal by the Declarative Net Request API. We filter these
   // headers so that headers removed by Declarative Net Request API are not
   // visible to web request extensions.
-  DCHECK(request->dnr_action.has_value());
-  bool headers_filtered = false;
-  scoped_refptr<const net::HttpResponseHeaders> filtered_response_headers =
-      FilterResponseHeaders(original_response_headers,
-                            request->dnr_action->response_headers_to_remove,
-                            &headers_filtered);
-  if (headers_filtered) {
-    // Create a deep copy to ensure |filtered_response_headers| and
-    // |override_response_headers| don't point to the same object.
-    *override_response_headers = base::MakeRefCounted<net::HttpResponseHeaders>(
-        filtered_response_headers->raw_headers());
+  DCHECK(!request->dnr_actions.empty());
+  bool should_remove_headers =
+      request->dnr_actions[0].type == Action::Type::REMOVE_HEADERS &&
+      original_response_headers;
 
-    // TODO(crbug.com/991420): This does not properly associate which headers
-    // are removed by which extensions.
-    OnDNRActionMatched(browser_context, *request);
+  scoped_refptr<const net::HttpResponseHeaders> filtered_response_headers;
+  if (!should_remove_headers) {
+    filtered_response_headers = original_response_headers;
+  } else {
+    // Make a non-const copy of |original_response_headers| in order to be
+    // modified in-place by FilterResponseHeaders.
+    scoped_refptr<net::HttpResponseHeaders> mutable_response_headers =
+        base::MakeRefCounted<net::HttpResponseHeaders>(
+            original_response_headers->raw_headers());
+
+    bool headers_filtered = false;
+    for (const auto& action : request->dnr_actions) {
+      bool headers_filtered_for_action = FilterResponseHeaders(
+          mutable_response_headers.get(), action.response_headers_to_remove);
+
+      if (headers_filtered_for_action)
+        OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
+
+      headers_filtered |= headers_filtered_for_action;
+    }
+
+    filtered_response_headers = mutable_response_headers;
+    if (headers_filtered) {
+      // Create a deep copy to ensure |filtered_response_headers| and
+      // |override_response_headers| don't point to the same object.
+      *override_response_headers =
+          base::MakeRefCounted<net::HttpResponseHeaders>(
+              filtered_response_headers->raw_headers());
+    }
   }
 
   bool initialize_blocked_requests = false;
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.cc b/extensions/browser/api/web_request/web_request_api_helpers.cc
index e528064..5c11c84 100644
--- a/extensions/browser/api/web_request/web_request_api_helpers.cc
+++ b/extensions/browser/api/web_request/web_request_api_helpers.cc
@@ -325,6 +325,40 @@
 static_assert(ValidateHeaderEntries(kResponseHeaderEntries),
               "Invalid response header entries");
 
+bool HasMatchingRemovedDNRRequestHeader(
+    const extensions::WebRequestInfo& request,
+    const std::string& header) {
+  for (const auto& action : request.dnr_actions) {
+    if (std::find_if(action.request_headers_to_remove.begin(),
+                     action.request_headers_to_remove.end(),
+                     [&header](const char* header_to_remove) {
+                       return base::EqualsCaseInsensitiveASCII(header_to_remove,
+                                                               header);
+                     }) != action.request_headers_to_remove.end()) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+bool HasMatchingRemovedDNRResponseHeader(
+    const extensions::WebRequestInfo& request,
+    const std::string& header) {
+  for (const auto& action : request.dnr_actions) {
+    if (std::find_if(action.response_headers_to_remove.begin(),
+                     action.response_headers_to_remove.end(),
+                     [&header](const char* header_to_remove) {
+                       return base::EqualsCaseInsensitiveASCII(
+                           header, header_to_remove);
+                     }) != action.response_headers_to_remove.end()) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 }  // namespace
 
 IgnoredAction::IgnoredAction(extensions::ExtensionId extension_id,
@@ -934,14 +968,8 @@
 
         // Prevent extensions from adding any header removed by the Declarative
         // Net Request API.
-        DCHECK(request.dnr_action.has_value());
-        if (std::find_if(request.dnr_action->request_headers_to_remove.begin(),
-                         request.dnr_action->request_headers_to_remove.end(),
-                         [&key](const char* header_to_remove) {
-                           return base::EqualsCaseInsensitiveASCII(
-                               header_to_remove, key);
-                         }) !=
-            request.dnr_action->request_headers_to_remove.end()) {
+        DCHECK(!request.dnr_actions.empty());
+        if (HasMatchingRemovedDNRRequestHeader(request, key)) {
           extension_conflicts = true;
           break;
         }
@@ -1312,17 +1340,11 @@
 
     // Prevent extensions from adding any response header which was removed by
     // the Declarative Net Request API.
-    DCHECK(request.dnr_action.has_value());
-    if (!extension_conflicts &&
-        !request.dnr_action->response_headers_to_remove.empty()) {
+    DCHECK(!request.dnr_actions.empty());
+
+    if (!extension_conflicts) {
       for (const ResponseHeader& header : delta.added_response_headers) {
-        if (std::find_if(request.dnr_action->response_headers_to_remove.begin(),
-                         request.dnr_action->response_headers_to_remove.end(),
-                         [&header](const char* header_to_remove) {
-                           return base::EqualsCaseInsensitiveASCII(
-                               header.first, header_to_remove);
-                         }) !=
-            request.dnr_action->response_headers_to_remove.end()) {
+        if (HasMatchingRemovedDNRResponseHeader(request, header.first)) {
           extension_conflicts = true;
           break;
         }
diff --git a/extensions/browser/api/web_request/web_request_info.h b/extensions/browser/api/web_request/web_request_info.h
index ac265b0..badd310 100644
--- a/extensions/browser/api/web_request/web_request_info.h
+++ b/extensions/browser/api/web_request/web_request_info.h
@@ -168,8 +168,10 @@
 
   // The Declarative Net Request action associated with this request. Mutable
   // since this is lazily computed. Cached to avoid redundant computations.
-  mutable base::Optional<declarative_net_request::RulesetManager::Action>
-      dnr_action;
+  // Valid when non-empty. In case no action is taken, populated with
+  // Action::Type::NONE.
+  mutable std::vector<declarative_net_request::RulesetManager::Action>
+      dnr_actions;
 
   const bool is_service_worker_script;
 
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index 9401c5b..c174d9e 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -369,22 +369,19 @@
   if (!script_url.SchemeIs(kExtensionScheme))
     return;
 
-  // If the extension is already loaded we don't have to suspend the service
-  // worker. The service worker will continue in
-  // Dispatcher::WillEvaluateServiceWorkerOnWorkerThread().
-  const Extension* extension =
-      RendererExtensionRegistry::Get()->GetExtensionOrAppByURL(script_url);
-  if (extension)
-    return;
-
-  // Suspend the service worker until loaded message of the extension comes. The
-  // service worker will be resumed in Dispatcher::OnLoaded().
-  context_proxy->PauseEvaluation();
-
-  std::string extension_id =
-      RendererExtensionRegistry::Get()->GetExtensionOrAppIDByURL(script_url);
   {
     base::AutoLock lock(service_workers_paused_for_on_loaded_message_lock_);
+    ExtensionId extension_id =
+        RendererExtensionRegistry::Get()->GetExtensionOrAppIDByURL(script_url);
+    // If the extension is already loaded we don't have to suspend the service
+    // worker. The service worker will continue in
+    // Dispatcher::WillEvaluateServiceWorkerOnWorkerThread().
+    if (RendererExtensionRegistry::Get()->GetByID(extension_id))
+      return;
+
+    // Suspend the service worker until loaded message of the extension comes.
+    // The service worker will be resumed in Dispatcher::OnLoaded().
+    context_proxy->PauseEvaluation();
     service_workers_paused_for_on_loaded_message_.emplace(
         extension_id, std::make_unique<PendingServiceWorker>(context_proxy));
   }
diff --git a/google_apis/gaia/oauth_multilogin_result.cc b/google_apis/gaia/oauth_multilogin_result.cc
index 312679e..f1e9b89 100644
--- a/google_apis/gaia/oauth_multilogin_result.cc
+++ b/google_apis/gaia/oauth_multilogin_result.cc
@@ -109,13 +109,19 @@
       // there must be something wrong with the received cookie.
       cookie_domain = cookie_host;
     }
+    net::CookieSameSite samesite_mode = net::CookieSameSite::UNSPECIFIED;
+    net::CookieSameSiteString samesite_string =
+        net::CookieSameSiteString::kUnspecified;
+    if (same_site) {
+      samesite_mode = net::StringToCookieSameSite(*same_site, &samesite_string);
+    }
+    net::RecordCookieSameSiteAttributeValueHistogram(samesite_string);
     net::CanonicalCookie new_cookie(
         name ? *name : "", value ? *value : "", cookie_domain,
         path ? *path : "", /*creation=*/base::Time::Now(),
         base::Time::Now() + before_expiration,
         /*last_access=*/base::Time::Now(), is_secure.value_or(true),
-        is_http_only.value_or(true),
-        net::StringToCookieSameSite(same_site ? *same_site : ""),
+        is_http_only.value_or(true), samesite_mode,
         net::StringToCookiePriority(priority ? *priority : "medium"));
     if (new_cookie.IsCanonical()) {
       cookies_.push_back(std::move(new_cookie));
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 4d9ea1f..8e8db6e 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -591,10 +591,10 @@
         Reading List
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST_ACCESSIBILITY_LABEL_ONE_UNREAD" desc="The accessibility label to use for the reading list content suggestion cell when there is only a single unread article [Length: unlimited]">
-        1 unread Reading List article.
+        1 unread article.
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST_ACCESSIBILITY_LABEL" desc="The accessibility label to use for the reading list content suggestion cell when there are multiple unread articles [Length: unlimited]">
-        <ph name="UNREAD_COUNT">$1<ex>4</ex></ph> unread Reading List articles.
+        <ph name="UNREAD_COUNT">$1<ex>4</ex></ph> unread articles.
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_RECENT_TABS" desc="The Recent Tabs title on the new tab page [Length: 10em]">
         Recent Tabs
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 46f67bc..0abefc1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -44,6 +44,7 @@
 <translation id="1449835205994625556">Itago ang Password</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> (na) item</translation>
 <translation id="1491277525950327607">I-double tap upang i-toggle ang setting</translation>
+<translation id="1509486075633541495">Mag-sign in sa website</translation>
 <translation id="152234381334907219">Hindi Kailanman Na-save</translation>
 <translation id="1540800554400757039">Address 1</translation>
 <translation id="1545749641540134597">I-scan ang QR Code</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 5ac792e2..275a3bc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -44,6 +44,7 @@
 <translation id="1449835205994625556">पासवर्ड छिपाएं</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> आइटम</translation>
 <translation id="1491277525950327607">सेटिंग को टॉगल करने के लिए दो बार टैप करें</translation>
+<translation id="1509486075633541495">वेबसाइट में साइन इन करें</translation>
 <translation id="152234381334907219">कभी नहीं सेव किया गया</translation>
 <translation id="1540800554400757039">पता 1</translation>
 <translation id="1545749641540134597">QR कोड स्कैन करें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index e7483ac..ac9c9dc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -44,6 +44,7 @@
 <translation id="1449835205994625556">비밀번호 숨기기</translation>
 <translation id="145015347812617860">항목 <ph name="COUNT" />개</translation>
 <translation id="1491277525950327607">설정을 전환하려면 두 번 탭하세요.</translation>
+<translation id="1509486075633541495">웹사이트에 로그인</translation>
 <translation id="152234381334907219">저장되지 않음</translation>
 <translation id="1540800554400757039">주소 1</translation>
 <translation id="1545749641540134597">QR 코드 스캔</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 9fae1be..fec7673 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -316,6 +316,7 @@
 सेटिंग्जच्या सामान्य विभागामध्ये Handoff सक्षम केलेले असणे आवश्यक आहे आणि आपल्या डिव्हाइसेसने समान iCloud खाते वापरणे आवश्यक आहे.</translation>
 <translation id="5551897871312988470">भाषांतर उपलब्ध करा</translation>
 <translation id="5556459405103347317">रीलोड करा</translation>
+<translation id="5592679540098330836"><ph name="NAME" /> साठी सिंक सुरू करा</translation>
 <translation id="5614553682702429503">पासवर्ड सेव्ह करायचा आहे का?</translation>
 <translation id="5626245204502895507">यावेळी फाईल डाऊनलोड केली जाऊ शकली नाही.</translation>
 <translation id="5631164295104953411">पेमेंट पद्धत जोडा</translation>
diff --git a/ios/chrome/browser/infobars/infobar_container_ios.h b/ios/chrome/browser/infobars/infobar_container_ios.h
index 07f647b1..4db44a8 100644
--- a/ios/chrome/browser/infobars/infobar_container_ios.h
+++ b/ios/chrome/browser/infobars/infobar_container_ios.h
@@ -35,9 +35,9 @@
   void PlatformSpecificInfoBarStateChanged(bool is_animating) override;
 
  private:
-  id<InfobarContainerConsumer> consumer_;
-  id<InfobarContainerConsumer> legacyConsumer_;
   infobars::InfoBarManager* info_bar_manager_ = nullptr;
+  __weak id<InfobarContainerConsumer> consumer_;
+  __weak id<InfobarContainerConsumer> legacyConsumer_;
 
   DISALLOW_COPY_AND_ASSIGN(InfoBarContainerIOS);
 };
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm
index 5300b55a..27dde11 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm
@@ -79,7 +79,9 @@
   }
 
   self.accessibilityLabel =
-      AccessibilityLabelForReadingListCellWithCount(self.count);
+      [NSString stringWithFormat:@"%@, %@", self.title,
+                                 AccessibilityLabelForReadingListCellWithCount(
+                                     self.count)];
   DCHECK(self.accessibilityLabel.length);
 }
 
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
index cc8c13a4a..43f59c65 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
@@ -327,7 +327,7 @@
 // TODO(crbug.com/1004514): This test fails due to
 // infobarBannerWasDismissed:forWebState:.
 TEST_F(InfobarContainerCoordinatorTest,
-       DISABLED_TestInfobarBannerDismissAtWebStateChange) {
+       TestInfobarBannerDismissAtWebStateChange) {
   AddInfobar();
   AddSecondWebstate();
 
@@ -429,7 +429,7 @@
 // TODO(crbug.com/1004514): This test fails due to
 // infobarBannerWasDismissed:forWebState:.
 TEST_F(InfobarContainerCoordinatorTest,
-       DISABLED_TestInfobarBannerDismissedClosingWebstate) {
+       TestInfobarBannerDismissedClosingWebstate) {
   AddInfobar();
   // Close the Webstate without calling WaitUntilConditionOrTimeout.
   web_state_list_->CloseWebStateAt(0, 0);
@@ -445,8 +445,7 @@
 // Tests that the Infobar is dismissed when both the VC and Webstate are closed.
 // TODO(crbug.com/1004514): This test fails due to
 // infobarBannerWasDismissed:forWebState:.
-TEST_F(InfobarContainerCoordinatorTest,
-       DISABLED_TestDismissingAndClosingWebstate) {
+TEST_F(InfobarContainerCoordinatorTest, TestDismissingAndClosingWebstate) {
   AddInfobar();
   ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
       base::test::ios::kWaitForUIElementTimeout, ^bool {
@@ -473,7 +472,7 @@
 // TODO(crbug.com/1004514): This test fails due to
 // infobarBannerWasDismissed:forWebState:.
 TEST_F(InfobarContainerCoordinatorTest,
-       DISABLED_TestDismissingAndClosingWebstateSecondWebstate) {
+       TestDismissingAndClosingWebstateSecondWebstate) {
   AddInfobar();
   AddSecondWebstate();
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
diff --git a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_view_controller.mm
index 89142ec..994b8ee 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_view_controller.mm
@@ -195,8 +195,10 @@
     if (self.readingListBadgeValue > 0) {
       cell.tile.countLabel.text = [@(self.readingListBadgeValue) stringValue];
       cell.tile.countContainer.hidden = NO;
-      cell.accessibilityLabel = AccessibilityLabelForReadingListCellWithCount(
-          self.readingListBadgeValue);
+      cell.accessibilityLabel = [NSString
+          stringWithFormat:@"%@, %@", cell.accessibilityLabel,
+                           AccessibilityLabelForReadingListCellWithCount(
+                               self.readingListBadgeValue)];
     }
   }
 }
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn
index 9500aeb..360b2e2 100644
--- a/ios/chrome/browser/ui/popup_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -62,6 +62,7 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/list_model",
+    "//ios/chrome/browser/ui/ntp_tile_views:constants",
     "//ios/chrome/browser/ui/popup_menu/cells",
     "//ios/chrome/browser/ui/popup_menu/public",
     "//ios/chrome/browser/ui/popup_menu/public:popup_menu_ui",
diff --git a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h
index af1646f0..8925446c 100644
--- a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h
+++ b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h
@@ -17,14 +17,18 @@
 @property(nonatomic, strong) UIImage* image;
 // Whether the cell associated with this item should be enabled.
 @property(nonatomic, assign) BOOL enabled;
-// Number to be displayed in the badge. If 0, the badge is hidden.
+// Number to be displayed in the badge. If 0, the badge is hidden. This is not
+// read by VoiceOver.
 @property(nonatomic, assign) NSInteger badgeNumber;
 // Text to be displayed in the badge. Set to nil to hide the badge. The text
-// badge is only displayed if the numbered badge is hidden.
+// badge is only displayed if the numbered badge is hidden. This is not read by
+// VoiceOver.
 @property(nonatomic, copy) NSString* badgeText;
 // Whether the item is associated with a destructive action. If |YES|, then a
 // specific styling is applied.
 @property(nonatomic, assign) BOOL destructiveAction;
+// Additional label. Read after |title| if not nil.
+@property(nonatomic, strong) NSString* additionalAccessibilityLabel;
 
 @end
 
@@ -41,6 +45,9 @@
 // specific styling is applied.
 @property(nonatomic, assign) BOOL destructiveAction;
 
+// Additional label. Read after |title| if not nil.
+@property(nonatomic, strong) NSString* additionalAccessibilityLabel;
+
 // Sets the number on the badge number.
 - (void)setBadgeNumber:(NSInteger)badgeNumber;
 // Sets the text of the badge text. Hides the badge text if |badgeText| is nil.
diff --git a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
index ac930d7..4b7b6e6 100644
--- a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
+++ b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
@@ -34,12 +34,6 @@
 @implementation PopupMenuToolsItem
 
 @synthesize actionIdentifier = _actionIdentifier;
-@synthesize badgeNumber = _badgeNumber;
-@synthesize badgeText = _badgeText;
-@synthesize image = _image;
-@synthesize title = _title;
-@synthesize enabled = _enabled;
-@synthesize destructiveAction = _destructiveAction;
 
 - (instancetype)initWithType:(NSInteger)type {
   self = [super initWithType:type];
@@ -60,6 +54,7 @@
   cell.destructiveAction = self.destructiveAction;
   [cell setBadgeNumber:self.badgeNumber];
   [cell setBadgeText:self.badgeText];
+  cell.additionalAccessibilityLabel = self.additionalAccessibilityLabel;
 }
 
 #pragma mark - PopupMenuItem
@@ -104,11 +99,6 @@
 @implementation PopupMenuToolsCell
 
 @synthesize imageView = _imageView;
-@synthesize numberBadgeView = _numberBadgeView;
-@synthesize textBadgeView = _textBadgeView;
-@synthesize titleLabel = _titleLabel;
-@synthesize titleToBadgeConstraint = _titleToBadgeConstraint;
-@synthesize destructiveAction = _destructiveAction;
 
 - (instancetype)initWithStyle:(UITableViewCellStyle)style
               reuseIdentifier:(NSString*)reuseIdentifier {
@@ -316,6 +306,17 @@
   }
 }
 
+#pragma mark - Accessibility
+
+- (NSString*)accessibilityLabel {
+  if (self.additionalAccessibilityLabel) {
+    return [NSString stringWithFormat:@"%@, %@", self.titleLabel.text,
+                                      self.additionalAccessibilityLabel];
+  } else {
+    return self.titleLabel.text;
+  }
+}
+
 #pragma mark - Private
 
 // Callback when the preferred Content Size change.
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index 04a7feb8f..a282489a 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -29,6 +29,7 @@
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/reading_list_add_command.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
+#import "ios/chrome/browser/ui/ntp_tile_views/ntp_tile_constants.h"
 #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.h"
 #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
@@ -899,8 +900,13 @@
   self.readingListItem = CreateTableViewItem(
       IDS_IOS_TOOLS_MENU_READING_LIST, PopupMenuActionReadingList,
       @"popup_menu_reading_list", kToolsMenuReadingListId);
-  self.readingListItem.badgeNumber =
+  NSInteger numberOfUnreadArticles =
       [self.readingListMenuNotifier readingListUnreadCount];
+  self.readingListItem.badgeNumber = numberOfUnreadArticles;
+  if (numberOfUnreadArticles) {
+    self.readingListItem.additionalAccessibilityLabel =
+        AccessibilityLabelForReadingListCellWithCount(numberOfUnreadArticles);
+  }
   if (self.engagementTracker &&
       self.engagementTracker->ShouldTriggerHelpUI(
           feature_engagement::kIPHBadgedReadingListFeature)) {
diff --git a/media/base/audio_discard_helper.cc b/media/base/audio_discard_helper.cc
index 9534653..a767e9b9 100644
--- a/media/base/audio_discard_helper.cc
+++ b/media/base/audio_discard_helper.cc
@@ -178,8 +178,10 @@
     // If everything would be discarded, indicate a new buffer is required.
     if (frames_to_discard == decoded_frames) {
       // The buffer should not have been marked with end discard if the front
-      // discard removes everything.
-      DCHECK(current_discard_padding.second.is_zero());
+      // discard removes everything, though incorrect or imprecise duration
+      // metadata, combined with various trimming operations, might still have
+      // end discard marked here. For simplicity, we do not carry over any such
+      // end discard for handling later.
       return false;
     }
 
diff --git a/media/blink/multibuffer_data_source.cc b/media/blink/multibuffer_data_source.cc
index f3a8e3b..a8e3ed20 100644
--- a/media/blink/multibuffer_data_source.cc
+++ b/media/blink/multibuffer_data_source.cc
@@ -304,11 +304,16 @@
 
 void MultibufferDataSource::MediaIsPlaying() {
   DCHECK(render_task_runner_->BelongsToCurrentThread());
+
+  // Always clear this since it can be set by OnBufferingHaveEnough() calls at
+  // any point in time.
+  cancel_on_defer_ = false;
+
   if (media_has_played_)
     return;
 
   media_has_played_ = true;
-  cancel_on_defer_ = false;
+
   // Once we start playing, we need preloading.
   preload_ = AUTO;
   UpdateBufferSizes();
diff --git a/media/blink/multibuffer_data_source_unittest.cc b/media/blink/multibuffer_data_source_unittest.cc
index 02be5cee..eacee0cb 100644
--- a/media/blink/multibuffer_data_source_unittest.cc
+++ b/media/blink/multibuffer_data_source_unittest.cc
@@ -1305,6 +1305,7 @@
 
   // Marking the media as playing should prevent deferral. It also tells the
   // data source to start buffering beyond the initial load.
+  EXPECT_FALSE(data_source_->cancel_on_defer_for_testing());
   data_source_->MediaIsPlaying();
   data_source_->OnBufferingHaveEnough(false);
   CheckCapacityDefer();
@@ -1316,6 +1317,7 @@
   ReceiveData(kDataSize);
   ASSERT_TRUE(active_loader());
   data_source_->OnBufferingHaveEnough(true);
+  EXPECT_TRUE(data_source_->cancel_on_defer_for_testing());
   ASSERT_TRUE(active_loader());
   ASSERT_FALSE(data_provider()->deferred());
 
@@ -1329,6 +1331,26 @@
   EXPECT_GT(bytes_received, 0);
   EXPECT_LT(bytes_received + kDataSize, kFileSize);
   EXPECT_FALSE(active_loader_allownull());
+
+  // Verify playback resumes correctly too.
+  data_source_->MediaIsPlaying();
+  EXPECT_FALSE(data_source_->cancel_on_defer_for_testing());
+
+  // A read from a previously buffered range won't create a new loader yet.
+  EXPECT_CALL(*this, ReadCallback(kDataSize));
+  ReadAt(kDataSize);
+  EXPECT_FALSE(active_loader_allownull());
+
+  // Reads from an unbuffered range will though...
+  EXPECT_CALL(*this, ReadCallback(kDataSize));
+  ReadAt(kFarReadPosition);
+
+  // Receive enough data to exhaust current capacity which would destroy the
+  // loader upon deferral if the flag hasn't been cleared properly.
+  for (int i = 0; i <= (preload_high() / kDataSize) + 1; ++i) {
+    ReceiveData(kDataSize);
+    ASSERT_TRUE(active_loader());
+  }
 }
 
 TEST_F(MultibufferDataSourceTest, SeekPastEOF) {
diff --git a/media/gpu/android/codec_image.cc b/media/gpu/android/codec_image.cc
index ded60797..8c4dd49 100644
--- a/media/gpu/android/codec_image.cc
+++ b/media/gpu/android/codec_image.cc
@@ -185,6 +185,11 @@
                                      int display_y,
                                      int display_width,
                                      int display_height) {
+  // TODO(crbug.com/1004859): Add back early skip due to suspecting affecting
+  // video smoothness.
+  if (promotion_hint && !codec_buffer_wait_coordinator_)
+    return;
+
   NotifyOverlayPromotion(
       promotion_hint,
       gfx::Rect(display_x, display_y, display_width, display_height));
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
index 4ba65918..d2484ee 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -35,7 +35,6 @@
 #include "media/gpu/macros.h"
 #include "media/gpu/vaapi/h264_encoder.h"
 #include "media/gpu/vaapi/vaapi_common.h"
-#include "media/gpu/vaapi/vaapi_picture_factory.h"
 #include "media/gpu/vaapi/vp8_encoder.h"
 #include "media/gpu/vaapi/vp9_encoder.h"
 #include "media/gpu/vp8_reference_frame_vector.h"
@@ -85,7 +84,6 @@
                  base::OnceClosure execute_cb,
                  scoped_refptr<VASurface> input_surface,
                  scoped_refptr<VASurface> reconstructed_surface,
-                 std::unique_ptr<VaapiPicture> va_picture,
                  VABufferID coded_buffer_id);
 
   VaapiEncodeJob* AsVaapiEncodeJob() override { return this; }
@@ -108,10 +106,6 @@
   // for subsequent frames.
   const scoped_refptr<VASurface> reconstructed_surface_;
 
-  // VAPicture associated with |input_surface_|. This member value is to just
-  // keep VAPicture alive as long as input_surface_ is alive, but not used.
-  const std::unique_ptr<VaapiPicture> va_picture_;
-
   // Buffer that will contain the output bitstream data for this frame.
   VABufferID coded_buffer_id_;
 
@@ -286,12 +280,6 @@
     return false;
   }
 
-  if (native_input_mode_) {
-    VLOGF(2) << "DMABuf mode: VaapiVEA will accept DMABuf-backed VideoFrame on "
-             << "Encode()";
-    vaapi_picture_factory_ = std::make_unique<VaapiPictureFactory>();
-  }
-
   if (config.input_visible_size.width() > profile->max_resolution.width() ||
       config.input_visible_size.height() > profile->max_resolution.height()) {
     VLOGF(1) << "Input size too big: " << config.input_visible_size.ToString()
@@ -539,48 +527,26 @@
     return nullptr;
   }
 
-  VASurfaceID va_input_surface_id = VA_INVALID_ID;
-  std::unique_ptr<VaapiPicture> va_picture;
+  scoped_refptr<VASurface> input_surface;
   if (native_input_mode_) {
-    DCHECK(vaapi_picture_factory_);
     if (frame->format() != PIXEL_FORMAT_NV12) {
-      NOTIFY_ERROR(kPlatformFailureError, "Unexpected format, expected NV12");
-      return nullptr;
-    }
-    constexpr int32_t kDummyPictureBufferId = 0;
-    // Passing empty callbacks is ok, because given PictureBuffer doesn't have
-    // texture id and thus these callbacks will never called.
-    va_picture = vaapi_picture_factory_->Create(
-        vaapi_wrapper_, MakeGLContextCurrentCallback(), BindGLImageCallback(),
-        PictureBuffer(kDummyPictureBufferId, frame->coded_size()));
-    gfx::GpuMemoryBufferHandle gmb_handle =
-        CreateGpuMemoryBufferHandle(frame.get());
-    DCHECK(!gmb_handle.is_null());
-
-    auto buffer_format = VideoPixelFormatToGfxBufferFormat(frame->format());
-    if (!buffer_format) {
-      NOTIFY_ERROR(kInvalidArgumentError,
-                   "Unsupported format: " << frame->format());
-      return nullptr;
-    }
-    if (!va_picture->ImportGpuMemoryBufferHandle(*buffer_format,
-                                                 std::move(gmb_handle))) {
       NOTIFY_ERROR(kPlatformFailureError,
-                   "Failed in ImportGpuMemoryBufferHandle");
+                   "Expected NV12, got: " << frame->format());
       return nullptr;
     }
 
-    va_input_surface_id = va_picture->va_surface_id();
+    input_surface = vaapi_wrapper_->CreateVASurfaceForVideoFrame(frame.get());
+    if (!input_surface) {
+      NOTIFY_ERROR(kPlatformFailureError, "Failed to create VASurface");
+      return nullptr;
+    }
   } else {
-    va_input_surface_id = available_va_surface_ids_.back();
+    input_surface =
+        new VASurface(available_va_surface_ids_.back(), coded_size_,
+                      kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_));
     available_va_surface_ids_.pop_back();
   }
 
-  scoped_refptr<VASurface> input_surface = new VASurface(
-      va_input_surface_id, coded_size_, kVaSurfaceFormat,
-      native_input_mode_ ? base::DoNothing()
-                         : base::BindOnce(va_surface_release_cb_));
-
   scoped_refptr<VASurface> reconstructed_surface =
       new VASurface(available_va_surface_ids_.back(), coded_size_,
                     kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_));
@@ -590,8 +556,7 @@
       frame, force_keyframe,
       base::BindOnce(&VaapiVideoEncodeAccelerator::ExecuteEncode,
                      base::Unretained(this), input_surface->id()),
-      input_surface, reconstructed_surface, std::move(va_picture),
-      coded_buffer_id);
+      input_surface, std::move(reconstructed_surface), coded_buffer_id);
 
   if (!native_input_mode_) {
     job->AddSetupCallback(
@@ -809,12 +774,10 @@
                                base::OnceClosure execute_cb,
                                scoped_refptr<VASurface> input_surface,
                                scoped_refptr<VASurface> reconstructed_surface,
-                               std::unique_ptr<VaapiPicture> va_picture,
                                VABufferID coded_buffer_id)
     : EncodeJob(input_frame, keyframe, std::move(execute_cb)),
       input_surface_(input_surface),
       reconstructed_surface_(reconstructed_surface),
-      va_picture_(std::move(va_picture)),
       coded_buffer_id_(coded_buffer_id) {
   DCHECK(input_surface_);
   DCHECK(reconstructed_surface_);
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
index 8ff9ba8..77a3cd9c 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator.h
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
@@ -24,7 +24,6 @@
 namespace media {
 
 class VaapiEncodeJob;
-class VaapiPictureFactory;
 
 // A VideoEncodeAccelerator implementation that uses VA-API
 // (https://01.org/vaapi) for HW-accelerated video encode.
@@ -172,9 +171,6 @@
   // Encoder state. Encode tasks will only run in kEncoding state.
   State state_;
 
-  // Creates VaapiPictures to wrap incoming DmaBufs in |native_input_mode_|.
-  std::unique_ptr<VaapiPictureFactory> vaapi_picture_factory_;
-
   // Encoder instance managing video codec state and preparing encode jobs.
   std::unique_ptr<AcceleratedVideoEncoder> encoder_;
 
diff --git a/media/gpu/vaapi/vp8_encoder.cc b/media/gpu/vaapi/vp8_encoder.cc
index d72d152f..96689de 100644
--- a/media/gpu/vaapi/vp8_encoder.cc
+++ b/media/gpu/vaapi/vp8_encoder.cc
@@ -163,13 +163,16 @@
   current_frame_hdr_.show_frame = true;
   // TODO(sprang): Make this dynamic. Value based on reference implementation
   // in libyami (https://github.com/intel/libyami).
-  current_frame_hdr_.loopfilter_hdr.level = 19;
 
-  // b/138840822: Set mb_no_skip_coeff and loop_filter_adj_enable to 1 as a
-  // workaround of color artifacts issue with a kepler device hw decoder and
-  // ffmpeg sw decoder.
-  current_frame_hdr_.mb_no_skip_coeff = 1;
+  // A VA-API driver recommends to set forced_lf_adjustment on keyframe.
+  // Set loop_filter_adj_enable to 1 here because forced_lf_adjustment is read
+  // only when a macroblock level loop filter adjustment.
   current_frame_hdr_.loopfilter_hdr.loop_filter_adj_enable = 1;
+
+  // Set mb_no_skip_coeff to 1 that some decoders (e.g. kepler) could not decode
+  // correctly a stream encoded with mb_no_skip_coeff=0. It also enables an
+  // encoder to produce a more optimized stream than when mb_no_skip_coeff=0.
+  current_frame_hdr_.mb_no_skip_coeff = 1;
 }
 
 void VP8Encoder::UpdateFrameHeader(bool keyframe) {
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
index 584caa6..e0de0172 100644
--- a/net/cookies/canonical_cookie.cc
+++ b/net/cookies/canonical_cookie.cc
@@ -110,7 +110,7 @@
 
 void ApplySameSiteCookieWarningToStatus(
     CookieSameSite samesite,
-    CookieSameSite effective_samesite,
+    CookieEffectiveSameSite effective_samesite,
     bool is_secure,
     CookieOptions::SameSiteCookieContext context,
     CanonicalCookie::CookieInclusionStatus* status) {
@@ -121,7 +121,7 @@
   }
   // This will overwrite the previous warning but it is more specific so that
   // is ok.
-  if (effective_samesite == CookieSameSite::LAX_MODE_ALLOW_UNSAFE &&
+  if (effective_samesite == CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE &&
       context ==
           CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE) {
     status->set_warning(CanonicalCookie::CookieInclusionStatus::
@@ -288,11 +288,14 @@
   if (!status->IsInclude())
     return nullptr;
 
+  CookieSameSiteString samesite_string = CookieSameSiteString::kUnspecified;
+  CookieSameSite samesite = parsed_cookie.SameSite(&samesite_string);
+  RecordCookieSameSiteAttributeValueHistogram(samesite_string);
+
   std::unique_ptr<CanonicalCookie> cc(std::make_unique<CanonicalCookie>(
       parsed_cookie.Name(), parsed_cookie.Value(), cookie_domain, cookie_path,
       creation_time, cookie_expires, creation_time, parsed_cookie.IsSecure(),
-      parsed_cookie.IsHttpOnly(), parsed_cookie.SameSite(),
-      parsed_cookie.Priority()));
+      parsed_cookie.IsHttpOnly(), samesite, parsed_cookie.Priority()));
 
   DCHECK(cc->IsCanonical());
 
@@ -430,16 +433,16 @@
   if (!IsOnPath(url.path()))
     status.AddExclusionReason(CookieInclusionStatus::EXCLUDE_NOT_ON_PATH);
   // Don't include same-site cookies for cross-site requests.
-  CookieSameSite effective_same_site = GetEffectiveSameSite();
+  CookieEffectiveSameSite effective_same_site = GetEffectiveSameSite();
   switch (effective_same_site) {
-    case CookieSameSite::STRICT_MODE:
+    case CookieEffectiveSameSite::STRICT_MODE:
       if (options.same_site_cookie_context() <
           CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT) {
         status.AddExclusionReason(
             CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT);
       }
       break;
-    case CookieSameSite::LAX_MODE:
+    case CookieEffectiveSameSite::LAX_MODE:
       if (options.same_site_cookie_context() <
           CookieOptions::SameSiteCookieContext::SAME_SITE_LAX) {
         // Log metrics for a cookie that would have been included under the
@@ -461,7 +464,7 @@
       }
       break;
     // TODO(crbug.com/990439): Add a browsertest for this behavior.
-    case CookieSameSite::LAX_MODE_ALLOW_UNSAFE:
+    case CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE:
       DCHECK(SameSite() == CookieSameSite::UNSPECIFIED);
       if (options.same_site_cookie_context() <
           CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE) {
@@ -510,9 +513,9 @@
     status.AddExclusionReason(CookieInclusionStatus::EXCLUDE_HTTP_ONLY);
   }
 
-  CookieSameSite effective_same_site = GetEffectiveSameSite();
+  CookieEffectiveSameSite effective_same_site = GetEffectiveSameSite();
   switch (effective_same_site) {
-    case CookieSameSite::STRICT_MODE:
+    case CookieEffectiveSameSite::STRICT_MODE:
       // This intentionally checks for `< SAME_SITE_LAX`, as we allow
       // `SameSite=Strict` cookies to be set for top-level navigations that
       // qualify for receipt of `SameSite=Lax` cookies.
@@ -525,8 +528,8 @@
             CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT);
       }
       break;
-    case CookieSameSite::LAX_MODE:
-    case CookieSameSite::LAX_MODE_ALLOW_UNSAFE:
+    case CookieEffectiveSameSite::LAX_MODE:
+    case CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE:
       if (options.same_site_cookie_context() <
           CookieOptions::SameSiteCookieContext::SAME_SITE_LAX) {
         if (SameSite() == CookieSameSite::UNSPECIFIED) {
@@ -608,17 +611,15 @@
       break;
   }
 
-  if (!IsValidSameSiteValue(same_site_))
-    return false;
-
   return true;
 }
 
 bool CanonicalCookie::IsEffectivelySameSiteNone() const {
-  return GetEffectiveSameSite() == CookieSameSite::NO_RESTRICTION;
+  return GetEffectiveSameSite() == CookieEffectiveSameSite::NO_RESTRICTION;
 }
 
-CookieSameSite CanonicalCookie::GetEffectiveSameSiteForTesting() const {
+CookieEffectiveSameSite CanonicalCookie::GetEffectiveSameSiteForTesting()
+    const {
   return GetEffectiveSameSite();
 }
 
@@ -697,25 +698,27 @@
   return true;
 }
 
-CookieSameSite CanonicalCookie::GetEffectiveSameSite() const {
-  CookieSameSite effective_same_site = SameSite();
-  // If a cookie does not have a SameSite attribute, the effective SameSite
-  // mode depends on the SameSiteByDefaultCookies setting and whether the cookie
-  // is short-lived.
-  if (SameSite() == CookieSameSite::UNSPECIFIED) {
-    effective_same_site = cookie_util::IsSameSiteByDefaultCookiesEnabled()
-                              ? (IsRecentlyCreated(kLaxAllowUnsafeMaxAge)
-                                     ? CookieSameSite::LAX_MODE_ALLOW_UNSAFE
-                                     : CookieSameSite::LAX_MODE)
-                              : CookieSameSite::NO_RESTRICTION;
+CookieEffectiveSameSite CanonicalCookie::GetEffectiveSameSite() const {
+  switch (SameSite()) {
+    // If a cookie does not have a SameSite attribute, the effective SameSite
+    // mode depends on the SameSiteByDefaultCookies setting and whether the
+    // cookie is recently-created.
+    case CookieSameSite::UNSPECIFIED:
+      return cookie_util::IsSameSiteByDefaultCookiesEnabled()
+                 ? (IsRecentlyCreated(kLaxAllowUnsafeMaxAge)
+                        ? CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE
+                        : CookieEffectiveSameSite::LAX_MODE)
+                 : CookieEffectiveSameSite::NO_RESTRICTION;
+    case CookieSameSite::NO_RESTRICTION:
+      return CookieEffectiveSameSite::NO_RESTRICTION;
+    case CookieSameSite::LAX_MODE:
+      return CookieEffectiveSameSite::LAX_MODE;
+    case CookieSameSite::STRICT_MODE:
+      return CookieEffectiveSameSite::STRICT_MODE;
+    // TODO(crbug.com/989171): Replace this with FirstParty{Lax,Strict}.
+    case CookieSameSite::EXTENDED_MODE:
+      return CookieEffectiveSameSite::LAX_MODE;
   }
-
-  // TODO(crbug.com/989171): Replace this with FirstParty{Lax,Strict}.
-  if (SameSite() == CookieSameSite::EXTENDED_MODE)
-    effective_same_site = CookieSameSite::LAX_MODE;
-
-  DCHECK(IsValidEffectiveSameSiteValue(effective_same_site));
-  return effective_same_site;
 }
 
 bool CanonicalCookie::IsRecentlyCreated(base::TimeDelta age_threshold) const {
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h
index e91331d..007a3a6 100644
--- a/net/cookies/canonical_cookie.h
+++ b/net/cookies/canonical_cookie.h
@@ -220,7 +220,7 @@
   // SameSite restrictions).
   bool IsEffectivelySameSiteNone() const;
 
-  CookieSameSite GetEffectiveSameSiteForTesting() const;
+  CookieEffectiveSameSite GetEffectiveSameSiteForTesting() const;
 
   // Returns the cookie line (e.g. "cookie1=value1; cookie2=value2") represented
   // by |cookies|. The string is built in the same order as the given list.
@@ -269,7 +269,7 @@
   // are considering using this method, consider whether you should use
   // IncludeForRequestURL() or IsSetPermittedInContext() instead of doing the
   // SameSite computation yourself.
-  CookieSameSite GetEffectiveSameSite() const;
+  CookieEffectiveSameSite GetEffectiveSameSite() const;
 
   // Returns whether the cookie was created at most |age_threshold| ago.
   bool IsRecentlyCreated(base::TimeDelta age_threshold) const;
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc
index 04afd97..2a6dd2fb 100644
--- a/net/cookies/canonical_cookie_unittest.cc
+++ b/net/cookies/canonical_cookie_unittest.cc
@@ -441,7 +441,7 @@
 TEST(CanonicalCookieTest, GetEffectiveSameSite) {
   struct EffectiveSameSiteTestCase {
     CookieSameSite same_site;
-    CookieSameSite effective_same_site;
+    CookieEffectiveSameSite effective_same_site;
   };
 
   // Test GetEffectiveSameSite for recently created cookies
@@ -453,11 +453,12 @@
     feature_list.InitAndDisableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::NO_RESTRICTION}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED, CookieEffectiveSameSite::NO_RESTRICTION}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -473,11 +474,13 @@
     feature_list.InitAndEnableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE_ALLOW_UNSAFE}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED,
+         CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -496,11 +499,12 @@
     feature_list.InitAndDisableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::NO_RESTRICTION}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED, CookieEffectiveSameSite::NO_RESTRICTION}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -516,11 +520,13 @@
     feature_list.InitAndEnableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE_ALLOW_UNSAFE}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED,
+         CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -540,11 +546,12 @@
     feature_list.InitAndDisableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::NO_RESTRICTION}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED, CookieEffectiveSameSite::NO_RESTRICTION}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -560,11 +567,12 @@
     feature_list.InitAndEnableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED, CookieEffectiveSameSite::LAX_MODE}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -585,11 +593,12 @@
     feature_list.InitAndDisableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::NO_RESTRICTION}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED, CookieEffectiveSameSite::NO_RESTRICTION}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -605,11 +614,12 @@
     feature_list.InitAndEnableFeature(features::kSameSiteByDefaultCookies);
 
     const EffectiveSameSiteTestCase test_cases[] = {
-        {CookieSameSite::NO_RESTRICTION, CookieSameSite::NO_RESTRICTION},
-        {CookieSameSite::LAX_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::STRICT_MODE, CookieSameSite::STRICT_MODE},
-        {CookieSameSite::EXTENDED_MODE, CookieSameSite::LAX_MODE},
-        {CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE}};
+        {CookieSameSite::NO_RESTRICTION,
+         CookieEffectiveSameSite::NO_RESTRICTION},
+        {CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::STRICT_MODE, CookieEffectiveSameSite::STRICT_MODE},
+        {CookieSameSite::EXTENDED_MODE, CookieEffectiveSameSite::LAX_MODE},
+        {CookieSameSite::UNSPECIFIED, CookieEffectiveSameSite::LAX_MODE}};
 
     for (const auto& test_case : test_cases) {
       CanonicalCookie cookie("A", "2", "example.test", "/", creation_time,
@@ -697,7 +707,7 @@
     std::string cookie_line;
     bool is_samesite_by_default_enabled;
     CookieSameSite expected_samesite;
-    CookieSameSite expected_effective_samesite;
+    CookieEffectiveSameSite expected_effective_samesite;
     CookieOptions::SameSiteCookieContext request_options_samesite_context;
     CanonicalCookie::CookieInclusionStatus expected_inclusion_status;
     base::TimeDelta creation_time_delta = base::TimeDelta();
@@ -705,63 +715,63 @@
       // SameSite-by-default is not enabled:
       // Strict cookies:
       {"A=2; SameSite=Strict", false, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT)},
       {"A=2; SameSite=Strict", false, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT)},
       {"A=2; SameSite=Strict", false, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT)},
       {"A=2; SameSite=Strict", false, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
       // Lax cookies:
       {"A=2; SameSite=Lax", false, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_LAX)},
       {"A=2; SameSite=Lax", false, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_LAX)},
       {"A=2; SameSite=Lax", false, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=Lax", false, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
       // None cookies:
       {"A=2; SameSite=None; Secure", false, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=None; Secure", false, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=None; Secure", false, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=None; Secure", false, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
       // Unspecified cookies (without SameSite-by-default):
       {"A=2", false, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus::MakeFromReasonsForTesting(
            std::vector<
@@ -769,7 +779,7 @@
            CanonicalCookie::CookieInclusionStatus::
                WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT)},
       {"A=2", false, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus::MakeFromReasonsForTesting(
            std::vector<
@@ -777,74 +787,74 @@
            CanonicalCookie::CookieInclusionStatus::
                WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT)},
       {"A=2", false, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2", false, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
 
       // SameSite-by-default is enabled:
       // Strict cookies:
       {"A=2; SameSite=Strict", true, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT)},
       {"A=2; SameSite=Strict", true, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT)},
       {"A=2; SameSite=Strict", true, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT)},
       {"A=2; SameSite=Strict", true, CookieSameSite::STRICT_MODE,
-       CookieSameSite::STRICT_MODE,
+       CookieEffectiveSameSite::STRICT_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
       // Lax cookies:
       {"A=2; SameSite=Lax", true, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_LAX)},
       {"A=2; SameSite=Lax", true, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_LAX)},
       {"A=2; SameSite=Lax", true, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=Lax", true, CookieSameSite::LAX_MODE,
-       CookieSameSite::LAX_MODE,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
       // None cookies:
       {"A=2; SameSite=None; Secure", true, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=None; Secure", true, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=None; Secure", true, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus()},
       {"A=2; SameSite=None; Secure", true, CookieSameSite::NO_RESTRICTION,
-       CookieSameSite::NO_RESTRICTION,
+       CookieEffectiveSameSite::NO_RESTRICTION,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus()},
       // Unspecified recently-created cookies (with SameSite-by-default):
       {"A=2", true, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE,
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::
@@ -853,7 +863,7 @@
                WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT),
        kShortAge},
       {"A=2", true, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE,
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus::MakeFromReasonsForTesting(
            std::vector<
@@ -862,15 +872,16 @@
                WARN_SAMESITE_UNSPECIFIED_LAX_ALLOW_UNSAFE),
        kShortAge},
       {"A=2", true, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE,
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus(), kShortAge},
       {"A=2", true, CookieSameSite::UNSPECIFIED,
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE,
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus(), kShortAge},
       // Unspecified not-recently-created cookies (with SameSite-by-default):
-      {"A=2", true, CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE,
+      {"A=2", true, CookieSameSite::UNSPECIFIED,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::CROSS_SITE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::
@@ -878,7 +889,8 @@
            CanonicalCookie::CookieInclusionStatus::
                WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT),
        kLongAge},
-      {"A=2", true, CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE,
+      {"A=2", true, CookieSameSite::UNSPECIFIED,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE,
        CanonicalCookie::CookieInclusionStatus(
            CanonicalCookie::CookieInclusionStatus::
@@ -886,10 +898,12 @@
            CanonicalCookie::CookieInclusionStatus::
                WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT),
        kLongAge},
-      {"A=2", true, CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE,
+      {"A=2", true, CookieSameSite::UNSPECIFIED,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_LAX,
        CanonicalCookie::CookieInclusionStatus(), kLongAge},
-      {"A=2", true, CookieSameSite::UNSPECIFIED, CookieSameSite::LAX_MODE,
+      {"A=2", true, CookieSameSite::UNSPECIFIED,
+       CookieEffectiveSameSite::LAX_MODE,
        CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT,
        CanonicalCookie::CookieInclusionStatus(), kLongAge},
   };
@@ -939,7 +953,7 @@
   ASSERT_TRUE(cookie.get());
   EXPECT_FALSE(cookie->IsSecure());
   EXPECT_EQ(CookieSameSite::NO_RESTRICTION, cookie->SameSite());
-  EXPECT_EQ(CookieSameSite::NO_RESTRICTION,
+  EXPECT_EQ(CookieEffectiveSameSite::NO_RESTRICTION,
             cookie->GetEffectiveSameSiteForTesting());
 
   {
diff --git a/net/cookies/cookie_constants.cc b/net/cookies/cookie_constants.cc
index 6f8696f..14dfe28 100644
--- a/net/cookies/cookie_constants.cc
+++ b/net/cookies/cookie_constants.cc
@@ -5,6 +5,7 @@
 #include "net/cookies/cookie_constants.h"
 
 #include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 
 namespace net {
@@ -53,7 +54,6 @@
 }
 
 std::string CookieSameSiteToString(CookieSameSite same_site) {
-  DCHECK(IsValidSameSiteValue(same_site));
   switch (same_site) {
     case CookieSameSite::LAX_MODE:
       return kSameSiteLax;
@@ -65,54 +65,40 @@
       return kSameSiteExtended;
     case CookieSameSite::UNSPECIFIED:
       return kSameSiteUnspecified;
-    default:
-      NOTREACHED();
-      return "INVALID";
   }
 }
 
-CookieSameSite StringToCookieSameSite(const std::string& same_site) {
+CookieSameSite StringToCookieSameSite(const std::string& same_site,
+                                      CookieSameSiteString* samesite_string) {
+  // Put a value on the stack so that we can assign to |*samesite_string|
+  // instead of having to null-check it all the time.
+  CookieSameSiteString ignored = CookieSameSiteString::kUnspecified;
+  if (!samesite_string)
+    samesite_string = &ignored;
+
+  *samesite_string = CookieSameSiteString::kUnrecognized;
   CookieSameSite samesite = CookieSameSite::UNSPECIFIED;
-  if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteNone))
+
+  if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteNone)) {
     samesite = CookieSameSite::NO_RESTRICTION;
-  if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteLax))
+    *samesite_string = CookieSameSiteString::kNone;
+  } else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteLax)) {
     samesite = CookieSameSite::LAX_MODE;
-  if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteStrict))
+    *samesite_string = CookieSameSiteString::kLax;
+  } else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteStrict)) {
     samesite = CookieSameSite::STRICT_MODE;
-  if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteExtended))
+    *samesite_string = CookieSameSiteString::kStrict;
+  } else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteExtended)) {
     samesite = CookieSameSite::EXTENDED_MODE;
-  DCHECK(IsValidSameSiteValue(samesite));
+    *samesite_string = CookieSameSiteString::kExtended;
+  } else if (same_site == "") {
+    *samesite_string = CookieSameSiteString::kEmptyString;
+  }
   return samesite;
 }
 
-bool IsValidSameSiteValue(CookieSameSite value) {
-  switch (value) {
-    case CookieSameSite::UNSPECIFIED:
-    case CookieSameSite::NO_RESTRICTION:
-    case CookieSameSite::LAX_MODE:
-    case CookieSameSite::STRICT_MODE:
-    case CookieSameSite::EXTENDED_MODE:
-      return true;
-    case CookieSameSite::LAX_MODE_ALLOW_UNSAFE:
-      return false;
-  }
-  NOTREACHED();
-  return false;
-}
-
-bool IsValidEffectiveSameSiteValue(CookieSameSite value) {
-  switch (value) {
-    case CookieSameSite::NO_RESTRICTION:
-    case CookieSameSite::LAX_MODE:
-    case CookieSameSite::LAX_MODE_ALLOW_UNSAFE:
-    case CookieSameSite::STRICT_MODE:
-      return true;
-    case CookieSameSite::UNSPECIFIED:
-    case CookieSameSite::EXTENDED_MODE:
-      return false;
-  }
-  NOTREACHED();
-  return false;
+void RecordCookieSameSiteAttributeValueHistogram(CookieSameSiteString value) {
+  UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteAttributeValue", value);
 }
 
 }  // namespace net
diff --git a/net/cookies/cookie_constants.h b/net/cookies/cookie_constants.h
index c792bd13..3569b43 100644
--- a/net/cookies/cookie_constants.h
+++ b/net/cookies/cookie_constants.h
@@ -26,19 +26,45 @@
 // See https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00
 // and https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis for
 // information about same site cookie restrictions.
-// Note: Some values are allowed for a cookie's SameSite field (what literally
-// came in the Set-Cookie line), and some are allowed for the effective SameSite
-// (the actual rules to be applied when deciding whether the cookie can be
-// accessed). Some are only allowed for one but not the other.
+// These values are allowed for the SameSite field of a cookie. They mostly
+// correspond to CookieEffectiveSameSite values.
 // Note: Don't renumber, as these values are persisted to a database.
 enum class CookieSameSite {
-  UNSPECIFIED = -1,    // Allowed for SameSite only.
-  NO_RESTRICTION = 0,  // Allowed for SameSite and effective SameSite.
-  LAX_MODE = 1,        // Allowed for SameSite and effective SameSite.
-  STRICT_MODE = 2,     // Allowed for SameSite and effective SameSite.
-  EXTENDED_MODE = 3,   // (Not implemented) Allowed for SameSite only.
-  // Same as LAX_MODE, except cookie is also sent if the HTTP method is unsafe.
-  LAX_MODE_ALLOW_UNSAFE = 4,  // Allowed for effective SameSite only.
+  UNSPECIFIED = -1,
+  NO_RESTRICTION = 0,
+  LAX_MODE = 1,
+  STRICT_MODE = 2,
+  EXTENDED_MODE = 3,  // TODO(chlily): Remove or gate behind flag.
+};
+
+// These are the enforcement modes that may be applied to a cookie when deciding
+// inclusion/exclusion. They mostly correspond to CookieSameSite values.
+enum class CookieEffectiveSameSite {
+  NO_RESTRICTION = 0,
+  LAX_MODE = 1,
+  STRICT_MODE = 2,
+  LAX_MODE_ALLOW_UNSAFE = 3,
+
+  // Keep last, used for histograms.
+  COUNT
+};
+
+// Used for histograms only. Do not renumber. Keep in sync with enums.xml.
+enum class CookieSameSiteString {
+  // No SameSite attribute is present.
+  kUnspecified = 0,
+  // The SameSite attribute is present but has no value.
+  kEmptyString = 1,
+  // The SameSite attribute has an unrecognized value.
+  kUnrecognized = 2,
+  // The SameSite attribute has a recognized value.
+  kLax = 3,
+  kStrict = 4,
+  kNone = 5,
+  kExtended = 6,
+
+  // Keep last, update if adding new value.
+  kMaxValue = kExtended
 };
 
 // What rules to apply when determining when whether access to a particular
@@ -71,11 +97,15 @@
 
 // Converts the Set-Cookie header SameSite token |same_site| to a
 // CookieSameSite. Defaults to CookieSameSite::UNSPECIFIED for empty or
-// unrecognized strings.
-NET_EXPORT CookieSameSite StringToCookieSameSite(const std::string& same_site);
+// unrecognized strings. Returns an appropriate value of CookieSameSiteString in
+// |samesite_string| to indicate what type of string was parsed as the SameSite
+// attribute value, if a pointer is provided.
+NET_EXPORT CookieSameSite
+StringToCookieSameSite(const std::string& same_site,
+                       CookieSameSiteString* samesite_string = nullptr);
 
-NET_EXPORT bool IsValidSameSiteValue(CookieSameSite value);
-NET_EXPORT bool IsValidEffectiveSameSiteValue(CookieSameSite value);
+NET_EXPORT void RecordCookieSameSiteAttributeValueHistogram(
+    CookieSameSiteString value);
 
 }  // namespace net
 
diff --git a/net/cookies/cookie_constants_unittest.cc b/net/cookies/cookie_constants_unittest.cc
index df2b1d4..9a8ac98 100644
--- a/net/cookies/cookie_constants_unittest.cc
+++ b/net/cookies/cookie_constants_unittest.cc
@@ -38,6 +38,7 @@
   }
 }
 
+// TODO(crbug.com/996811): Add tests for multiple possibly-invalid attributes.
 TEST(CookieConstantsTest, TestCookieSameSite) {
   // Test case insensitivity
   EXPECT_EQ(CookieSameSite::NO_RESTRICTION, StringToCookieSameSite("None"));
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index d522c4d..fcd45cd7 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -1170,6 +1170,10 @@
     status.AddExclusionReason(
         CanonicalCookie::CookieInclusionStatus::EXCLUDE_SAMESITE_NONE_INSECURE);
   }
+  // Log whether a SameSite=None cookie is Secure or not.
+  if (cc->SameSite() == CookieSameSite::NO_RESTRICTION) {
+    UMA_HISTOGRAM_BOOLEAN("Cookie.SameSiteNoneIsSecure", cc->IsSecure());
+  }
 
   const std::string key(GetKey(cc->Domain()));
 
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
index c3fe16e..4592389e 100644
--- a/net/cookies/cookie_monster_unittest.cc
+++ b/net/cookies/cookie_monster_unittest.cc
@@ -3421,25 +3421,27 @@
     std::string cookie_line;
     CanonicalCookie::CookieInclusionStatus expected_set_cookie_result;
     // Only makes sense to check if result is INCLUDE:
-    CookieSameSite expected_effective_samesite = CookieSameSite::UNSPECIFIED;
+    CookieEffectiveSameSite expected_effective_samesite =
+        CookieEffectiveSameSite::NO_RESTRICTION;
     base::TimeDelta creation_time_delta = base::TimeDelta();
   } test_cases[] = {
       // Feature enabled:
       // Cookie set from a secure URL with SameSite enabled is not rejected.
       {true, true, "A=B; SameSite=Lax",
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE},
       // Cookie set from a secure URL which is defaulted into Lax is not
       // rejected.
       {true, true, "A=B",  // recently-set session cookie.
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
       {true, true, "A=B",  // not-recently-set session cookie.
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE,
-       kLongAge},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE, kLongAge},
       // Cookie set from a secure URL with SameSite=None and Secure is set.
       {true, true, "A=B; SameSite=None; Secure",
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::NO_RESTRICTION},
+       CookieEffectiveSameSite::NO_RESTRICTION},
       // Cookie set from a secure URL with SameSite=None but not specifying
       // Secure is rejected.
       {true, true, "A=B; SameSite=None",
@@ -3452,34 +3454,35 @@
       // rejected.
       {true, false, "A=B",  // recently-set session cookie.
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
       {true, false, "A=B",  // not-recently-set session cookie.
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE,
-       kLongAge},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE, kLongAge},
       {true, false, "A=B; Max-Age=1000000",  // recently-set persistent cookie.
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
       {true, false,
        "A=B; Max-Age=1000000",  // not-recently-set persistent cookie.
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE,
-       kLongAge},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE, kLongAge},
 
       // Feature not enabled (but SameSiteByDefaultCookies is still enabled):
       // Cookie set from a secure URL with SameSite enabled is not rejected.
       {false, true, "A=B; SameSite=Lax",
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE},
       // Cookie set from a secure URL which is defaulted into Lax is not
       // rejected.
       {false, true, "A=B",  // recently-set session cookie.
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
       {false, true, "A=B",  // not-recently-set session cookie.
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE,
-       kLongAge},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE, kLongAge},
       // Cookie set from a secure URL with SameSite=None and Secure is set.
       {false, true, "A=B; SameSite=None; Secure",
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::NO_RESTRICTION},
+       CookieEffectiveSameSite::NO_RESTRICTION},
       // Cookie set from an insecure URL with SameSite=None (which can't ever be
       // secure because it's an insecure URL) is NOT rejected, because
       // CookiesWithoutSameSiteMustBeSecure is not enabled.
@@ -3488,15 +3491,15 @@
            std::vector<
                CanonicalCookie::CookieInclusionStatus::ExclusionReason>(),
            CanonicalCookie::CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE),
-       CookieSameSite::NO_RESTRICTION},
+       CookieEffectiveSameSite::NO_RESTRICTION},
       // Cookie set from an insecure URL which is defaulted into Lax is not
       // rejected.
       {false, false, "A=B",  // recently-set session cookie.
        CanonicalCookie::CookieInclusionStatus(),
-       CookieSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
+       CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE, kShortAge},
       {false, false, "A=B",  // not-recently-set session cookie.
-       CanonicalCookie::CookieInclusionStatus(), CookieSameSite::LAX_MODE,
-       kLongAge},
+       CanonicalCookie::CookieInclusionStatus(),
+       CookieEffectiveSameSite::LAX_MODE, kLongAge},
   };
 
   auto cm = std::make_unique<CookieMonster>(nullptr, nullptr);
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc
index b3053327..810343e 100644
--- a/net/cookies/parsed_cookie.cc
+++ b/net/cookies/parsed_cookie.cc
@@ -47,6 +47,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
+#include "net/cookies/cookie_constants.h"
 #include "net/http/http_util.h"
 
 namespace {
@@ -153,10 +154,16 @@
   return !pairs_.empty();
 }
 
-CookieSameSite ParsedCookie::SameSite() const {
-  return (same_site_index_ == 0)
-             ? CookieSameSite::UNSPECIFIED
-             : StringToCookieSameSite(pairs_[same_site_index_].second);
+CookieSameSite ParsedCookie::SameSite(
+    CookieSameSiteString* samesite_string) const {
+  CookieSameSite samesite = CookieSameSite::UNSPECIFIED;
+  if (same_site_index_ != 0) {
+    samesite = StringToCookieSameSite(pairs_[same_site_index_].second,
+                                      samesite_string);
+  } else if (samesite_string) {
+    *samesite_string = CookieSameSiteString::kUnspecified;
+  }
+  return samesite;
 }
 
 CookiePriority ParsedCookie::Priority() const {
diff --git a/net/cookies/parsed_cookie.h b/net/cookies/parsed_cookie.h
index d6b951a..3dc24ac 100644
--- a/net/cookies/parsed_cookie.h
+++ b/net/cookies/parsed_cookie.h
@@ -48,7 +48,10 @@
   const std::string& MaxAge() const { return pairs_[maxage_index_].second; }
   bool IsSecure() const { return secure_index_ != 0; }
   bool IsHttpOnly() const { return httponly_index_ != 0; }
-  CookieSameSite SameSite() const;
+  // Also spits out an enum value representing the string given as the SameSite
+  // attribute value, if |samesite_string| is non-null.
+  CookieSameSite SameSite(
+      CookieSameSiteString* samesite_string = nullptr) const;
   CookiePriority Priority() const;
 
   // Returns the number of attributes, for example, returning 2 for:
diff --git a/net/cookies/parsed_cookie_unittest.cc b/net/cookies/parsed_cookie_unittest.cc
index eb038f6..81776c9 100644
--- a/net/cookies/parsed_cookie_unittest.cc
+++ b/net/cookies/parsed_cookie_unittest.cc
@@ -505,6 +505,39 @@
   EXPECT_TRUE(pc.IsValid());
 }
 
+// Test that the correct enum value is returned for the SameSite attribute
+// string.
+TEST(ParsedCookieTest, CookieSameSiteStringEnum) {
+  ParsedCookie pc("name=value; SameSite");
+  CookieSameSiteString actual = CookieSameSiteString::kLax;
+  EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kEmptyString, actual);
+
+  pc.SetSameSite("Strict");
+  EXPECT_EQ(CookieSameSite::STRICT_MODE, pc.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kStrict, actual);
+
+  pc.SetSameSite("Lax");
+  EXPECT_EQ(CookieSameSite::LAX_MODE, pc.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kLax, actual);
+
+  pc.SetSameSite("None");
+  EXPECT_EQ(CookieSameSite::NO_RESTRICTION, pc.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kNone, actual);
+
+  pc.SetSameSite("Extended");
+  EXPECT_EQ(CookieSameSite::EXTENDED_MODE, pc.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kExtended, actual);
+
+  pc.SetSameSite("Bananas");
+  EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kUnrecognized, actual);
+
+  ParsedCookie pc2("no_samesite=1");
+  EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc2.SameSite(&actual));
+  EXPECT_EQ(CookieSameSiteString::kUnspecified, actual);
+}
+
 TEST(ParsedCookieTest, SettersInputValidation) {
   ParsedCookie pc("name=foobar");
   EXPECT_TRUE(pc.SetPath("baz"));
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
index a29dc06..289f6a3 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
@@ -481,7 +481,6 @@
 };
 
 DBCookieSameSite CookieSameSiteToDBCookieSameSite(CookieSameSite value) {
-  DCHECK(IsValidSameSiteValue(value));
   switch (value) {
     case CookieSameSite::NO_RESTRICTION:
       return kCookieSameSiteNoRestriction;
@@ -493,12 +492,7 @@
       return kCookieSameSiteExtended;
     case CookieSameSite::UNSPECIFIED:
       return kCookieSameSiteUnspecified;
-    default:
-      break;
   }
-
-  NOTREACHED();
-  return kCookieSameSiteUnspecified;
 }
 
 CookieSameSite DBCookieSameSiteToCookieSameSite(DBCookieSameSite value) {
@@ -520,8 +514,6 @@
       samesite = CookieSameSite::UNSPECIFIED;
       break;
   }
-
-  DCHECK(IsValidSameSiteValue(samesite));
   return samesite;
 }
 
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb
index f207b67..92728d8 100644
--- a/remoting/resources/remoting_strings_bn.xtb
+++ b/remoting/resources/remoting_strings_bn.xtb
@@ -58,7 +58,7 @@
 <translation id="2509394361235492552"><ph name="HOSTNAME" /> এ সংযুক্ত হয়েছে</translation>
 <translation id="2512228156274966424">দ্রষ্টব্য: সমস্ত কীবোর্ড শর্টকাট উপলভ্য থাকাকে নিশ্চিত করতে, আপনি Chrome রিমোট ডেস্কটপ ‘উইন্ডো হিসাবে খোলার জন্য’ কনফিগার করতে পারেন৷</translation>
 <translation id="2540992418118313681">আপনি কি অন্য ব্যবহারকারীকে দেখার এবং নিয়ন্ত্রণ করার জন্য এই কম্পিউটারটি শেয়ার করতে চান?</translation>
-<translation id="254771646005658629">রিমোট ব্যবহারকারীদের এই Mac সিস্টেমকে কন্ট্রোল করার অনুমতি দিন</translation>
+<translation id="254771646005658629">রিমোট ব্যবহারকারীদের এই Mac সিস্টেম কন্ট্রোল করার অনুমতি দিন</translation>
 <translation id="2579271889603567289">হোস্ট ক্র্যাশ হয়েছে বা শুরু হতে পারেনি।</translation>
 <translation id="2599300881200251572">এই পরিষেবাটি Chrome রিমোট ডেস্কটপ থেকে আগত কানেকশন চালু করে৷</translation>
 <translation id="2647232381348739934">Chromoting পরিষেবা</translation>
diff --git a/remoting/resources/remoting_strings_mr.xtb b/remoting/resources/remoting_strings_mr.xtb
index bcd0b3e9..0642b0b 100644
--- a/remoting/resources/remoting_strings_mr.xtb
+++ b/remoting/resources/remoting_strings_mr.xtb
@@ -58,6 +58,7 @@
 <translation id="2509394361235492552"><ph name="HOSTNAME" /> शी कनेक्ट केले</translation>
 <translation id="2512228156274966424">टीप: सर्व कीबोर्ड शॉर्टकट उपलब्ध असल्याचे सुनिश्चित करण्यासाठी, तुम्ही ‘विंडो म्हणून उघडण्यासाठी’ Chrome रिमोट डेस्कटॉप कॉन्फिगर करू शकता.</translation>
 <translation id="2540992418118313681">तुम्ही हा कॉंप्युटर दुसर्‍या वापरकर्त्याकरिता पाहण्यासाठी आणि नियंत्रित करण्यासाठी शेअर करू इच्छिता?</translation>
+<translation id="254771646005658629">रिमोट वापरकर्त्यांना हे Mac नियंत्रित करू द्या</translation>
 <translation id="2579271889603567289">होस्ट क्रॅश झाले किंवा सुरू झाले नाही.</translation>
 <translation id="2599300881200251572">ही सेवा Chrome रिमोट डेस्कटॉप क्लायंटकडील येणारी कनेक्शन सक्षम करते.</translation>
 <translation id="2647232381348739934">Chromoting सेवा</translation>
@@ -182,6 +183,11 @@
 <translation id="5419185025274123272">अॅप्लिकेशन रीसेट करणे शक्य झाले नाही. तुम्ही तरीही एक बग अहवाल पाठवू शकता.</translation>
 <translation id="5419418238395129586">अखेरचे ऑनलाइन होते: <ph name="DATE" /></translation>
 <translation id="544077782045763683">होस्टने बंद केले आहे.</translation>
+<translation id="5463789431147491241">या Mac वर <ph name="PRODUCT_NAME" /> वापरण्यासाठी, या पायऱ्या फॉलो करा:
+
+खाली '<ph name="BUTTON_NAME" />' निवडा. तुमच्या सुरक्षा आणि गोपनीयता प्राधान्यांमध्ये, '<ph name="SERVICE_SCRIPT_NAME" />' पुढे असलेल्या चौकटीवर खूण करा.
+
+जर '<ph name="SERVICE_SCRIPT_NAME" />' वर आधीच खूण केलेली असल्यास, चौकटीतली खूण काढा आणि परत चौकटीवर खूण करा.</translation>
 <translation id="5510035215749041527">आता डिस्कनेक्ट करा</translation>
 <translation id="5593560073513909978">सेवा तात्पुरती अनुपलब्ध आहे. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="5601503069213153581">पिन</translation>
@@ -207,7 +213,7 @@
 <translation id="6167788864044230298">Chrome अॅप फ्लो</translation>
 <translation id="6173536234069435147">मी माझ्या Google ड्राइव्ह फायली उघडू शकत नाही.</translation>
 <translation id="6178645564515549384">दूरस्थ सहाय्यासाठी मूळ संदेशन होस्ट</translation>
-<translation id="618120821413932081">विंडोशी जुळवण्यासाठी रिमोट रिझोल्युशन अपडेट करा</translation>
+<translation id="618120821413932081">विंडोशी जुळवण्यासाठी रिमोट रिझोल्यूशन अपडेट करा</translation>
 <translation id="6193698048504518729"><ph name="HOSTNAME" /> शी कनेक्‍ट करा</translation>
 <translation id="6198252989419008588">पिन बदला</translation>
 <translation id="6204583485351780592"><ph name="HOSTNAME" /> (कालबाह्य)</translation>
@@ -242,7 +248,7 @@
 <translation id="6948905685698011662">Chrome रिमोट डेस्कटॉप आता वेबवर आहे! आमचे <ph name="LINK_BEGIN" />विनामूल्य वेब अॅप<ph name="LINK_END" /> पहा.</translation>
 <translation id="6963936880795878952">रिमोट कॉंप्युटरशी कनेक्शन तात्पुरते ब्लॉक केली आहेत, कारण कोणीतरी अवैध पिन सह त्यावर कनेक्ट करण्‍याचा प्रयत्न करत होते. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="6965382102122355670">ठीक आहे</translation>
-<translation id="6985691951107243942">तुम्हाला खात्री आहे की <ph name="HOSTNAME" /> ची रिमोट कनेक्शन तुम्ही बंद करू इच्छिता? तुम्ही तुमचा विचार बदलल्यास, तुमचे कनेक्शन पुन्हा सुरू करण्‍यासाठी त्या काँम्पुटरला भेट देणे आवश्यक असेल.</translation>
+<translation id="6985691951107243942">तुम्हाला खात्री आहे की तुम्हाला <ph name="HOSTNAME" /> चे रिमोट कनेक्शन अक्षम करायचे आहे? तुम्ही तुमचा विचार बदलल्यास, तुम्हाला कनेक्शन पुन्हा सक्षम करण्‍यासाठी त्या कॉंप्युटरला भेट देणे आवश्यक असेल.</translation>
 <translation id="6998989275928107238">प्रति</translation>
 <translation id="7019153418965365059">न ओळखलेली होस्ट एरर: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">दूरस्‍थ सहाय्य</translation>
@@ -298,12 +304,14 @@
 <translation id="837021510621780684">या कॉंप्युटरवरुन</translation>
 <translation id="8383794970363966105">Chromoting वापरण्यासाठी, तुम्हाला आपल्या डिव्हाइसमध्ये एक Google खाते जोडणे आवश्यक असेल.</translation>
 <translation id="8386846956409881180">अवैध OAuth क्रेडेंशियलसह होस्ट कॉन्फिगर केला आहे.</translation>
+<translation id="8406498562923498210">तुमच्या Chrome रिमोट डेस्कटॉप वातावरणात लाँच करण्यासाठी सेशन निवडा. (लक्षात घ्या की काही सेशन प्रकार Chrome रिमोट डेस्कटॉप आणि लोकल कन्सोलवर एकाच वेळी रन होण्यास कदाचित सपोर्ट करणार नाहीत.)</translation>
 <translation id="8428213095426709021">सेटिंग्ज</translation>
 <translation id="8445362773033888690">Google Play Store मध्ये पहा</translation>
 <translation id="8509907436388546015">डेस्कटॉप संकलन प्रक्रिया</translation>
 <translation id="8513093439376855948">दूरस्थ होस्ट व्यवस्थापनासाठी मूळ संदेशन होस्ट</translation>
 <translation id="8525306231823319788">फुल स्क्रीन</translation>
 <translation id="8548209692293300397">तुम्ही यापूर्वी <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) म्हणून साइन इन केले होते. त्या खात्यामध्ये तुमच्या कॉंप्युटर अॅक्सेस करण्यासाठी, त्या खात्यासह <ph name="LINK_BEGIN" />Google Chrome वर साइन इन करा<ph name="LINK_END" /> आणि Chrome रिमोट डेस्कटॉप पुन्हा इंस्टॉल करा.</translation>
+<translation id="858006550102277544">टिप्पणी</translation>
 <translation id="8642984861538780905">मध्यम</translation>
 <translation id="8712909229180978490">मी Google ड्राइव्हमध्ये माझ्या सेव्ह केलेल्या फायली ऑनलाइन पाहू शकत नाही.</translation>
 <translation id="8743328882720071828">तुमचा कॉंप्युटर पाहण्‍यासाठी आणि नियंत्रित करण्‍यासाठी तुम्ही <ph name="CLIENT_USERNAME" /> ना अनुमती देऊ इच्छिता?</translation>
@@ -321,6 +329,7 @@
 <translation id="9126115402994542723">या डिव्हाइसवरून या होस्टशी कनेक्ट करताना पुन्हा पिन साठी विचारू नका.</translation>
 <translation id="9149580767411232853">संपूर्ण रिमोट डेस्कटॉप दृश्‍यमान ठेवा</translation>
 <translation id="9149992051684092333">तुमच्या डेस्कटॉपचे शेअररण सुरू करण्यासाठी, तुम्हाला सहाय्य करणार्‍या व्यक्तीला खालील अॅक्सेस कोड द्या.</translation>
+<translation id="916856682307586697">डीफॉल्ट XSession लाँच करा</translation>
 <translation id="9188433529406846933">अधिकृत करा</translation>
 <translation id="9213184081240281106">चुकीचे होस्ट कॉन्फिगरेशन.</translation>
 <translation id="951991426597076286">नकार द्या</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb
index beba85e5..c1df25a 100644
--- a/remoting/resources/remoting_strings_ta.xtb
+++ b/remoting/resources/remoting_strings_ta.xtb
@@ -183,9 +183,9 @@
 <translation id="5419185025274123272">பயன்பாட்டை மீட்டமைக்க முடியவில்லை. தொடர்ந்து நீங்கள் பிழைத் தொடர்பான புகாரை அனுப்பலாம்.</translation>
 <translation id="5419418238395129586">கடைசியாக ஆன்லைனில் இருந்தது: <ph name="DATE" /></translation>
 <translation id="544077782045763683">ஹோஸ்ட் இயங்கவில்லை.</translation>
-<translation id="5463789431147491241">Macகில் <ph name="PRODUCT_NAME" /> சாதனத்தைப் பயன்படுத்த இவற்றை செய்யவும்:
+<translation id="5463789431147491241">Macகில் <ph name="PRODUCT_NAME" /> ஐப் பயன்படுத்த இவற்றை செய்யவும்:
 
-கீழேயுள்ள '<ph name="BUTTON_NAME" />' பட்டனை கிளிக் செய்யவும். உங்கள் 'பாதுகாப்பும் தனியுரிமையும்’ விருப்பத்தேர்வுகளில் ’<ph name="SERVICE_SCRIPT_NAME" />' அடுத்துள்ள பெட்டியைத் தேர்வு செய்யவும்.
+கீழேயுள்ள '<ph name="BUTTON_NAME" />' பட்டனை கிளிக் செய்யவும். உங்கள் 'பாதுகாப்பும் தனியுரிமையும்’ விருப்பத்தேர்வுகளில் ’<ph name="SERVICE_SCRIPT_NAME" />'க்கு அடுத்துள்ள பெட்டியைத் தேர்வு செய்யவும்.
 
 '<ph name="SERVICE_SCRIPT_NAME" />' என்பது ஏற்கெனவே தேர்ந்தெடுக்கப்பட்டிருந்தால் அதைத் தேர்வுநீக்கி மீண்டும் தேர்ந்தெடுக்கவும்.</translation>
 <translation id="5510035215749041527">இப்போது துண்டிக்கவும்</translation>
@@ -305,7 +305,7 @@
 <translation id="837021510621780684">இந்தக் கம்ப்யூட்டரிலிருந்து</translation>
 <translation id="8383794970363966105">குரோமோட்டிங்கைப் பயன்படுத்த, உங்கள் சாதனத்தில் Google கணக்கைச் சேர்க்க வேண்டும்.</translation>
 <translation id="8386846956409881180">தவறான OAuth அனுமதிச் சான்றுகளுடன் ஹோஸ்ட் உள்ளமைக்கப்பட்டுள்ளது.</translation>
-<translation id="8406498562923498210">Chrome தொலைநிலை டெஸ்க்டாப் சூழலுள் வெளியிடுவதற்கு அமர்வு ஒன்றைத் தேர்வு செய்யவும். (கவனத்திற்கு: சில அமர்வு வகைகள் Chrome தொலைநிலை டெஸ்க்டாப்பிலும் அகக் கன்சோலிலும் ஒரே நேரத்தில் இயங்குவதை ஆதரிக்காமல் இருக்கக்கூடும்.)</translation>
+<translation id="8406498562923498210">Chrome தொலைநிலை டெஸ்க்டாப் சூழலுள் துவங்குவதற்கு அமர்வு ஒன்றைத் தேர்வு செய்யவும். (கவனத்திற்கு: சில அமர்வு வகைகள் Chrome தொலைநிலை டெஸ்க்டாப்பிலும் அகக் கன்சோலிலும் ஒரே நேரத்தில் இயங்குவதை ஆதரிக்காமல் இருக்கக்கூடும்.)</translation>
 <translation id="8428213095426709021">அமைப்புகள்</translation>
 <translation id="8445362773033888690">Google Play ஸ்டோரில் காட்டு</translation>
 <translation id="8509907436388546015">டெஸ்க்டாப் ஒருங்கிணைப்புச் செயல்முறை</translation>
@@ -330,7 +330,7 @@
 <translation id="9126115402994542723">இந்தச் சாதனத்திலிருந்து இந்த ஹோஸ்ட்டுடன் மீண்டும் இணைக்கும்போது PIN கேட்க வேண்டாம்.</translation>
 <translation id="9149580767411232853">தொலைநிலை டெஸ்க்டாப்பின் முழுத்திரையும் தெரியும்படி வை</translation>
 <translation id="9149992051684092333">உங்கள் டெஸ்க்டாப் பகிர்தலைத் தொடங்க, கீழே உள்ள அணுகல் குறியீட்டை உங்களுக்கு உதவுபவரிடம் வழங்குக.</translation>
-<translation id="916856682307586697">இயல்பான XSessionனை வெளியிடும்</translation>
+<translation id="916856682307586697">இயல்பான XSessionனை வெளியிடலாம்</translation>
 <translation id="9188433529406846933">அங்கீகரி</translation>
 <translation id="9213184081240281106">தவறான ஹோஸ்ட் உள்ளமைவு.</translation>
 <translation id="951991426597076286">நிராகரி</translation>
diff --git a/remoting/resources/remoting_strings_zh-CN.xtb b/remoting/resources/remoting_strings_zh-CN.xtb
index 3e0bc7e..69a9590 100644
--- a/remoting/resources/remoting_strings_zh-CN.xtb
+++ b/remoting/resources/remoting_strings_zh-CN.xtb
@@ -304,7 +304,7 @@
 <translation id="837021510621780684">来自此计算机</translation>
 <translation id="8383794970363966105">要使用Chrome远程访问,您需要先为自己的设备添加一个Google帐号。</translation>
 <translation id="8386846956409881180">为主机指定的 OAuth 凭据无效。</translation>
-<translation id="8406498562923498210">请选择一个要在 Chrome 远程桌面环境下启动的会话。(注意:某些会话类型可能不支持同时在 Chrome 远程桌面和本地控制台运行。)</translation>
+<translation id="8406498562923498210">请选择要在 Chrome 远程桌面环境下启动的会话。(注意:某些会话类型可能不支持同时在 Chrome 远程桌面和本地控制台运行。)</translation>
 <translation id="8428213095426709021">设置</translation>
 <translation id="8445362773033888690">在Google Play商店中查看</translation>
 <translation id="8509907436388546015">桌面集成进程</translation>
diff --git a/services/device/hid/hid_manager_impl.cc b/services/device/hid/hid_manager_impl.cc
index f0023249..096fe20 100644
--- a/services/device/hid/hid_manager_impl.cc
+++ b/services/device/hid/hid_manager_impl.cc
@@ -10,7 +10,9 @@
 #include "base/callback_helpers.h"
 #include "base/lazy_instance.h"
 #include "base/stl_util.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "services/device/hid/hid_connection_impl.h"
 
 namespace device {
@@ -50,23 +52,21 @@
 }
 
 void HidManagerImpl::GetDevices(GetDevicesCallback callback) {
-  hid_service_->GetDevices(base::BindOnce(&HidManagerImpl::CreateDeviceList,
-                                          weak_factory_.GetWeakPtr(),
-                                          std::move(callback), nullptr));
+  hid_service_->GetDevices(base::BindOnce(
+      &HidManagerImpl::CreateDeviceList, weak_factory_.GetWeakPtr(),
+      std::move(callback), mojo::NullAssociatedRemote()));
 }
 
 void HidManagerImpl::CreateDeviceList(
     GetDevicesCallback callback,
-    mojom::HidManagerClientAssociatedPtrInfo client,
+    mojo::PendingAssociatedRemote<mojom::HidManagerClient> client,
     std::vector<mojom::HidDeviceInfoPtr> devices) {
   std::move(callback).Run(std::move(devices));
 
   if (!client.is_valid())
     return;
 
-  mojom::HidManagerClientAssociatedPtr client_ptr;
-  client_ptr.Bind(std::move(client));
-  clients_.AddPtr(std::move(client_ptr));
+  clients_.Add(std::move(client));
 }
 
 void HidManagerImpl::Connect(
@@ -85,30 +85,26 @@
     mojo::PendingRemote<mojom::HidConnectionClient> connection_client,
     scoped_refptr<HidConnection> connection) {
   if (!connection) {
-    std::move(callback).Run(nullptr);
+    std::move(callback).Run(mojo::NullRemote());
     return;
   }
 
-  mojom::HidConnectionPtr client;
+  mojo::PendingRemote<mojom::HidConnection> client;
   auto connection_impl = std::make_unique<HidConnectionImpl>(
       connection, std::move(connection_client));
-  mojo::MakeStrongBinding(std::move(connection_impl),
-                          mojo::MakeRequest(&client));
+  mojo::MakeSelfOwnedReceiver(std::move(connection_impl),
+                              client.InitWithNewPipeAndPassReceiver());
   std::move(callback).Run(std::move(client));
 }
 
 void HidManagerImpl::OnDeviceAdded(mojom::HidDeviceInfoPtr device) {
-  mojom::HidDeviceInfo* device_info = device.get();
-  clients_.ForAllPtrs([device_info](mojom::HidManagerClient* client) {
-    client->DeviceAdded(device_info->Clone());
-  });
+  for (auto& client : clients_)
+    client->DeviceAdded(device->Clone());
 }
 
 void HidManagerImpl::OnDeviceRemoved(mojom::HidDeviceInfoPtr device) {
-  mojom::HidDeviceInfo* device_info = device.get();
-  clients_.ForAllPtrs([device_info](mojom::HidManagerClient* client) {
-    client->DeviceRemoved(device_info->Clone());
-  });
+  for (auto& client : clients_)
+    client->DeviceRemoved(device->Clone());
 }
 
 }  // namespace device
diff --git a/services/device/hid/hid_manager_impl.h b/services/device/hid/hid_manager_impl.h
index 88ca655..ee960432 100644
--- a/services/device/hid/hid_manager_impl.h
+++ b/services/device/hid/hid_manager_impl.h
@@ -9,9 +9,10 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/hid/hid_device_info.h"
 #include "services/device/hid/hid_service.h"
 #include "services/device/public/mojom/hid.mojom.h"
@@ -43,9 +44,10 @@
       ConnectCallback callback) override;
 
  private:
-  void CreateDeviceList(GetDevicesCallback callback,
-                        mojom::HidManagerClientAssociatedPtrInfo client,
-                        std::vector<mojom::HidDeviceInfoPtr> devices);
+  void CreateDeviceList(
+      GetDevicesCallback callback,
+      mojo::PendingAssociatedRemote<mojom::HidManagerClient> client,
+      std::vector<mojom::HidDeviceInfoPtr> devices);
 
   void CreateConnection(
       ConnectCallback callback,
@@ -58,7 +60,7 @@
 
   std::unique_ptr<HidService> hid_service_;
   mojo::ReceiverSet<mojom::HidManager> receivers_;
-  mojo::AssociatedInterfacePtrSet<mojom::HidManagerClient> clients_;
+  mojo::AssociatedRemoteSet<mojom::HidManagerClient> clients_;
   ScopedObserver<HidService, HidService::Observer> hid_service_observer_;
 
   base::WeakPtrFactory<HidManagerImpl> weak_factory_{this};
diff --git a/services/device/hid/hid_manager_unittest.cc b/services/device/hid/hid_manager_unittest.cc
index dd3e8bf..ab67411 100644
--- a/services/device/hid/hid_manager_unittest.cc
+++ b/services/device/hid/hid_manager_unittest.cc
@@ -8,7 +8,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "build/build_config.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/device_service_test_base.h"
 #include "services/device/hid/hid_manager_impl.h"
@@ -29,10 +31,11 @@
 
 class MockHidManagerClient : public mojom::HidManagerClient {
  public:
-  MockHidManagerClient() : binding_(this) {}
+  MockHidManagerClient() = default;
+  ~MockHidManagerClient() override = default;
 
-  void Bind(mojom::HidManagerClientAssociatedRequest request) {
-    binding_.Bind(std::move(request));
+  void Bind(mojo::PendingAssociatedReceiver<mojom::HidManagerClient> receiver) {
+    receiver_.Bind(std::move(receiver));
   }
 
   void DeviceAdded(mojom::HidDeviceInfoPtr device_info) override {
@@ -45,8 +48,8 @@
     std::move(quit_closure_).Run();
   }
 
-  void SetConnection(mojom::HidConnectionPtr hid_connection) {
-    hid_connection_ = std::move(hid_connection);
+  void SetConnection(mojo::PendingRemote<mojom::HidConnection> hid_connection) {
+    hid_connection_.Bind(std::move(hid_connection));
   }
 
   mojom::HidConnection* GetConnection() { return hid_connection_.get(); }
@@ -58,8 +61,8 @@
   void SetExpectGUID(std::string guid) { expect_guid_ = guid; }
 
  private:
-  mojo::AssociatedBinding<mojom::HidManagerClient> binding_;
-  mojom::HidConnectionPtr hid_connection_;
+  mojo::AssociatedReceiver<mojom::HidManagerClient> receiver_{this};
+  mojo::Remote<mojom::HidConnection> hid_connection_;
   base::OnceClosure quit_closure_;
   std::string expect_guid_;
 
@@ -76,7 +79,7 @@
 
 void OnConnect(base::OnceClosure quit_closure,
                MockHidManagerClient* client,
-               mojom::HidConnectionPtr connection) {
+               mojo::PendingRemote<mojom::HidConnection> connection) {
   DCHECK(client);
   DCHECK(connection);
   client->SetConnection(std::move(connection));
@@ -181,8 +184,8 @@
   mock_hid_service_->FirstEnumerationComplete();
 
   auto client = std::make_unique<MockHidManagerClient>();
-  mojom::HidManagerClientAssociatedPtrInfo hid_manager_client;
-  client->Bind(mojo::MakeRequest(&hid_manager_client));
+  mojo::PendingAssociatedRemote<mojom::HidManagerClient> hid_manager_client;
+  client->Bind(hid_manager_client.InitWithNewEndpointAndPassReceiver());
 
   // Call GetDevicesAndSetClient, expect 1 device will be received in
   // OnGetDevices().
@@ -230,8 +233,8 @@
   mock_hid_service_->FirstEnumerationComplete();
 
   auto client = std::make_unique<MockHidManagerClient>();
-  mojom::HidManagerClientAssociatedPtrInfo hid_manager_client;
-  client->Bind(mojo::MakeRequest(&hid_manager_client));
+  mojo::PendingAssociatedRemote<mojom::HidManagerClient> hid_manager_client;
+  client->Bind(hid_manager_client.InitWithNewEndpointAndPassReceiver());
 
   // Call GetDevicesAndSetClient, expect 1 device will be received in
   // OnGetDevices().
diff --git a/services/device/hid/input_service_linux.cc b/services/device/hid/input_service_linux.cc
index 3704e822..ed6c68e 100644
--- a/services/device/hid/input_service_linux.cc
+++ b/services/device/hid/input_service_linux.cc
@@ -206,16 +206,14 @@
 }
 
 void InputServiceLinux::GetDevicesAndSetClient(
-    mojom::InputDeviceManagerClientAssociatedPtrInfo client,
+    mojo::PendingAssociatedRemote<mojom::InputDeviceManagerClient> client,
     GetDevicesCallback callback) {
   GetDevices(std::move(callback));
 
   if (!client.is_valid())
     return;
 
-  mojom::InputDeviceManagerClientAssociatedPtr client_ptr;
-  client_ptr.Bind(std::move(client));
-  clients_.AddPtr(std::move(client_ptr));
+  clients_.Add(std::move(client));
 }
 
 void InputServiceLinux::GetDevices(GetDevicesCallback callback) {
@@ -229,9 +227,8 @@
 
 void InputServiceLinux::AddDevice(mojom::InputDeviceInfoPtr info) {
   auto* device_info = info.get();
-  clients_.ForAllPtrs([device_info](mojom::InputDeviceManagerClient* client) {
+  for (auto& client : clients_)
     client->InputDeviceAdded(device_info->Clone());
-  });
 
   devices_[info->id] = std::move(info);
 }
@@ -239,9 +236,8 @@
 void InputServiceLinux::RemoveDevice(const std::string& id) {
   devices_.erase(id);
 
-  clients_.ForAllPtrs([id](mojom::InputDeviceManagerClient* client) {
+  for (auto& client : clients_)
     client->InputDeviceRemoved(id);
-  });
 }
 
 bool InputServiceLinux::CalledOnValidThread() const {
diff --git a/services/device/hid/input_service_linux.h b/services/device/hid/input_service_linux.h
index cfffc29d..e81ebdf 100644
--- a/services/device/hid/input_service_linux.h
+++ b/services/device/hid/input_service_linux.h
@@ -13,9 +13,10 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/public/mojom/input_service.mojom.h"
 
 namespace device {
@@ -52,7 +53,7 @@
 
   // mojom::InputDeviceManager implementation:
   void GetDevicesAndSetClient(
-      mojom::InputDeviceManagerClientAssociatedPtrInfo client,
+      mojo::PendingAssociatedRemote<mojom::InputDeviceManagerClient> client,
       GetDevicesCallback callback) override;
   void GetDevices(GetDevicesCallback callback) override;
 
@@ -67,7 +68,7 @@
  private:
   base::ThreadChecker thread_checker_;
   mojo::ReceiverSet<mojom::InputDeviceManager> receivers_;
-  mojo::AssociatedInterfacePtrSet<mojom::InputDeviceManagerClient> clients_;
+  mojo::AssociatedRemoteSet<mojom::InputDeviceManagerClient> clients_;
 
   DISALLOW_COPY_AND_ASSIGN(InputServiceLinux);
 };
diff --git a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
index 31b0bf8..06d3b13 100644
--- a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
+++ b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
@@ -23,7 +23,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
-import org.chromium.device.mojom.NdefCompatibility;
 import org.chromium.device.mojom.NdefMessage;
 import org.chromium.device.mojom.Nfc;
 import org.chromium.device.mojom.NfcClient;
@@ -341,22 +340,6 @@
         }
 
         /**
-         * Check if the NFC device matches the |compatibility| field in |options|.
-         *
-         * @param compatibility denotes the compatibility kind of the found NFC device.
-         * @return boolean true if NFC the compatibility matches.
-         */
-        boolean checkCompatibility(int compatibility) {
-            // 'nfc-forum' option can only push messages to NFC standard devices and 'vendor'
-            // option can only push to vendor specific ones.
-            if (nfcPushOptions.compatibility == NdefCompatibility.ANY
-                    || nfcPushOptions.compatibility == compatibility) {
-                return true;
-            }
-            return false;
-        }
-
-        /**
          * Completes pending push operation.
          *
          * @param error should be null when operation is completed successfully, otherwise,
@@ -519,10 +502,6 @@
             return;
         }
 
-        if (!mPendingPushOperation.checkCompatibility(mTagHandler.compatibility())) {
-            return;
-        }
-
         try {
             mTagHandler.connect();
             mTagHandler.write(NdefMessageUtils.toNdefMessage(mPendingPushOperation.ndefMessage));
@@ -568,7 +547,7 @@
                 Log.w(TAG, "Cannot read data from NFC tag. NdefMessage exceeds allowed size.");
                 return;
             }
-            notifyMatchingWatchers(message, mTagHandler.compatibility());
+            notifyMatchingWatchers(message);
         } catch (TagLostException e) {
             Log.w(TAG, "Cannot read data from NFC tag. Tag is lost.");
         } catch (FormatException | IllegalStateException | IOException e) {
@@ -580,13 +559,13 @@
      * Iterates through active watchers and if any of those match NfcScanOptions criteria,
      * delivers NdefMessage to the client.
      */
-    private void notifyMatchingWatchers(android.nfc.NdefMessage message, int compatibility) {
+    private void notifyMatchingWatchers(android.nfc.NdefMessage message) {
         try {
             NdefMessage ndefMessage = NdefMessageUtils.toNdefMessage(message);
             List<Integer> watchIds = new ArrayList<Integer>();
             for (int i = 0; i < mWatchers.size(); i++) {
                 NfcScanOptions options = mWatchers.valueAt(i);
-                if (matchesWatchOptions(ndefMessage, compatibility, options)) {
+                if (matchesWatchOptions(ndefMessage, options)) {
                     watchIds.add(mWatchers.keyAt(i));
                 }
             }
@@ -606,15 +585,7 @@
     /**
      * Implements matching algorithm.
      */
-    private boolean matchesWatchOptions(
-            NdefMessage message, int compatibility, NfcScanOptions options) {
-        // 'nfc-forum' option can only read messages from NFC standard devices and 'vendor' option
-        // can only read from vendor specific ones.
-        if (options.compatibility != NdefCompatibility.ANY
-                && options.compatibility != compatibility) {
-            return false;
-        }
-
+    private boolean matchesWatchOptions(NdefMessage message, NfcScanOptions options) {
         // Filter by WebNfc watch Id.
         if (!matchesWebNfcId(message.url, options.url)) return false;
 
diff --git a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java
index 9c600b0..0ec1c10 100644
--- a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java
+++ b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java
@@ -12,15 +12,12 @@
 import android.nfc.tech.NdefFormatable;
 import android.nfc.tech.TagTechnology;
 
-import org.chromium.device.mojom.NdefCompatibility;
-
 import java.io.IOException;
 
 /**
  * Utility class that provides I/O operations for NFC tags.
  */
 public class NfcTagHandler {
-    private final int mCompatibility;
     private final TagTechnology mTech;
     private final TagTechnologyHandler mTechHandler;
     private boolean mWasConnected;
@@ -37,19 +34,14 @@
 
         Ndef ndef = Ndef.get(tag);
         if (ndef != null) {
-            int compatibility = NdefCompatibility.VENDOR;
             String type = ndef.getType();
-            if (type.equals(Ndef.NFC_FORUM_TYPE_1) || type.equals(Ndef.NFC_FORUM_TYPE_2)
-                    || type.equals(Ndef.NFC_FORUM_TYPE_3) || type.equals(Ndef.NFC_FORUM_TYPE_4)) {
-                compatibility = NdefCompatibility.NFC_FORUM;
-            }
-            return new NfcTagHandler(compatibility, ndef, new NdefHandler(ndef), tag.getId());
+            return new NfcTagHandler(ndef, new NdefHandler(ndef), tag.getId());
         }
 
         NdefFormatable formattable = NdefFormatable.get(tag);
         if (formattable != null) {
-            return new NfcTagHandler(NdefCompatibility.VENDOR, formattable,
-                    new NdefFormattableHandler(formattable), tag.getId());
+            return new NfcTagHandler(
+                    formattable, new NdefFormattableHandler(formattable), tag.getId());
         }
 
         return null;
@@ -113,9 +105,7 @@
         }
     }
 
-    protected NfcTagHandler(
-            int compatibility, TagTechnology tech, TagTechnologyHandler handler, byte[] id) {
-        mCompatibility = compatibility;
+    protected NfcTagHandler(TagTechnology tech, TagTechnologyHandler handler, byte[] id) {
         mTech = tech;
         mTechHandler = handler;
         mSerialNumber = bytesToSerialNumber(id);
@@ -193,12 +183,4 @@
         }
         return false;
     }
-
-    /**
-     * Returns NdefCompatibility.NFC_FORUM if the tag has a NFC standard type, otherwise returns
-     * NdefCompatibility.VENDOR.
-     */
-    public int compatibility() {
-        return mCompatibility;
-    }
 }
diff --git a/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java b/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
index f8b7c959..81dbd7e 100644
--- a/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
+++ b/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
@@ -18,7 +18,6 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 
 import android.app.Activity;
 import android.content.Context;
@@ -43,7 +42,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.util.Feature;
-import org.chromium.device.mojom.NdefCompatibility;
 import org.chromium.device.mojom.NdefMessage;
 import org.chromium.device.mojom.NdefRecord;
 import org.chromium.device.mojom.NdefRecordTypeFilter;
@@ -459,78 +457,6 @@
     }
 
     /**
-     * Test that compatibility is checked for Nfc.push() with NFC_FORUM device.
-     */
-    @Test
-    @Feature({"NFCTest"})
-    public void testPushCompatibilityMatchingNfcForum() {
-        TestNfcImpl nfc = new TestNfcImpl(mContext, mDelegate);
-        mDelegate.invokeCallback();
-        doReturn(NdefCompatibility.NFC_FORUM).when(mNfcTagHandler).compatibility();
-
-        // Should match, because |compatibility| is set to NdefCompatibility.ANY
-        // in createNfcPushOptions().
-        PushResponse mockCallback_1 = mock(PushResponse.class);
-        nfc.push(createMojoNdefMessage(), createNfcPushOptions(), mockCallback_1);
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-        verify(mockCallback_1).call(mErrorCaptor.capture());
-        assertNull(mErrorCaptor.getValue());
-
-        // Should match.
-        PushResponse mockCallback_2 = mock(PushResponse.class);
-        NfcPushOptions options_2 = createNfcPushOptions();
-        options_2.compatibility = NdefCompatibility.NFC_FORUM;
-        nfc.push(createMojoNdefMessage(), options_2, mockCallback_2);
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-        verify(mockCallback_2).call(mErrorCaptor.capture());
-        assertNull(mErrorCaptor.getValue());
-
-        // Should not match.
-        PushResponse mockCallback_3 = mock(PushResponse.class);
-        NfcPushOptions options_3 = createNfcPushOptions();
-        options_3.compatibility = NdefCompatibility.VENDOR;
-        nfc.push(createMojoNdefMessage(), options_3, mockCallback_3);
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-        verifyZeroInteractions(mockCallback_3);
-    }
-
-    /**
-     * Test that compatibility is checked for Nfc.push() with VENDOR device.
-     */
-    @Test
-    @Feature({"NFCTest"})
-    public void testPushCompatibilityMatchingVendor() {
-        TestNfcImpl nfc = new TestNfcImpl(mContext, mDelegate);
-        mDelegate.invokeCallback();
-        doReturn(NdefCompatibility.VENDOR).when(mNfcTagHandler).compatibility();
-
-        // Should match, because |compatibility| is set to NdefCompatibility.ANY
-        // in createNfcPushOptions().
-        PushResponse mockCallback_1 = mock(PushResponse.class);
-        nfc.push(createMojoNdefMessage(), createNfcPushOptions(), mockCallback_1);
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-        verify(mockCallback_1).call(mErrorCaptor.capture());
-        assertNull(mErrorCaptor.getValue());
-
-        // Should match for NdefCompatibility.VENDOR.
-        PushResponse mockCallback_2 = mock(PushResponse.class);
-        NfcPushOptions options_2 = createNfcPushOptions();
-        options_2.compatibility = NdefCompatibility.VENDOR;
-        nfc.push(createMojoNdefMessage(), options_2, mockCallback_2);
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-        verify(mockCallback_2).call(mErrorCaptor.capture());
-        assertNull(mErrorCaptor.getValue());
-
-        // Should not match.
-        PushResponse mockCallback_3 = mock(PushResponse.class);
-        NfcPushOptions options_3 = createNfcPushOptions();
-        options_3.compatibility = NdefCompatibility.NFC_FORUM;
-        nfc.push(createMojoNdefMessage(), options_3, mockCallback_3);
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-        verifyZeroInteractions(mockCallback_3);
-    }
-
-    /**
      * Test that Nfc.watch() works correctly and client is notified.
      */
     @Test
@@ -576,7 +502,6 @@
 
         // Should match by WebNFC Id (exact match).
         NfcScanOptions options1 = createNfcScanOptions();
-        options1.compatibility = NdefCompatibility.NFC_FORUM;
         options1.url = TEST_URL;
         int watchId1 = mNextWatchId++;
         WatchResponse mockWatchCallback1 = mock(WatchResponse.class);
@@ -586,7 +511,6 @@
 
         // Should match by media type.
         NfcScanOptions options2 = createNfcScanOptions();
-        options2.compatibility = NdefCompatibility.ANY;
         options2.mediaType = TEXT_MIME;
         int watchId2 = mNextWatchId++;
         WatchResponse mockWatchCallback2 = mock(WatchResponse.class);
@@ -596,7 +520,6 @@
 
         // Should match by record type.
         NfcScanOptions options3 = createNfcScanOptions();
-        options3.compatibility = NdefCompatibility.ANY;
         NdefRecordTypeFilter typeFilter = new NdefRecordTypeFilter();
         typeFilter.recordType = NdefMessageUtils.RECORD_TYPE_URL;
         options3.recordFilter = typeFilter;
@@ -608,7 +531,6 @@
 
         // Should not match
         NfcScanOptions options4 = createNfcScanOptions();
-        options4.compatibility = NdefCompatibility.NFC_FORUM;
         options4.url = AUTHOR_RECORD_DOMAIN;
         int watchId4 = mNextWatchId++;
         WatchResponse mockWatchCallback4 = mock(WatchResponse.class);
@@ -997,126 +919,6 @@
     }
 
     /**
-     * Test that 'nfc-forum' tag messages can only be read by Nfc.watch() with 'nfc-forum' or 'any'
-     * option.
-     */
-    @Test
-    @Feature({"NFCTest"})
-    public void testWatchCompatibilityMatchingNfcForumTag() {
-        TestNfcImpl nfc = new TestNfcImpl(mContext, mDelegate);
-        mDelegate.invokeCallback();
-        nfc.setClient(mNfcClient);
-
-        // Should match.
-        int watchId1 = mNextWatchId++;
-        {
-            NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
-            options.url = TEST_URL;
-            WatchResponse mockWatchCallback = mock(WatchResponse.class);
-            nfc.watch(options, watchId1, mockWatchCallback);
-            verify(mockWatchCallback).call(mErrorCaptor.capture());
-            assertNull(mErrorCaptor.getValue());
-        }
-
-        // Should not match.
-        int watchId2 = mNextWatchId++;
-        {
-            NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.VENDOR;
-            options.url = TEST_URL;
-            WatchResponse mockWatchCallback = mock(WatchResponse.class);
-            nfc.watch(options, watchId2, mockWatchCallback);
-            verify(mockWatchCallback).call(mErrorCaptor.capture());
-            assertNull(mErrorCaptor.getValue());
-        }
-
-        // Should match.
-        int watchId3 = mNextWatchId++;
-        {
-            NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.ANY;
-            options.url = TEST_URL;
-            WatchResponse mockWatchCallback = mock(WatchResponse.class);
-            nfc.watch(options, watchId3, mockWatchCallback);
-            verify(mockWatchCallback).call(mErrorCaptor.capture());
-            assertNull(mErrorCaptor.getValue());
-        }
-
-        doReturn(NdefCompatibility.NFC_FORUM).when(mNfcTagHandler).compatibility();
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-
-        // Check that client was notified and watch with 'nfc-forum' or 'any' compatibility was
-        // triggered.
-        verify(mNfcClient, times(1))
-                .onWatch(mOnWatchCallbackCaptor.capture(), nullable(String.class),
-                        any(NdefMessage.class));
-        assertEquals(2, mOnWatchCallbackCaptor.getValue().length);
-        assertEquals(watchId1, mOnWatchCallbackCaptor.getValue()[0]);
-        assertEquals(watchId3, mOnWatchCallbackCaptor.getValue()[1]);
-    }
-
-    /**
-     * Test that 'vendor' tag messages can only be read by Nfc.watch() with 'vendor' or 'any'
-     * option.
-     */
-    @Test
-    @Feature({"NFCTest"})
-    public void testWatchCompatibilityMatchingVendorTag() {
-        TestNfcImpl nfc = new TestNfcImpl(mContext, mDelegate);
-        mDelegate.invokeCallback();
-        nfc.setClient(mNfcClient);
-
-        // Should not match.
-        int watchId1 = mNextWatchId++;
-        {
-            NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
-            options.url = TEST_URL;
-            WatchResponse mockWatchCallback = mock(WatchResponse.class);
-            nfc.watch(options, watchId1, mockWatchCallback);
-            verify(mockWatchCallback).call(mErrorCaptor.capture());
-            assertNull(mErrorCaptor.getValue());
-        }
-
-        // Should match.
-        int watchId2 = mNextWatchId++;
-        {
-            NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.VENDOR;
-            options.url = TEST_URL;
-            WatchResponse mockWatchCallback = mock(WatchResponse.class);
-            nfc.watch(options, watchId2, mockWatchCallback);
-            verify(mockWatchCallback).call(mErrorCaptor.capture());
-            assertNull(mErrorCaptor.getValue());
-        }
-
-        // Should match.
-        int watchId3 = mNextWatchId++;
-        {
-            NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.ANY;
-            options.url = TEST_URL;
-            WatchResponse mockWatchCallback = mock(WatchResponse.class);
-            nfc.watch(options, watchId3, mockWatchCallback);
-            verify(mockWatchCallback).call(mErrorCaptor.capture());
-            assertNull(mErrorCaptor.getValue());
-        }
-
-        doReturn(NdefCompatibility.VENDOR).when(mNfcTagHandler).compatibility();
-        nfc.processPendingOperationsForTesting(mNfcTagHandler);
-
-        // Check that client was notified and watch with 'vendor' or 'any' compatibility was
-        // triggered.
-        verify(mNfcClient, times(1))
-                .onWatch(mOnWatchCallbackCaptor.capture(), nullable(String.class),
-                        any(NdefMessage.class));
-        assertEquals(2, mOnWatchCallbackCaptor.getValue().length);
-        assertEquals(watchId2, mOnWatchCallbackCaptor.getValue()[0]);
-        assertEquals(watchId3, mOnWatchCallbackCaptor.getValue()[1]);
-    }
-
-    /**
      * Test that Nfc.watch() WebNFC Id pattern matching works correctly.
      */
     @Test
@@ -1130,7 +932,6 @@
         int watchId1 = mNextWatchId++;
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "https://test.com/*";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, watchId1, mockWatchCallback);
@@ -1142,7 +943,6 @@
         int watchId2 = mNextWatchId++;
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "https://test.com/contact/42";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, watchId2, mockWatchCallback);
@@ -1154,7 +954,6 @@
         int watchId3 = mNextWatchId++;
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "https://subdomain.test.com/*";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, watchId3, mockWatchCallback);
@@ -1166,7 +965,6 @@
         int watchId4 = mNextWatchId++;
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "https://subdomain.test.com/contact";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, watchId4, mockWatchCallback);
@@ -1177,7 +975,6 @@
         // Should not match.
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "https://www.test.com/*";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, mNextWatchId++, mockWatchCallback);
@@ -1188,7 +985,6 @@
         // Should not match.
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "http://test.com/*";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, mNextWatchId++, mockWatchCallback);
@@ -1199,7 +995,6 @@
         // Should not match.
         {
             NfcScanOptions options = createNfcScanOptions();
-            options.compatibility = NdefCompatibility.NFC_FORUM;
             options.url = "invalid pattern url";
             WatchResponse mockWatchCallback = mock(WatchResponse.class);
             nfc.watch(options, mNextWatchId++, mockWatchCallback);
@@ -1239,7 +1034,6 @@
 
         // Should not match when invalid WebNFC Id is received.
         NfcScanOptions options = createNfcScanOptions();
-        options.compatibility = NdefCompatibility.NFC_FORUM;
         options.url = "https://test.com/*";
         WatchResponse mockWatchCallback = mock(WatchResponse.class);
         nfc.watch(options, mNextWatchId, mockWatchCallback);
@@ -1300,7 +1094,6 @@
         pushOptions.target = NfcPushTarget.ANY;
         pushOptions.timeout = timeout;
         pushOptions.ignoreRead = false;
-        pushOptions.compatibility = NdefCompatibility.ANY;
         return pushOptions;
     }
 
@@ -1308,7 +1101,6 @@
         NfcScanOptions options = new NfcScanOptions();
         options.url = "";
         options.mediaType = "";
-        options.compatibility = NdefCompatibility.ANY;
         options.recordFilter = null;
         return options;
     }
diff --git a/services/device/public/cpp/hid/fake_hid_manager.cc b/services/device/public/cpp/hid/fake_hid_manager.cc
index b765d3a3..39789373 100644
--- a/services/device/public/cpp/hid/fake_hid_manager.cc
+++ b/services/device/public/cpp/hid/fake_hid_manager.cc
@@ -8,7 +8,8 @@
 #include <utility>
 
 #include "base/guid.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 
 namespace device {
 
@@ -104,9 +105,7 @@
     GetDevicesCallback callback) {
   GetDevices(std::move(callback));
 
-  mojom::HidManagerClientAssociatedPtr client_ptr;
-  client_ptr.Bind(std::move(client));
-  clients_.AddPtr(std::move(client_ptr));
+  clients_.Add(std::move(client));
 }
 
 void FakeHidManager::GetDevices(GetDevicesCallback callback) {
@@ -122,14 +121,14 @@
     mojo::PendingRemote<mojom::HidConnectionClient> connection_client,
     ConnectCallback callback) {
   if (!base::Contains(devices_, device_guid)) {
-    std::move(callback).Run(nullptr);
+    std::move(callback).Run(mojo::NullRemote());
     return;
   }
 
-  mojom::HidConnectionPtr connection;
-  mojo::MakeStrongBinding(
+  mojo::PendingRemote<mojom::HidConnection> connection;
+  mojo::MakeSelfOwnedReceiver(
       std::make_unique<FakeHidConnection>(devices_[device_guid]->Clone()),
-      mojo::MakeRequest(&connection));
+      connection.InitWithNewPipeAndPassReceiver());
   std::move(callback).Run(std::move(connection));
 }
 
@@ -184,17 +183,15 @@
   devices_[guid] = std::move(device);
 
   mojom::HidDeviceInfo* device_info = devices_[guid].get();
-  clients_.ForAllPtrs([device_info](mojom::HidManagerClient* client) {
+  for (auto& client : clients_)
     client->DeviceAdded(device_info->Clone());
-  });
 }
 
 void FakeHidManager::RemoveDevice(const std::string& guid) {
   if (base::Contains(devices_, guid)) {
     mojom::HidDeviceInfo* device_info = devices_[guid].get();
-    clients_.ForAllPtrs([device_info](mojom::HidManagerClient* client) {
+    for (auto& client : clients_)
       client->DeviceRemoved(device_info->Clone());
-    });
     devices_.erase(guid);
   }
 }
diff --git a/services/device/public/cpp/hid/fake_hid_manager.h b/services/device/public/cpp/hid/fake_hid_manager.h
index 5a296c0..eed13d9b 100644
--- a/services/device/public/cpp/hid/fake_hid_manager.h
+++ b/services/device/public/cpp/hid/fake_hid_manager.h
@@ -9,9 +9,9 @@
 #include <string>
 #include <vector>
 
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/public/mojom/hid.mojom.h"
 
 namespace device {
@@ -71,7 +71,7 @@
 
  private:
   std::map<std::string, mojom::HidDeviceInfoPtr> devices_;
-  mojo::AssociatedInterfacePtrSet<mojom::HidManagerClient> clients_;
+  mojo::AssociatedRemoteSet<mojom::HidManagerClient> clients_;
   mojo::ReceiverSet<mojom::HidManager> receivers_;
 };
 
diff --git a/services/device/public/cpp/hid/fake_input_service_linux.cc b/services/device/public/cpp/hid/fake_input_service_linux.cc
index a387eb2..0189398 100644
--- a/services/device/public/cpp/hid/fake_input_service_linux.cc
+++ b/services/device/public/cpp/hid/fake_input_service_linux.cc
@@ -12,16 +12,14 @@
 
 // mojom::InputDeviceManager implementation:
 void FakeInputServiceLinux::GetDevicesAndSetClient(
-    mojom::InputDeviceManagerClientAssociatedPtrInfo client,
+    mojo::PendingAssociatedRemote<mojom::InputDeviceManagerClient> client,
     GetDevicesCallback callback) {
   GetDevices(std::move(callback));
 
   if (!client.is_valid())
     return;
 
-  mojom::InputDeviceManagerClientAssociatedPtr client_ptr;
-  client_ptr.Bind(std::move(client));
-  clients_.AddPtr(std::move(client_ptr));
+  clients_.Add(std::move(client));
 }
 
 void FakeInputServiceLinux::GetDevices(GetDevicesCallback callback) {
@@ -39,9 +37,8 @@
 
 void FakeInputServiceLinux::AddDevice(mojom::InputDeviceInfoPtr info) {
   auto* device_info = info.get();
-  clients_.ForAllPtrs([device_info](mojom::InputDeviceManagerClient* client) {
+  for (auto& client : clients_)
     client->InputDeviceAdded(device_info->Clone());
-  });
 
   devices_[info->id] = std::move(info);
 }
@@ -49,9 +46,8 @@
 void FakeInputServiceLinux::RemoveDevice(const std::string& id) {
   devices_.erase(id);
 
-  clients_.ForAllPtrs([id](mojom::InputDeviceManagerClient* client) {
+  for (auto& client : clients_)
     client->InputDeviceRemoved(id);
-  });
 }
 
 }  // namespace device
diff --git a/services/device/public/cpp/hid/fake_input_service_linux.h b/services/device/public/cpp/hid/fake_input_service_linux.h
index 71f200b6..169fbac 100644
--- a/services/device/public/cpp/hid/fake_input_service_linux.h
+++ b/services/device/public/cpp/hid/fake_input_service_linux.h
@@ -8,9 +8,10 @@
 #include <map>
 #include <string>
 
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/public/mojom/input_service.mojom.h"
 
 namespace device {
@@ -24,7 +25,7 @@
 
   // mojom::InputDeviceManager implementation:
   void GetDevicesAndSetClient(
-      mojom::InputDeviceManagerClientAssociatedPtrInfo client,
+      mojo::PendingAssociatedRemote<mojom::InputDeviceManagerClient> client,
       GetDevicesCallback callback) override;
   void GetDevices(GetDevicesCallback callback) override;
 
@@ -36,7 +37,7 @@
 
  private:
   mojo::ReceiverSet<mojom::InputDeviceManager> receivers_;
-  mojo::AssociatedInterfacePtrSet<mojom::InputDeviceManagerClient> clients_;
+  mojo::AssociatedRemoteSet<mojom::InputDeviceManagerClient> clients_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeInputServiceLinux);
 };
diff --git a/services/device/public/mojom/hid.mojom b/services/device/public/mojom/hid.mojom
index 1f26a0d..b7041ce0 100644
--- a/services/device/public/mojom/hid.mojom
+++ b/services/device/public/mojom/hid.mojom
@@ -314,6 +314,9 @@
   // Enumerates available devices and set as a client of HidManager.
   // The implementation of HidManager guarantees that the returned callback
   // will always be posted earlier than DeviceAdded() and DeviceRemoved().
+  // TODO(crbug.com/955171): Use |pending_associated_remote| instead of
+  // |associated| after supporting mojom_js_generator.py completely for
+  // associated interfaces.
   GetDevicesAndSetClient(associated HidManagerClient client) =>
                        (array<HidDeviceInfo> devices);
 
@@ -325,7 +328,7 @@
   // notified when input reports are received.
   Connect(string device_guid,
           pending_remote<HidConnectionClient>? connection_client)
-      => (HidConnection? connection);
+      => (pending_remote<HidConnection>? connection);
 };
 
 // Provides an interface for communication with a HID device. The HID spec
diff --git a/services/device/public/mojom/input_service.mojom b/services/device/public/mojom/input_service.mojom
index 727a3f1..a7ceeb3e 100644
--- a/services/device/public/mojom/input_service.mojom
+++ b/services/device/public/mojom/input_service.mojom
@@ -50,8 +50,9 @@
   // to InputDeviceManager. The implementation of InputDeviceManager guarantees
   // the returned callback is always posted earlier than InputDeviceAdded()
   // and InputDeviceRemoved().
-  GetDevicesAndSetClient(associated InputDeviceManagerClient client) =>
-                        (array<InputDeviceInfo> devices);
+  GetDevicesAndSetClient(
+      pending_associated_remote<InputDeviceManagerClient> client) =>
+          (array<InputDeviceInfo> devices);
 
   // Returns list of all currently connected input/hid devices only.
   GetDevices() => (array<InputDeviceInfo> devices);
diff --git a/services/device/public/mojom/nfc.mojom b/services/device/public/mojom/nfc.mojom
index 86cee04..a856866 100644
--- a/services/device/public/mojom/nfc.mojom
+++ b/services/device/public/mojom/nfc.mojom
@@ -30,16 +30,6 @@
   ANY
 };
 
-enum NDEFCompatibility {
-  // Allows all active and passive NFC devices, supported by the NFC standard.
-  NFC_FORUM,
-  // Allows vendor specific NFC tags (passive device) that require specific
-  // reader chips.
-  VENDOR,
-  // Allows all NDEF compatible devices that the reader chip can read.
-  ANY
-};
-
 struct NFCError {
   NFCErrorType error_type;
 };
@@ -78,9 +68,6 @@
   // If the property is true, the push operation will suspend active watchers
   // until its completion.
   bool ignore_read;
-
-  // Defines the accepted kinds of NFC devices.
-  NDEFCompatibility compatibility;
 };
 
 struct NDEFRecordTypeFilter {
@@ -96,9 +83,6 @@
 
   // Defines media type filtering constraint.
   string? media_type;
-
-  // Defines the accepted kinds of NFC devices.
-  NDEFCompatibility compatibility;
 };
 
 interface NFC {
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
index 34ef71dc..b456e4d 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -361,6 +361,11 @@
     return;
   }
 
+  // Increment the session id to make sure that once tracing starts the events
+  // are added to a new trace writer that comes from perfetto producer, instead
+  // of holding on to the startup registry's writers.
+  session_id_.fetch_add(1u, std::memory_order_relaxed);
+
   // Clear the pending task on the tracing service thread.
   DCHECK_CALLED_ON_VALID_SEQUENCE(perfetto_sequence_checker_);
   base::OnceClosure task;
diff --git a/third_party/blink/public/mojom/hid/hid.mojom b/third_party/blink/public/mojom/hid/hid.mojom
index fe4d38d..7c3f49b8 100644
--- a/third_party/blink/public/mojom/hid/hid.mojom
+++ b/third_party/blink/public/mojom/hid/hid.mojom
@@ -83,8 +83,8 @@
 
   // Opens a connection to the device with GUID matching |device_guid|. |client|
   // will be notified when an input report is received from the device.
-  // |connection| contains the opened connection, or nullptr if the device could
-  // not be opened.
+  // |connection| contains the opened connection, or a null remote if the
+  // device could not be opened.
   Connect(string device_guid, pending_remote<device.mojom.HidConnectionClient> client)
-      => (device.mojom.HidConnection? connection);
+      => (pending_remote<device.mojom.HidConnection>? connection);
 };
diff --git a/third_party/blink/public/mojom/speech/speech_recognizer.mojom b/third_party/blink/public/mojom/speech/speech_recognizer.mojom
index 0144c942..17b3e283 100644
--- a/third_party/blink/public/mojom/speech/speech_recognizer.mojom
+++ b/third_party/blink/public/mojom/speech/speech_recognizer.mojom
@@ -18,7 +18,7 @@
 
   // Used by the browser to communicate with a SpeechRecognitionSessionClient
   // implementation created for the new session.
-  SpeechRecognitionSessionClient client;
+  pending_remote<SpeechRecognitionSessionClient> client;
 
   // Language to use for speech recognition.
   string language;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_source_code.cc b/third_party/blink/renderer/bindings/core/v8/script_source_code.cc
index 2993ffb..afd83f8 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_source_code.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_source_code.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_source_code.h"
 
 #include "third_party/blink/renderer/core/loader/resource/script_resource.h"
+#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
index 4aca5e2..b6555d1 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -44,6 +44,7 @@
 #include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
+#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
 #include "third_party/blink/renderer/platform/scheduler/public/event_loop.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
diff --git a/third_party/blink/renderer/core/html/resources/controls_refresh.css b/third_party/blink/renderer/core/html/resources/controls_refresh.css
index 8e5ce9e..5c4fe40 100644
--- a/third_party/blink/renderer/core/html/resources/controls_refresh.css
+++ b/third_party/blink/renderer/core/html/resources/controls_refresh.css
@@ -13,21 +13,14 @@
 select:-internal-list-box,
 textarea {
   background-color: #ffffff;
-  border-color: #cecece;
-}
-
-input:hover,
-select:hover,
-select:-internal-list-box:hover,
-textarea:hover {
-  border-color: #9d9d9d;
+  border-color: #767676;
 }
 
 input:disabled,
 select:disabled,
 textarea:disabled {
-  background-color: #ffffff;
-  border-color: #c5c5c5;
+  background-color: rgba(239, 239, 239, 0.3);
+  border-color: rgba(118, 118, 118, 0.3);
 }
 
 input[type="button" i],
@@ -37,7 +30,7 @@
 input[type="file" i]::-webkit-file-upload-button,
 button {
   background-color: #efefef;
-  border-color: #cecece;
+  border-color: #767676;
 }
 
 input[type="button" i]:disabled,
@@ -46,7 +39,9 @@
 input[type="color" i]:disabled,
 input[type="file" i]:disabled::-webkit-file-upload-button,
 button:disabled {
-  border-color: #c5c5c5;
+  background-color: rgba(239, 239, 239, 0.3);
+  border-color: rgba(118, 118, 118, 0.3);
+  color: rgba(16, 16, 16, 0.3);
 }
 
 input[type="password" i]::-internal-reveal {
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.cc b/third_party/blink/renderer/core/inspector/devtools_session.cc
index 3f07633..cdc7c1cd 100644
--- a/third_party/blink/renderer/core/inspector/devtools_session.cc
+++ b/third_party/blink/renderer/core/inspector/devtools_session.cc
@@ -218,6 +218,7 @@
   agent_->sessions_.erase(this);
   binding_.Close();
   host_ptr_.reset();
+  CHECK(io_session_);
   io_session_->DeleteSoon();
   io_session_ = nullptr;
   agent_->probe_sink_->RemoveDevToolsSession(this);
diff --git a/third_party/blink/renderer/core/loader/resource/script_resource.h b/third_party/blink/renderer/core/loader/resource/script_resource.h
index c6c9e72..3025db0 100644
--- a/third_party/blink/renderer/core/loader/resource/script_resource.h
+++ b/third_party/blink/renderer/core/loader/resource/script_resource.h
@@ -43,6 +43,7 @@
 class KURL;
 class ResourceFetcher;
 class ResponseBodyLoaderClient;
+class SingleCachedMetadataHandler;
 
 // ScriptResource is a resource representing a JavaScript script. It is only
 // used for "classic" scripts, i.e. not modules.
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test.cc b/third_party/blink/renderer/core/workers/worker_thread_test.cc
index 238ba858..e5cab26c 100644
--- a/third_party/blink/renderer/core/workers/worker_thread_test.cc
+++ b/third_party/blink/renderer/core/workers/worker_thread_test.cc
@@ -297,15 +297,7 @@
 }
 
 // Disabled due to flakiness: https://crbug.com/1003217.
-#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \
-    defined(THREAD_SANITIZER) || defined(OS_WIN) || defined(OS_ANDROID)
-#define MAYBE_SyncTerminate_ImmediatelyAfterStart \
-  DISABLED_SyncTerminate_ImmediatelyAfterStart
-#else
-#define MAYBE_SyncTerminate_ImmediatelyAfterStart \
-  SyncTerminate_ImmediatelyAfterStart
-#endif
-TEST_F(WorkerThreadTest, MAYBE_SyncTerminate_ImmediatelyAfterStart) {
+TEST_F(WorkerThreadTest, DISABLED_SyncTerminate_ImmediatelyAfterStart) {
   ExpectReportingCallsForWorkerPossiblyTerminatedBeforeInitialization();
   Start();
 
diff --git a/third_party/blink/renderer/modules/hid/hid_device.cc b/third_party/blink/renderer/modules/hid/hid_device.cc
index 6dd11d79..d06e235 100644
--- a/third_party/blink/renderer/modules/hid/hid_device.cc
+++ b/third_party/blink/renderer/modules/hid/hid_device.cc
@@ -270,14 +270,15 @@
   return true;
 }
 
-void HIDDevice::FinishOpen(ScriptPromiseResolver* resolver,
-                           device::mojom::blink::HidConnectionPtr connection) {
+void HIDDevice::FinishOpen(
+    ScriptPromiseResolver* resolver,
+    mojo::PendingRemote<device::mojom::blink::HidConnection> connection) {
   MarkRequestComplete(resolver);
   device_state_change_in_progress_ = false;
 
   if (connection) {
-    connection_ = std::move(connection);
-    connection_.set_connection_error_handler(WTF::Bind(
+    connection_.Bind(std::move(connection));
+    connection_.set_disconnect_handler(WTF::Bind(
         &HIDDevice::OnServiceConnectionError, WrapWeakPersistent(this)));
     resolver->Resolve();
   } else {
diff --git a/third_party/blink/renderer/modules/hid/hid_device.h b/third_party/blink/renderer/modules/hid/hid_device.h
index b0aa9ad..f419c3c 100644
--- a/third_party/blink/renderer/modules/hid/hid_device.h
+++ b/third_party/blink/renderer/modules/hid/hid_device.h
@@ -5,7 +5,9 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_DEVICE_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_DEVICE_H_
 
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/hid.mojom-blink.h"
 #include "third_party/blink/public/mojom/hid/hid.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
@@ -79,7 +81,7 @@
   void OnServiceConnectionError();
 
   void FinishOpen(ScriptPromiseResolver*,
-                  device::mojom::blink::HidConnectionPtr);
+                  mojo::PendingRemote<device::mojom::blink::HidConnection>);
   void FinishClose(ScriptPromiseResolver*);
   void FinishSendReport(ScriptPromiseResolver*, bool success);
   void FinishReceiveReport(ScriptPromiseResolver*,
@@ -95,7 +97,7 @@
 
   Member<HID> parent_;
   device::mojom::blink::HidDeviceInfoPtr device_info_;
-  device::mojom::blink::HidConnectionPtr connection_;
+  mojo::Remote<device::mojom::blink::HidConnection> connection_;
   mojo::Receiver<device::mojom::blink::HidConnectionClient> receiver_{this};
   HeapHashSet<Member<ScriptPromiseResolver>> device_requests_;
   HeapVector<Member<HIDCollectionInfo>> collections_;
diff --git a/third_party/blink/renderer/modules/nfc/nfc_push_options.idl b/third_party/blink/renderer/modules/nfc/nfc_push_options.idl
index 39da64f..2156206 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_push_options.idl
+++ b/third_party/blink/renderer/modules/nfc/nfc_push_options.idl
@@ -11,5 +11,4 @@
     unrestricted double timeout; // in ms
     boolean ignoreRead = true;
     AbortSignal? signal;
-    NDEFCompatibility compatibility = "nfc-forum";
 };
diff --git a/third_party/blink/renderer/modules/nfc/nfc_scan_options.idl b/third_party/blink/renderer/modules/nfc/nfc_scan_options.idl
index 7111365..af62a8eb 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_scan_options.idl
+++ b/third_party/blink/renderer/modules/nfc/nfc_scan_options.idl
@@ -2,15 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
-// http://w3c.github.io/web-nfc/#dom-ndefcompatibility
-enum NDEFCompatibility { "nfc-forum", "vendor", "any" };
-
 // https://w3c.github.io/web-nfc/#the-nfcscanoptions-dictionary
 dictionary NFCScanOptions {
     AbortSignal? signal;
     USVString url = "";
     NDEFRecordType? recordType;
     USVString mediaType = "";
-    NDEFCompatibility compatibility = "nfc-forum";
 };
diff --git a/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc b/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc
index dd0b17b3..a11da094 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc
@@ -52,13 +52,10 @@
     const blink::NFCPushOptions* pushOptions) {
   // https://w3c.github.io/web-nfc/#the-nfcpushoptions-dictionary
   // Default values for NFCPushOptions dictionary are:
-  // target = 'any', timeout = Infinity, ignoreRead = true,
-  // compatibility = "nfc-forum"
+  // target = 'any', timeout = Infinity, ignoreRead = true
   NFCPushOptionsPtr pushOptionsPtr = NFCPushOptions::New();
   pushOptionsPtr->target = blink::StringToNFCPushTarget(pushOptions->target());
   pushOptionsPtr->ignore_read = pushOptions->ignoreRead();
-  pushOptionsPtr->compatibility =
-      blink::StringToNDEFCompatibility(pushOptions->compatibility());
 
   if (pushOptions->hasTimeout())
     pushOptionsPtr->timeout = pushOptions->timeout();
@@ -73,12 +70,10 @@
     const blink::NFCScanOptions* scanOptions) {
   // https://w3c.github.io/web-nfc/#dom-nfcscanoptions
   // Default values for NFCScanOptions dictionary are:
-  // url = "", recordType = null, mediaType = "", compatibility = "nfc-forum"
+  // url = "", recordType = null, mediaType = ""
   NFCScanOptionsPtr scanOptionsPtr = NFCScanOptions::New();
   scanOptionsPtr->url = scanOptions->url();
   scanOptionsPtr->media_type = scanOptions->mediaType();
-  scanOptionsPtr->compatibility =
-      blink::StringToNDEFCompatibility(scanOptions->compatibility());
 
   if (scanOptions->hasRecordType()) {
     scanOptionsPtr->record_filter = NDEFRecordTypeFilter::New();
diff --git a/third_party/blink/renderer/modules/nfc/nfc_utils.cc b/third_party/blink/renderer/modules/nfc/nfc_utils.cc
index 8a5c809..32477ef 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_utils.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_utils.cc
@@ -13,7 +13,6 @@
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 
-using device::mojom::blink::NDEFCompatibility;
 using device::mojom::blink::NFCPushTarget;
 
 namespace blink {
@@ -39,20 +38,6 @@
   return origin_url.IsValid();
 }
 
-NDEFCompatibility StringToNDEFCompatibility(const String& compatibility) {
-  if (compatibility == "nfc-forum")
-    return NDEFCompatibility::NFC_FORUM;
-
-  if (compatibility == "vendor")
-    return NDEFCompatibility::VENDOR;
-
-  if (compatibility == "any")
-    return NDEFCompatibility::ANY;
-
-  NOTREACHED();
-  return NDEFCompatibility::NFC_FORUM;
-}
-
 NFCPushTarget StringToNFCPushTarget(const String& target) {
   if (target == "tag")
     return NFCPushTarget::TAG;
diff --git a/third_party/blink/renderer/modules/nfc/nfc_utils.h b/third_party/blink/renderer/modules/nfc/nfc_utils.h
index 76c0ed4..5c1954e 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_utils.h
+++ b/third_party/blink/renderer/modules/nfc/nfc_utils.h
@@ -20,9 +20,6 @@
 bool SetNDEFMessageURL(const String& origin,
                        device::mojom::blink::NDEFMessage* message);
 
-device::mojom::blink::NDEFCompatibility StringToNDEFCompatibility(
-    const WTF::String& compatibility);
-
 device::mojom::blink::NFCPushTarget StringToNFCPushTarget(
     const WTF::String& target);
 
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition.cc b/third_party/blink/renderer/modules/speech/speech_recognition.cc
index 9b6db1d..50cbe1f 100644
--- a/third_party/blink/renderer/modules/speech/speech_recognition.cc
+++ b/third_party/blink/renderer/modules/speech/speech_recognition.cc
@@ -27,6 +27,7 @@
 
 #include <algorithm>
 #include "build/build_config.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/speech/speech_recognition_controller.h"
@@ -56,8 +57,9 @@
   // See https://bit.ly/2S0zRAS for task types.
   scoped_refptr<base::SingleThreadTaskRunner> task_runner =
       GetExecutionContext()->GetTaskRunner(blink::TaskType::kMiscPlatformAPI);
-  mojom::blink::SpeechRecognitionSessionClientPtrInfo session_client;
-  binding_.Bind(mojo::MakeRequest(&session_client),
+  mojo::PendingRemote<mojom::blink::SpeechRecognitionSessionClient>
+      session_client;
+  binding_.Bind(session_client.InitWithNewPipeAndPassReceiver(),
                 GetExecutionContext()->GetInterfaceInvalidator(), task_runner);
   binding_.set_connection_error_handler(WTF::Bind(
       &SpeechRecognition::OnConnectionError, WrapWeakPersistent(this)));
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc b/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc
index bdeacd0..f1725ae 100644
--- a/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc
+++ b/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc
@@ -51,7 +51,8 @@
 
 void SpeechRecognitionController::Start(
     mojom::blink::SpeechRecognitionSessionRequest session_request,
-    mojom::blink::SpeechRecognitionSessionClientPtrInfo session_client,
+    mojo::PendingRemote<mojom::blink::SpeechRecognitionSessionClient>
+        session_client,
     const SpeechGrammarList& grammars,
     const String& lang,
     bool continuous,
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition_controller.h b/third_party/blink/renderer/modules/speech/speech_recognition_controller.h
index 0e8cd80..b02b55c0 100644
--- a/third_party/blink/renderer/modules/speech/speech_recognition_controller.h
+++ b/third_party/blink/renderer/modules/speech/speech_recognition_controller.h
@@ -28,6 +28,7 @@
 
 #include <memory>
 
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/speech/speech_recognizer.mojom-blink.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -49,7 +50,8 @@
   virtual ~SpeechRecognitionController();
 
   void Start(mojom::blink::SpeechRecognitionSessionRequest session_request,
-             mojom::blink::SpeechRecognitionSessionClientPtrInfo session_client,
+             mojo::PendingRemote<mojom::blink::SpeechRecognitionSessionClient>
+                 session_client,
              const SpeechGrammarList& grammars,
              const String& lang,
              bool continuous,
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc
index e54bc0b..f3e17ab 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.cc
+++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -151,7 +151,8 @@
 
 XRSession::XRSession(
     XR* xr,
-    device::mojom::blink::XRSessionClientRequest client_request,
+    mojo::PendingReceiver<device::mojom::blink::XRSessionClient>
+        client_receiver,
     XRSession::SessionMode mode,
     EnvironmentBlendMode environment_blend_mode,
     bool uses_input_eventing,
@@ -164,7 +165,7 @@
       world_information_(MakeGarbageCollected<XRWorldInformation>(this)),
       enabled_features_(std::move(enabled_features)),
       input_sources_(MakeGarbageCollected<XRInputSourceArray>()),
-      client_binding_(this, std::move(client_request)),
+      client_receiver_(this, std::move(client_receiver)),
       input_binding_(this),
       callback_collection_(
           MakeGarbageCollected<XRFrameRequestCallbackCollection>(
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h
index d1b0ffe..9a344bfe 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.h
+++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -8,7 +8,7 @@
 #include "base/containers/span.h"
 #include "device/vr/public/mojom/vr_service.mojom-blink.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
@@ -69,7 +69,8 @@
   };
 
   XRSession(XR* xr,
-            device::mojom::blink::XRSessionClientRequest client_request,
+            mojo::PendingReceiver<device::mojom::blink::XRSessionClient>
+                client_receiver,
             SessionMode mode,
             EnvironmentBlendMode environment_blend_mode,
             bool uses_input_eventing,
@@ -305,7 +306,7 @@
   unsigned int stage_parameters_id_ = 0;
   device::mojom::blink::VRDisplayInfoPtr display_info_;
 
-  mojo::Binding<device::mojom::blink::XRSessionClient> client_binding_;
+  mojo::Receiver<device::mojom::blink::XRSessionClient> client_receiver_;
   mojo::AssociatedBinding<device::mojom::blink::XRInputSourceButtonListener>
       input_binding_;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource.h b/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
index 28f9c705..6108bd35 100644
--- a/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
@@ -33,11 +33,13 @@
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
 namespace blink {
+
 class BytesConsumer;
 class BufferingBytesConsumer;
 class FetchParameters;
 class RawResourceClient;
 class ResourceFetcher;
+class SingleCachedMetadataHandler;
 
 class PLATFORM_EXPORT RawResource final : public Resource {
  public:
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.cc b/third_party/blink/renderer/platform/loader/fetch/resource.cc
index 0f9af93..a76ad93 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.cc
@@ -42,6 +42,7 @@
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
+#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 #include "third_party/blink/renderer/platform/loader/fetch/integrity_metadata.h"
@@ -1258,4 +1259,13 @@
   g_clock_for_testing = clock;
 }
 
+size_t Resource::CodeCacheSize() const {
+  return cache_handler_ ? cache_handler_->GetCodeCacheSize() : 0;
+}
+
+CachedMetadataHandler* Resource::CreateCachedMetadataHandler(
+    std::unique_ptr<CachedMetadataSender> send_callback) {
+  return nullptr;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.h b/third_party/blink/renderer/platform/loader/fetch/resource.h
index d9038a50..0eb58ab3 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.h
@@ -35,7 +35,6 @@
 #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.h"
-#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
 #include "third_party/blink/renderer/platform/loader/fetch/integrity_metadata.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_load_priority.h"
@@ -63,6 +62,8 @@
 
 namespace blink {
 
+class CachedMetadataHandler;
+class CachedMetadataSender;
 class FetchParameters;
 class ResourceClient;
 class ResourceFetcher;
@@ -237,9 +238,7 @@
 
   size_t DecodedSize() const { return decoded_size_; }
   size_t OverheadSize() const { return overhead_size_; }
-  size_t CodeCacheSize() const {
-    return (cache_handler_) ? cache_handler_->GetCodeCacheSize() : 0;
-  }
+  size_t CodeCacheSize() const;
 
   bool IsLoaded() const { return status_ > ResourceStatus::kPending; }
 
@@ -510,9 +509,7 @@
   // override SetSerializedCachedMetadata with an implementation that fills the
   // cache handler.
   virtual CachedMetadataHandler* CreateCachedMetadataHandler(
-      std::unique_ptr<CachedMetadataSender> send_callback) {
-    return nullptr;
-  }
+      std::unique_ptr<CachedMetadataSender> send_callback);
 
   CachedMetadataHandler* CacheHandler() { return cache_handler_.Get(); }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index 6fe377e..3d6537e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -57,6 +57,7 @@
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors_error_string.h"
+#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
 #include "third_party/blink/renderer/platform/loader/fetch/console_logger.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_context.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource.h"
diff --git a/third_party/blink/renderer/platform/loader/testing/mock_resource.h b/third_party/blink/renderer/platform/loader/testing/mock_resource.h
index 173f240..5c1e069 100644
--- a/third_party/blink/renderer/platform/loader/testing/mock_resource.h
+++ b/third_party/blink/renderer/platform/loader/testing/mock_resource.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_TESTING_MOCK_RESOURCE_H_
 
 #include "third_party/blink/renderer/platform/heap/handle.h"
+#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource.h"
 #include "third_party/blink/renderer/platform/wtf/ref_counted.h"
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py
index f27532f..7d80776 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py
@@ -252,7 +252,7 @@
         for test in tests:
             include = include_by_default
             for glob in sorted(globs, key=glob_sort_key):
-                if not glob[:-1]:
+                if (glob.startswith('-') and not glob[1:]) or not glob:
                     raise ValueError('Empty glob filter "%s"' % (filter,))
                 if '*' in glob[:-1]:
                     raise ValueError('Bad test filter "%s" specified; '
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js b/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js
index 025b1f6..d782964 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/nfc-mock.js
@@ -11,14 +11,6 @@
   return device.mojom.NFCPushTarget.ANY;
 }
 
-function toMojoNDEFCompatibility(compatibility) {
-  if (compatibility === 'nfc-forum')
-    return device.mojom.NDEFCompatibility.NFC_FORUM;
-  if (compatibility === 'vendor')
-    return device.mojom.NDEFCompatibility.VENDOR;
-  return device.mojom.NDEFCompatibility.ANY;
-}
-
 // Converts between NDEFMessageInit https://w3c.github.io/web-nfc/#dom-ndefmessage
 // and mojom.NDEFMessage structure, so that watch function can be tested.
 function toMojoNDEFMessage(message) {
@@ -90,14 +82,6 @@
     assert_equals(toMojoNFCPushTarget(provided.target), received.target);
   else
     assert_equals(received.target, device.mojom.NFCPushTarget.ANY);
-
-  if (provided.compatibility !== undefined) {
-    assert_equals(toMojoNDEFCompatibility(provided.compatibility),
-        received.compatibility);
-  } else {
-    assert_equals(received.compatibility,
-        device.mojom.NDEFCompatibility.NFC_FORUM);
-  }
 }
 
 // Compares NFCReaderOptions structures that were provided to API and
@@ -113,29 +97,14 @@
   else
     assert_equals(received.mediaType, '');
 
-  if (provided.compatibility !== undefined) {
-    assert_equals(toMojoNDEFCompatibility(provided.compatibility),
-        received.compatibility);
-  } else {
-    assert_equals(received.compatibility,
-        device.mojom.NDEFCompatibility.NFC_FORUM);
-  }
-
   if (provided.recordType !== undefined) {
     assert_equals(!+received.record_filter, true);
     assert_equals(provided.recordType, received.recordFilter.recordType);
   }
 }
 
-// Checks whether NFCReaderOptions are matched with given message
-// and mock nfc's compatibility
-function matchesWatchOptions(message, compatibility, options) {
-  // Filter by NDEFCompatibility
-  if (options.compatibility !== toMojoNDEFCompatibility("any")
-      && options.compatibility !== compatibility) {
-    return false;
-  }
-
+// Checks whether NFCReaderOptions are matched with given message.
+function matchesWatchOptions(message, options) {
   // Filter by Web NFC id
   if (!matchesWebNfcId(message.url, options.url)) return false;
 
@@ -255,10 +224,9 @@
       this.watchers_.push({id: id, options: options});
       // Triggers onWatch if the new watcher matches existing messages
       for (let message of this.reading_messages_) {
-        if (matchesWatchOptions(
-                message.message, message.compatibility, options)) {
+        if (matchesWatchOptions(message, options)) {
           this.client_.onWatch(
-              [id], fake_tag_serial_number, toMojoNDEFMessage(message.message));
+              [id], fake_tag_serial_number, toMojoNDEFMessage(message));
         }
       }
 
@@ -335,19 +303,16 @@
       this.push_should_timeout_ = false;
     }
 
-    // Sets message that is used to deliver NFC reading updates
-    // with a specific NDEFCompatibility.
-    setReadingMessage(message, compatibility = 'nfc-forum') {
-      this.reading_messages_.push({message: message,
-          compatibility: toMojoNDEFCompatibility(compatibility)});
+    // Sets message that is used to deliver NFC reading updates.
+    setReadingMessage(message) {
+      this.reading_messages_.push(message);
       // Ignore reading if NFCPushOptions.ignoreRead is true
       let ignoreRead = false;
       if(this.push_options_ && this.push_options_.ignoreRead)
         ignoreRead = this.push_options_.ignoreRead;
       // Triggers onWatch if the new message matches existing watchers
       for (let watcher of this.watchers_) {
-        if (!ignoreRead && matchesWatchOptions(
-            message, toMojoNDEFCompatibility(compatibility), watcher.options)) {
+        if (!ignoreRead && matchesWatchOptions(message, watcher.options)) {
           this.client_.onWatch(
               [watcher.id], fake_tag_serial_number,
               toMojoNDEFMessage(message));
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/NFCReader_options.https.html b/third_party/blink/web_tests/external/wpt/web-nfc/NFCReader_options.https.html
index 7c77045..8b38f55 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/NFCReader_options.https.html
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/NFCReader_options.https.html
@@ -61,13 +61,6 @@
       scanOptions: {mediaType: "application/octet-stream"},
       unmatchedScanOptions: {mediaType: "application/json"},
       message: createMessage([createOpaqueRecord(test_buffer_data)])
-    },
-    {
-      desc: "Test that the compatibility of NFCScanOptions filters relevant data" +
-            " sources correctly.",
-      scanOptions: {compatibility: "vendor"},
-      unmatchedScanOptions: {compatibility: "nfc-forum"},
-      message: createMessage([createTextRecord(test_text_data)]),
     }
   ];
 
@@ -123,14 +116,6 @@
       scanOptions: {mediaType: "application/octet-stream"},
       message: createMessage([createOpaqueRecord(test_buffer_data)]),
       unmatchedMessage: createMessage([createJsonRecord(test_json_data)])
-    },
-    {
-      desc: "Test that filtering 'text' record from different messages" +
-            " correctly with NFCScanOptions' compatibility set.",
-      scanOptions: {compatibility: "nfc-forum"},
-      message: createMessage([createTextRecord(test_text_data)]),
-      unmatchedMessage: createMessage([createJsonRecord(test_json_data)]),
-      unmatchedCompatibility: "vendor"
     }
   ];
 
@@ -144,16 +129,10 @@
 }
 
 for (let readMultiMessagesTest of ReadMultiMessagesTests) {
-  // Sets default message's associated compatibility
-  let unmatchedCompatibility = "nfc-forum";
-  if(readMultiMessagesTest.unmatchedCompatibility)
-    unmatchedCompatibility = readMultiMessagesTest.unmatchedCompatibility;
-
   testReadingMultiMessages(
     readMultiMessagesTest.message,
     readMultiMessagesTest.scanOptions,
     readMultiMessagesTest.unmatchedMessage,
-    unmatchedCompatibility,
     readMultiMessagesTest.desc
   );
 }
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/README.md b/third_party/blink/web_tests/external/wpt/web-nfc/README.md
index 8ae597e..dd072174 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/README.md
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/README.md
@@ -12,8 +12,7 @@
 
   class MockNFC {
     setHWStatus(number status); // Sets the hardware status.
-    setCompatibility(NDEFCompatibility compatibility); // Sets NDEF accepted compatible devices
-    setReadingMessage(NDEFMessageInit message, NDEFCompatibility compatibility); // Sets message that is used to deliver NFC reading updates with a specific NDEFCompatibility.
+    setReadingMessage(NDEFMessageInit message); // Sets message that is used to deliver NFC reading updates.
     setPendingPushCompleted(boolean result); // Sets if the pending push is completed.
     setPushShouldTimeout(boolean result); // Sets flag to trigger the pending push to timeout.
     pushedMessage(); // Gets the pushed `NDEFMessageSource`.
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js b/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js
index bffe10f..bace1b37 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js
@@ -111,8 +111,8 @@
   return createRecord('url', 'text/plain', url);
 }
 
-function createNFCPushOptions(target, timeout, ignoreRead, compatibility) {
-  return { target, timeout, ignoreRead, compatibility};
+function createNFCPushOptions(target, timeout, ignoreRead) {
+  return {target, timeout, ignoreRead};
 }
 
 // Compares NDEFMessageSource that was provided to the API
@@ -178,7 +178,7 @@
     const reader2 = new NFCReader();
     const controller = new AbortController();
 
-    mockNFC.setReadingMessage(message, scanOptions.compatibility);
+    mockNFC.setReadingMessage(message);
 
     // Reading from unmatched reader will not be triggered
     reader1.onreading = t.unreached_func("reading event should not be fired.");
@@ -198,8 +198,8 @@
   }, desc);
 }
 
-function testReadingMultiMessages(message, scanOptions, unmatchedMessage,
-    unmatchedCompatibility, desc) {
+function testReadingMultiMessages(
+    message, scanOptions, unmatchedMessage, desc) {
   nfc_test(async (t, mockNFC) => {
     const reader = new NFCReader();
     const controller = new AbortController();
@@ -214,7 +214,7 @@
     reader.scan(scanOptions);
 
     // Unmatched message will not be read
-    mockNFC.setReadingMessage(unmatchedMessage, unmatchedCompatibility);
+    mockNFC.setReadingMessage(unmatchedMessage);
     mockNFC.setReadingMessage(message);
 
     await promise;
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
deleted file mode 100644
index cbf0d672a..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic.html
index de005b2..bcb9c9c 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic.html
@@ -32,6 +32,9 @@
 <!-- indeterminate -->
 <input type="checkbox" id="indeterminateCheckbox">
 <input type="checkbox" id="indeterminateDisabledCheckbox" disabled> <br>
+<input type="checkbox" id="indeterminateCheckbox24px" style="width: 24px; height: 24px;">
+<input type="checkbox" id="indeterminateCheckboxZoom4" style="zoom: 4;">
+<input type="checkbox" id="indeterminateDisabledCheckboxZoom" style="zoom: 4;" disabled> <br>
 
 <!-- zoom -->
 <input type="checkbox" style="zoom: 1.5;">
@@ -40,9 +43,24 @@
 
 <div style="background-color: white">
   <input type="checkbox" disabled>
-  <input type="checkbox" disabled checked> <br>
+  <input type="checkbox" id="indeterminateDisabledWhiteBG" disabled>
+  <input type="checkbox" disabled checked>
+  <input type="checkbox" checked>
+  <input type="checkbox" id="hoverTarget" /> <br>
+  <input type="checkbox" id="indeterminateWhiteBG">
+  <input type="checkbox" checked style="zoom: 4;">
+  <input type="checkbox" checked style="zoom: 4;" disabled>
+  <input type="checkbox" id="indeterminateCheckboxZoom4WhiteBG" style="zoom: 4;" disabled>
+</div>
+<div style="background-color: black">
+  <input type="checkbox" disabled>
+  <input type="checkbox" id="indeterminateDisabledBlackBG" disabled>
+  <input type="checkbox" disabled checked>
   <input type="checkbox" checked> <br>
-  <input type="checkbox" id="hoverTarget"/>
+  <input type="checkbox" id="indeterminateBlackBG">
+  <input type="checkbox" checked style="zoom: 4;">
+  <input type="checkbox" checked style="zoom: 4;" disabled>
+  <input type="checkbox" id="indeterminateCheckboxZoom4BlackBG" style="zoom: 4;" disabled>
 </div>
 
 <script>
@@ -53,6 +71,15 @@
 runAfterLayoutAndPaint(function() {
   indeterminateCheckbox.indeterminate = true;
   indeterminateDisabledCheckbox.indeterminate = true;
+  indeterminateCheckbox24px.indeterminate = true;
+  indeterminateCheckboxZoom4.indeterminate = true;
+  indeterminateDisabledCheckboxZoom.indeterminate = true;
+  indeterminateDisabledWhiteBG.indeterminate = true;
+  indeterminateDisabledBlackBG.indeterminate = true;
+  indeterminateWhiteBG.indeterminate = true;
+  indeterminateBlackBG.indeterminate = true;
+  indeterminateCheckboxZoom4WhiteBG.indeterminate = true;
+  indeterminateCheckboxZoom4BlackBG.indeterminate = true;
 
   var target = document.getElementById('hoverTarget');
   hoverOverElement(target);
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index e74ae45..c4c6cf3 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index 6bd6518..c246bb2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index 4ee46d1..27c053f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index 5fb42b94..6ce4a6a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index 0cfe0f1..5556dab 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 1db676e..f4560ed 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index 7c59657..242805a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index 31ff285..bfd8a63 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index 7a18dbf5..d555f3f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index 6d0a5d1..990c2bf 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 0d24d6ba..5f3abce9 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index aa48940..ae999335 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index b9333ba..b22840c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index f714cf8..a135e4ae08 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 0408090..3176c19 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index 6696c25..c57e4ca 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
new file mode 100644
index 0000000..19c6fb62
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
index bc940094..ee0ab7b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index 34ce0a4..8124419 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index ee542b56..cd7bd58 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index 000f5628..ae9b705a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
new file mode 100644
index 0000000..d2f8427e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index 5fb42b94..6ce4a6a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index b2b00ca..622a2e6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 9afb7e3..819a2b92 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index 68638fc..3f2401f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index b80feeb..268ebf8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index 1116b9d..566da007 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index 3d9bc5cb..7d151aae 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
new file mode 100644
index 0000000..2a5aec4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 116d17f..2185947b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index ae18601..76ed524 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 84388cac..0c1509b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index 5190c10..b4bad19 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 092a06f..63f23e8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index 6d00316..0f48f12a6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
index 7e098be..7127e81 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
index bc940094..ee0ab7b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index 34ce0a4..8124419 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index ee542b56..cd7bd58 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index ae4c61d..c7aa0d9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
new file mode 100644
index 0000000..d2f8427e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index 5fb42b94..6ce4a6a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index b2b00ca..622a2e6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 0cb7eb6..f4f93dd7 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index 92acff7..5b1a7df6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index b80feeb..268ebf8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index 4a6a434..80d8593 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index bbe55c7f..f1f7c4f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
new file mode 100644
index 0000000..2a5aec4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 116d17f..2185947b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index ae18601..76ed524 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 84388cac..0c1509b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index 5190c10..b4bad19 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 1d7d3e9..45b8aef 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index 367d7c2d..2306902d9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
index 3d64b86..b44a7cf 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
index bc940094..ee0ab7b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index 34ce0a4..8124419 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index ee542b56..cd7bd58 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index ae4c61d..c7aa0d9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
new file mode 100644
index 0000000..d2f8427e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index 5fb42b94..6ce4a6a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index b2b00ca..622a2e6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 0cb7eb6..f4f93dd7 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index 92acff7..5b1a7df6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index b80feeb..268ebf8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index 4a6a434..80d8593 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index bbe55c7f..f1f7c4f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
new file mode 100644
index 0000000..2a5aec4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 116d17f..2185947b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index ae18601..76ed524 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 84388cac..0c1509b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index 5190c10..b4bad19 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 1d7d3e9..45b8aef 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index 367d7c2d..2306902d9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
index bc940094..ee0ab7b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index 34ce0a4..8124419 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index ee542b56..cd7bd58 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index 9970ac5..0482d27 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
new file mode 100644
index 0000000..d2f8427e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index 5fb42b94..6ce4a6a 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index 1692a62c..918d30b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 0cb7eb6..f4f93dd7 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index 92acff7..5b1a7df6 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index b80feeb..268ebf8 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index fc57d22..ea3a254f 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index bbe55c7f..f1f7c4f 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
new file mode 100644
index 0000000..2a5aec4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 116d17f..2185947b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index ae18601..76ed524 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 84388cac..0c1509b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index 5190c10..b4bad19 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 1d7d3e9..45b8aef 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index 367d7c2d..2306902d9 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
index a9e7282..feb509d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
index bc940094..ee0ab7b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index 34ce0a4..8124419 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index ee542b56..cd7bd58 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index 9970ac5..0482d27 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
index 5d1152c..d2f8427e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index 5fb42b94..6ce4a6a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index 1692a62c..918d30b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 0cb7eb6..f4f93dd7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index 92acff7..5b1a7df6 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index b80feeb..268ebf8 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index fc57d22..ea3a254f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index bbe55c7f..f1f7c4f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
index 44c80b9..2a5aec4 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 116d17f..2185947b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index ae18601..76ed524 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 84388cac..0c1509b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index 5190c10..b4bad19 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 1d7d3e9..45b8aef 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index 367d7c2d..2306902d9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
new file mode 100644
index 0000000..7f6ca3a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index 4f69b5c..00be3e8f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
deleted file mode 100644
index 5fb42b94..0000000
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index 570ca0e..7e19e27 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
index c31c9c6..fbf3c15 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
deleted file mode 100644
index 2c26fa78..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
deleted file mode 100644
index 871f3166..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 0e05cf9..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index 5881f3e..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 7e0a0a78..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index 7e8062e..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
deleted file mode 100644
index 871f3166..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
deleted file mode 100644
index c049d8f..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
deleted file mode 100644
index 652e5fb90..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index be2d1e6ab..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index d45e116..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 1c88c84a..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index d64194e..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
deleted file mode 100644
index bb5a9c77..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
deleted file mode 100644
index f726235..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
deleted file mode 100644
index aab8e56..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
deleted file mode 100644
index f157fe8d..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
deleted file mode 100644
index 5fb42b94..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
deleted file mode 100644
index 80fe133..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
deleted file mode 100644
index 77e1119..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
deleted file mode 100644
index 5fd83282..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
deleted file mode 100644
index 1a2830e07..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
deleted file mode 100644
index f001b69..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
deleted file mode 100644
index b8ed8f2..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
deleted file mode 100644
index e3c346b..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
deleted file mode 100644
index 0fbc2b4..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
deleted file mode 100644
index d987b1de..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
deleted file mode 100644
index e61ad0d2..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
deleted file mode 100644
index 0f7de89..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
deleted file mode 100644
index 06a2fb93..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
index 9cc8a42..48dad61 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index a8efab9..ec0db28 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 5e574b0..86f92be 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/radio_checkbox-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/radio_checkbox-expected.png
index bfc39c2..48a4c58 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/radio_checkbox-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/radio_checkbox-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
index 68f892e..fde193c 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/range-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
index 9a78228..779e4cca 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/text_number_password_button_submit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
index 94a4387..ab0cd20 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
index d5acb531..8cfc941 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
index e05c588c..6ce4a6a 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-disabled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
index 80fe133..00dea9e3 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
index 96310a7..3dcc535 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
index b7d0a055..37f21cd9 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
index 598f6a2..8e6ebae 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
index 78e829e..b1fd2bd2 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
index 1b1cb502..9e50ce12 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
index 6a10f66..0dbe488 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
index e470884..590dae5 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
index 5e574b0..86f92be 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/select/select-multiple-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
index b2a08eb..eaac131 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index d5ad312..e4bdeb3 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
index e3f93ac..b1b6d3c6 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium
index 7f00920..c573399 100644
--- a/third_party/crashpad/README.chromium
+++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@
 Short Name: crashpad
 URL: https://crashpad.chromium.org/
 Version: unknown
-Revision: 06fdbdecdc5d94989543bcec197752fdea2fbd9d
+Revision: edbbc4609d2d0703ed73ba9293971f1346234313
 License: Apache 2.0
 License File: crashpad/LICENSE
 Security Critical: yes
diff --git a/third_party/crashpad/crashpad/build/gyp_crashpad_android.py b/third_party/crashpad/crashpad/build/gyp_crashpad_android.py
index f78c05b9..e17e7a26 100755
--- a/third_party/crashpad/crashpad/build/gyp_crashpad_android.py
+++ b/third_party/crashpad/crashpad/build/gyp_crashpad_android.py
@@ -28,82 +28,45 @@
   parser = argparse.ArgumentParser(
       description='Set up an Android cross build',
       epilog='Additional arguments will be passed to gyp_crashpad.py.')
+  parser.add_argument('--arch', required=True, help='Target architecture')
+  parser.add_argument('--api-level', required=True, help='Target API level')
   parser.add_argument('--ndk', required=True, help='Standalone NDK toolchain')
-  parser.add_argument('--compiler',
-                      default='clang',
-                      choices=('clang', 'gcc'),
-                      help='The compiler to use, clang by default')
   (parsed, extra_command_line_args) = parser.parse_known_args(args)
 
-  NDK_ERROR=(
-      'NDK must be a valid standalone NDK toolchain.\n' +
-      'See https://developer.android.com/ndk/guides/standalone_toolchain.html')
-  arch_dirs = glob.glob(os.path.join(parsed.ndk, '*-linux-android*'))
-  if len(arch_dirs) != 1:
-    parser.error(NDK_ERROR)
+  ndk_bin_dir = os.path.join(parsed.ndk,
+                             'toolchains',
+                             'llvm',
+                             'prebuilt',
+                             'linux-x86_64',
+                             'bin')
+  if not os.path.exists(ndk_bin_dir):
+    parser.error("missing toolchain")
 
-  arch_triplet = os.path.basename(arch_dirs[0])
-  ARCH_TRIPLET_TO_ARCH = {
-    'arm-linux-androideabi': 'arm',
-    'aarch64-linux-android': 'arm64',
-    'i686-linux-android': 'ia32',
-    'x86_64-linux-android': 'x64',
-    'mipsel-linux-android': 'mips',
-    'mips64el-linux-android': 'mips64',
+  ARCH_TO_ARCH_TRIPLET = {
+    'arm': 'armv7a-linux-androideabi',
+    'arm64': 'aarch64-linux-android',
+    'ia32': 'i686-linux-android',
+    'x64': 'x86_64-linux-android',
   }
-  if arch_triplet not in ARCH_TRIPLET_TO_ARCH:
-    parser.error(NDK_ERROR)
-  arch = ARCH_TRIPLET_TO_ARCH[arch_triplet]
 
-  ndk_bin_dir = os.path.join(parsed.ndk, 'bin')
+  clang_prefix = ARCH_TO_ARCH_TRIPLET[parsed.arch] + parsed.api_level
+  os.environ['CC_target'] = os.path.join(ndk_bin_dir, clang_prefix + '-clang')
+  os.environ['CXX_target'] = os.path.join(ndk_bin_dir, clang_prefix + '-clang++')
 
-  clang_path = os.path.join(ndk_bin_dir, 'clang')
-  extra_args = []
+  extra_args = ['-D', 'android_api_level=' + parsed.api_level]
 
-  if parsed.compiler == 'clang':
-    os.environ['CC_target'] = clang_path
-    os.environ['CXX_target'] = os.path.join(ndk_bin_dir, 'clang++')
-  elif parsed.compiler == 'gcc':
-    os.environ['CC_target'] = os.path.join(ndk_bin_dir,
-                                           '%s-gcc' % arch_triplet)
-    os.environ['CXX_target'] = os.path.join(ndk_bin_dir,
-                                            '%s-g++' % arch_triplet)
-
-  # Unlike the Clang build, when using GCC with unified headers, __ANDROID_API__
-  # isn’t set automatically and must be pushed in to the build. Fish the correct
-  # value out of the Clang wrapper script. If deprecated headers are in use, the
-  # Clang wrapper won’t mention __ANDROID_API__, but the standalone toolchain’s
-  # <android/api-level.h> will #define it for both Clang and GCC.
-  #
-  # android_api_level is extracted in this manner even when compiling with Clang
-  # so that it’s available for use in GYP conditions that need to test the API
-  # level, but beware that it’ll only be available when unified headers are in
-  # use.
-  #
-  # Unified headers are the way of the future, according to
-  # https://android.googlesource.com/platform/ndk/+/ndk-r14/CHANGELOG.md and
-  # https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md.
-  # Traditional (deprecated) headers have been removed entirely as of NDK r16.
-  # https://android.googlesource.com/platform/ndk/+/ndk-release-r16/CHANGELOG.md.
-  with open(clang_path, 'r') as file:
-    clang_script_contents = file.read()
-  matches = re.finditer(r'\s-D__ANDROID_API__=([\d]+)\s',
-                        clang_script_contents)
-  match = next(matches, None)
-  if match:
-    android_api = int(match.group(1))
-    extra_args.extend(['-D', 'android_api_level=%d' % android_api])
-    if next(matches, None):
-      raise AssertionError('__ANDROID_API__ defined too many times')
+  # ARM only includes 'v7a' in the tool prefix for clang
+  tool_prefix = ('arm-linux-androideabi' if parsed.arch == 'arm'
+                 else ARCH_TO_ARCH_TRIPLET[parsed.arch])
 
   for tool in ('ar', 'nm', 'readelf'):
     os.environ['%s_target' % tool.upper()] = (
-        os.path.join(ndk_bin_dir, '%s-%s' % (arch_triplet, tool)))
+        os.path.join(ndk_bin_dir, '%s-%s' % (tool_prefix, tool)))
 
   return gyp_crashpad.main(
       ['-D', 'OS=android',
-       '-D', 'target_arch=%s' % arch,
-       '-D', 'clang=%d' % (1 if parsed.compiler == 'clang' else 0),
+       '-D', 'target_arch=%s' % parsed.arch,
+       '-D', 'clang=1',
        '-f', 'ninja-android'] +
       extra_args +
       extra_command_line_args)
diff --git a/third_party/crashpad/crashpad/client/crash_report_database_generic.cc b/third_party/crashpad/crashpad/client/crash_report_database_generic.cc
index bbdb244..aeaf2af4 100644
--- a/third_party/crashpad/crashpad/client/crash_report_database_generic.cc
+++ b/third_party/crashpad/crashpad/client/crash_report_database_generic.cc
@@ -173,8 +173,7 @@
 
 void AddAttachmentSize(const base::FilePath& attachments_dir, uint64_t* size) {
   // Early return if the attachment directory does not exist.
-  struct stat statbuf;
-  if (stat(attachments_dir.value().c_str(), &statbuf) != 0) {
+  if (!IsDirectory(attachments_dir, /*allow_symlinks=*/false)) {
     return;
   }
   DirectoryReader reader;
@@ -334,6 +333,9 @@
   base::FilePath attachments_dir =
       static_cast<CrashReportDatabaseGeneric*>(database_)->AttachmentsPath(
           uuid);
+  if (!IsDirectory(attachments_dir, /*allow_symlinks=*/false)) {
+    return;
+  }
   DirectoryReader reader;
   if (!reader.Open(attachments_dir)) {
     return;
@@ -873,7 +875,6 @@
   base::FilePath root_attachments_dir(base_dir_.Append(kAttachmentsDirectory));
   DirectoryReader reader;
   if (!reader.Open(root_attachments_dir)) {
-    LOG(ERROR) << "no attachments dir";
     return;
   }
 
@@ -914,6 +915,9 @@
 
 void CrashReportDatabaseGeneric::RemoveAttachmentsByUUID(const UUID& uuid) {
   base::FilePath attachments_dir = AttachmentsPath(uuid);
+  if (!IsDirectory(attachments_dir, /*allow_symlinks=*/false)) {
+    return;
+  }
   DirectoryReader reader;
   if (!reader.Open(attachments_dir)) {
     return;
diff --git a/third_party/crashpad/crashpad/doc/developing.md b/third_party/crashpad/crashpad/doc/developing.md
index f4a95e1..406a234 100644
--- a/third_party/crashpad/crashpad/doc/developing.md
+++ b/third_party/crashpad/crashpad/doc/developing.md
@@ -135,66 +135,38 @@
 
 ### Android
 
-Crashpad’s Android port is in its early stages. This build relies on
-cross-compilation. It’s possible to develop Crashpad for Android on any platform
-that the [Android NDK (Native Development
-Kit)](https://developer.android.com/ndk/) runs on.
+This build relies on cross-compilation. It’s possible to develop Crashpad for
+Android on any platform that the [Android NDK (Native Development Kit)]
+(https://developer.android.com/ndk/) runs on.
 
 If it’s not already present on your system, [download the NDK package for your
 system](https://developer.android.com/ndk/downloads/) and expand it to a
 suitable location. These instructions assume that it’s been expanded to
-`~/android-ndk-r16`.
-
-To build Crashpad, portions of the NDK must be reassembled into a [standalone
-toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html).
-This is a repackaged subset of the NDK suitable for cross-compiling for a single
-Android architecture (such as `arm`, `arm64`, `x86`, and `x86_64`) targeting a
-specific [Android API
-level](https://source.android.com/source/build-numbers.html). The standalone
-toolchain only needs to be built from the NDK one time for each set of options
-desired. To build a standalone toolchain targeting 64-bit ARM and API level 21
-(Android 5.0 “Lollipop”), run:
-
-```
-$ cd ~
-$ python android-ndk-r16/build/tools/make_standalone_toolchain.py \
-      --arch=arm64 --api=21 --install-dir=android-ndk-r16_arm64_api21
-```
+`~/android-ndk-r20`.
 
 Note that Chrome uses Android API level 21 for 64-bit platforms and 16 for
 32-bit platforms. See Chrome’s
 [`build/config/android/config.gni`](https://chromium.googlesource.com/chromium/src/+/master/build/config/android/config.gni)
 which sets `_android_api_level` and `_android64_api_level`.
 
-To configure a Crashpad build for Android using the standalone toolchain
-assembled above, use `gyp_crashpad_android.py`. This script is a wrapper for
-`gyp_crashpad.py` that sets several environment variables directing the build to
-the standalone toolchain, and several GYP options to identify an Android build.
-This must be done after any `gclient sync`, or instead of any `gclient runhooks`
-operation.
+To configure a Crashpad build for Android use `gyp_crashpad_android.py`. This
+script is a wrapper for `gyp_crashpad.py` that sets several environment
+variables directing the build to the toolchain, and several GYP options to
+identify an Android build. This must be done after any `gclient sync`, or
+instead of any `gclient runhooks` operation.
 
 ```
 $ cd ~/crashpad/crashpad
-$ python build/gyp_crashpad_android.py \
-      --ndk ~/android-ndk-r16_arm64_api21 \
-      --generator-output out/android_arm64_api21
+python build/gyp_crashpad_android.py \
+  --ndk ~/usr/lib/android-ndk-r20 --arch arm64 --api-level 21 \
+  --generator-output=out/android_arm64_api21 \
 ```
 
-`gyp_crashpad_android.py` detects the build type based on the characteristics of
-the standalone toolchain given in its `--ndk` argument.
-
-`gyp_crashpad_android.py` sets the build up to use Clang by default. It’s also
-possible to use GCC by providing the `--compiler=gcc` argument to
-`gyp_crashpad_android.py`.
-
-The Android port is incomplete, but targets known to be working include
-`crashpad_test`, `crashpad_util`, and their tests. This list will grow over
-time. To build, direct `ninja` to the specific `out` directory chosen by the
+To build, direct `ninja` to the specific `out` directory chosen by the
 `--generator-output` argument to `gyp_crashpad_android.py`.
 
 ```
-$ ninja -C out/android_arm64_api21/out/Debug \
-      crashpad_test_test crashpad_util_test
+$ ninja -C out/android_arm64_api21/out/Debug all
 ```
 
 ## Testing
diff --git a/third_party/crashpad/crashpad/handler/handler.gyp b/third_party/crashpad/crashpad/handler/handler.gyp
index 60a6f251..f80b5f0 100644
--- a/third_party/crashpad/crashpad/handler/handler.gyp
+++ b/third_party/crashpad/crashpad/handler/handler.gyp
@@ -39,6 +39,8 @@
         'crash_report_upload_thread.h',
         'handler_main.cc',
         'handler_main.h',
+        'linux/capture_snapshot.cc',
+        'linux/capture_snapshot.h',
         'linux/crash_report_exception_handler.cc',
         'linux/crash_report_exception_handler.h',
         'linux/exception_handler_server.cc',
diff --git a/third_party/crashpad/crashpad/handler/handler_main.cc b/third_party/crashpad/crashpad/handler/handler_main.cc
index d5a9e609..9fce9fc 100644
--- a/third_party/crashpad/crashpad/handler/handler_main.cc
+++ b/third_party/crashpad/crashpad/handler/handler_main.cc
@@ -644,7 +644,7 @@
      kOptionTraceParentWithException},
 #endif  // OS_LINUX || OS_ANDROID
     {"url", required_argument, nullptr, kOptionURL},
-#if defined(OS_CHROEMOS)
+#if defined(OS_CHROMEOS)
     {"use-cros-crash-reporter",
       no_argument,
       nullptr,
diff --git a/third_party/crashpad/crashpad/util/file/filesystem.h b/third_party/crashpad/crashpad/util/file/filesystem.h
index 27a4d1d..e12f127 100644
--- a/third_party/crashpad/crashpad/util/file/filesystem.h
+++ b/third_party/crashpad/crashpad/util/file/filesystem.h
@@ -73,7 +73,8 @@
 //!     failure.
 //!
 //! On POSIX, this function returns `true` if \a path refers to a file that is
-//! not a symbolic link, directory, or other kind of special file.
+//! not a symbolic link, directory, or other kind of special file. If this
+//! function fails because \a path does not exist, then no message is logged.
 //!
 //! On Windows, this function returns `true` if \a path refers to a file that
 //! is not a symbolic link or directory.
@@ -85,6 +86,9 @@
 //! \brief Determines if a path refers to a directory, logging a message on
 //!     failure.
 //!
+//! On POSIX, if this function fails because \a path does not exist, then no
+//! message is logged.
+//!
 //! \param[in] path The path to check.
 //! \param[in] allow_symlinks Whether to allow the final component in the path
 //!     to be a symbolic link to a directory.
diff --git a/third_party/crashpad/crashpad/util/file/filesystem_posix.cc b/third_party/crashpad/crashpad/util/file/filesystem_posix.cc
index b1f19f6..bb51a9c1 100644
--- a/third_party/crashpad/crashpad/util/file/filesystem_posix.cc
+++ b/third_party/crashpad/crashpad/util/file/filesystem_posix.cc
@@ -76,7 +76,7 @@
 bool IsRegularFile(const base::FilePath& path) {
   struct stat st;
   if (lstat(path.value().c_str(), &st) != 0) {
-    PLOG(ERROR) << "stat " << path.value();
+    PLOG_IF(ERROR, errno != ENOENT) << "stat " << path.value();
     return false;
   }
   return S_ISREG(st.st_mode);
@@ -86,11 +86,11 @@
   struct stat st;
   if (allow_symlinks) {
     if (stat(path.value().c_str(), &st) != 0) {
-      PLOG(ERROR) << "stat " << path.value();
+      PLOG_IF(ERROR, errno != ENOENT) << "stat " << path.value();
       return false;
     }
   } else if (lstat(path.value().c_str(), &st) != 0) {
-    PLOG(ERROR) << "lstat " << path.value();
+    PLOG_IF(ERROR, errno != ENOENT) << "lstat " << path.value();
     return false;
   }
   return S_ISDIR(st.st_mode);
diff --git a/third_party/crashpad/crashpad/util/util.gyp b/third_party/crashpad/crashpad/util/util.gyp
index c7d735f..b9da232 100644
--- a/third_party/crashpad/crashpad/util/util.gyp
+++ b/third_party/crashpad/crashpad/util/util.gyp
@@ -395,8 +395,8 @@
         ['OS=="linux" or OS=="android"', {
           'sources': [
             'net/http_transport_socket.cc',
-            'util/process_memory_sanitized.cc',
-            'util/process_memory_sanitized.h',
+            'process/process_memory_sanitized.cc',
+            'process/process_memory_sanitized.h',
           ],
         }, {  # else: OS!="linux"
           'sources!': [
diff --git a/third_party/crashpad/crashpad/util/util_test.gyp b/third_party/crashpad/crashpad/util/util_test.gyp
index c819e6d..f65a9186 100644
--- a/third_party/crashpad/crashpad/util/util_test.gyp
+++ b/third_party/crashpad/crashpad/util/util_test.gyp
@@ -156,7 +156,7 @@
         }],
         ['OS=="linux" or OS=="android"', {
           'sources': [
-            'util/process_memory_sanitized_test.cc',
+            'process/process_memory_sanitized_test.cc',
           ],
         }],
         ['OS!="linux" and OS!="android"', {
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py
index f44b326..03db062 100755
--- a/tools/idl_parser/idl_parser.py
+++ b/tools/idl_parser/idl_parser.py
@@ -267,20 +267,32 @@
     """Definition : error ';'"""
     p[0] = self.BuildError(p, 'Definition')
 
+  def p_ArgumentNameKeyword(self, p):
+    """ArgumentNameKeyword : ATTRIBUTE
+                           | CALLBACK
+                           | CONST
+                           | CREATOR
+                           | DELETER
+                           | DICTIONARY
+                           | ENUM
+                           | GETTER
+                           | INCLUDES
+                           | INHERIT
+                           | LEGACYCALLER
+                           | NAMESPACE
+                           | PARTIAL
+                           | SETTER
+                           | STATIC
+                           | STRINGIFIER
+                           | TYPEDEF
+                           | UNRESTRICTED"""
+    p[0] = p[1]
+
   def p_CallbackOrInterfaceOrMixin(self, p):
     """CallbackOrInterfaceOrMixin : CALLBACK CallbackRestOrInterface
                                   | INTERFACE InterfaceOrMixin"""
     p[0] = p[2]
 
-  def p_CallbackRestOrInterface(self, p):
-    """CallbackRestOrInterface : CallbackRest
-                               | INTERFACE InterfaceRest"""
-    if len(p) < 3:
-      p[0] = p[1]
-    else:
-      p[2].AddChildren(self.BuildTrue('CALLBACK'))
-      p[0] = p[2]
-
   def p_InterfaceOrMixin(self, p):
     """InterfaceOrMixin : InterfaceRest
                         | MixinRest"""
@@ -347,6 +359,12 @@
                        | ReadWriteSetlike"""
     p[0] = p[1]
 
+  def p_Inheritance(self, p):
+    """Inheritance : ':' identifier
+                   |"""
+    if len(p) > 1:
+      p[0] = self.BuildNamed('Inherit', p, 2)
+
   def p_MixinRest(self, p):
     """MixinRest : MIXIN identifier '{' MixinMembers '}' ';'"""
     p[0] = self.BuildNamed('Interface', p, 2, p[4])
@@ -375,138 +393,20 @@
       p[2].AddChildren(p[1])
       p[0] = p[2]
 
-  def p_Dictionary(self, p):
-    """Dictionary : DICTIONARY identifier Inheritance '{' DictionaryMembers '}' ';'"""
-    p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[3], p[5]))
-
-  # Error recovery for regular Dictionary
-  def p_DictionaryError(self, p):
-    """Dictionary : DICTIONARY error ';'"""
-    p[0] = self.BuildError(p, 'Dictionary')
-
-  # Error recovery for regular Dictionary
-  # (for errors inside dictionary definition)
-  def p_DictionaryError2(self, p):
-    """Dictionary : DICTIONARY identifier Inheritance '{' error"""
-    p[0] = self.BuildError(p, 'Dictionary')
-
-  def p_DictionaryMembers(self, p):
-    """DictionaryMembers : DictionaryMember DictionaryMembers
-                         |"""
-    if len(p) > 1:
-      p[0] = ListFromConcat(p[1], p[2])
-
-  # Error recovery for DictionaryMembers
-  def p_DictionaryMembersError(self, p):
-    """DictionaryMembers : ExtendedAttributeList error"""
-    p[0] = self.BuildError(p, 'DictionaryMembers')
-
-  def p_DictionaryMember(self, p):
-    """DictionaryMember : ExtendedAttributeList REQUIRED TypeWithExtendedAttributes identifier Default ';'
-                        | ExtendedAttributeList Type identifier Default ';'"""
-    if len(p) > 6:
-      p[2] = self.BuildTrue('REQUIRED')
-      p[0] = self.BuildNamed('Key', p, 4, ListFromConcat(p[2], p[3], p[5]))
-      p[0].AddChildren(p[1])
-    else:
-      applicable_to_types, non_applicable_to_types = \
-          DivideExtAttrsIntoApplicableAndNonApplicable(p[1])
-      if applicable_to_types:
-        attributes = self.BuildProduction('ExtAttributes', p, 1,
-            applicable_to_types)
-        p[2].AddChildren(attributes)
-      p[0] = self.BuildNamed('Key', p, 3, ListFromConcat(p[2], p[4]))
-      if non_applicable_to_types:
-        attributes = self.BuildProduction('ExtAttributes', p, 1,
-            non_applicable_to_types)
-        p[0].AddChildren(attributes)
-
-  def p_PartialDictionary(self, p):
-    """PartialDictionary : DICTIONARY identifier '{' DictionaryMembers '}' ';'"""
-    p[0] = self.BuildNamed('Dictionary', p, 2, p[4])
-
-  # Error recovery for Partial Dictionary
-  def p_PartialDictionaryError(self, p):
-    """PartialDictionary : DICTIONARY error ';'"""
-    p[0] = self.BuildError(p, 'PartialDictionary')
-
-  def p_Default(self, p):
-    """Default : '=' DefaultValue
-               |"""
-    if len(p) > 1:
-      p[0] = self.BuildProduction('Default', p, 2, p[2])
-
-  def p_DefaultValue(self, p):
-    """DefaultValue : ConstValue
-                    | string
-                    | '[' ']'
-                    | '{' '}'
-                    | null"""
-    if len(p) == 3:
-      if p[1] == '[':
-        p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'sequence'),
-                              self.BuildAttribute('VALUE', '[]'))
-      else:
-        p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'dictionary'),
-                              self.BuildAttribute('VALUE', '{}'))
-    elif type(p[1]) == str:
-      p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'DOMString'),
-                            self.BuildAttribute('VALUE', p[1]))
-    else:
-      p[0] = p[1]
-
-  def p_Inheritance(self, p):
-    """Inheritance : ':' identifier
-                   |"""
-    if len(p) > 1:
-      p[0] = self.BuildNamed('Inherit', p, 2)
-
-  def p_Enum(self, p):
-    """Enum : ENUM identifier '{' EnumValueList '}' ';'"""
-    p[0] = self.BuildNamed('Enum', p, 2, p[4])
-
-  # Error recovery for Enums
-  def p_EnumError(self, p):
-    """Enum : ENUM error ';'"""
-    p[0] = self.BuildError(p, 'Enum')
-
-  def p_EnumValueList(self, p):
-    """EnumValueList : string EnumValueListComma"""
-    enum = self.BuildNamed('EnumItem', p, 1)
-    p[0] = ListFromConcat(enum, p[2])
-
-  def p_EnumValueListComma(self, p):
-    """EnumValueListComma : ',' EnumValueListString
-                          |"""
-    if len(p) > 1:
-      p[0] = p[2]
-
-  def p_EnumValueListString(self, p):
-    """EnumValueListString : string EnumValueListComma
-                           |"""
-    if len(p) > 1:
-      enum = self.BuildNamed('EnumItem', p, 1)
-      p[0] = ListFromConcat(enum, p[2])
-
-  def p_CallbackRest(self, p):
-    """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'"""
-    arguments = self.BuildProduction('Arguments', p, 4, p[5])
-    p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments))
-
-  def p_Typedef(self, p):
-    """Typedef : TYPEDEF TypeWithExtendedAttributes identifier ';'"""
-    p[0] = self.BuildNamed('Typedef', p, 3, p[2])
-
-  # Error recovery for Typedefs
-  def p_TypedefError(self, p):
-    """Typedef : TYPEDEF error ';'"""
-    p[0] = self.BuildError(p, 'Typedef')
-
   def p_IncludesStatement(self, p):
     """IncludesStatement : identifier INCLUDES identifier ';'"""
     name = self.BuildAttribute('REFERENCE', p[3])
     p[0] = self.BuildNamed('Includes', p, 1, name)
 
+  def p_CallbackRestOrInterface(self, p):
+    """CallbackRestOrInterface : CallbackRest
+                               | INTERFACE InterfaceRest"""
+    if len(p) < 3:
+      p[0] = p[1]
+    else:
+      p[2].AddChildren(self.BuildTrue('CALLBACK'))
+      p[0] = p[2]
+
   def p_Const(self,  p):
     """Const : CONST ConstType identifier '=' ConstValue ';'"""
     value = self.BuildProduction('Value', p, 5, p[5])
@@ -515,20 +415,13 @@
   def p_ConstValue(self, p):
     """ConstValue : BooleanLiteral
                   | FloatLiteral
-                  | integer
-                  | null"""
+                  | integer"""
     if type(p[1]) == str:
       p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'integer'),
                             self.BuildAttribute('VALUE', p[1]))
     else:
       p[0] = p[1]
 
-  # Add definition for NULL
-  def p_null(self, p):
-    """null : NULL"""
-    p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'),
-                          self.BuildAttribute('VALUE', 'NULL'))
-
   def p_BooleanLiteral(self, p):
     """BooleanLiteral : TRUE
                       | FALSE"""
@@ -547,31 +440,14 @@
     p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'),
                           self.BuildAttribute('VALUE', val))
 
-  def p_Stringifier(self, p):
-    """Stringifier : STRINGIFIER StringifierRest"""
-    p[0] = self.BuildProduction('Stringifier', p, 1, p[2])
-
-  def p_StringifierRest(self, p):
-    """StringifierRest : ReadOnly AttributeRest
-                       | ReturnType OperationRest
-                       | ';'"""
-    if len(p) == 3:
-      p[2].AddChildren(p[1])
-      p[0] = p[2]
-
-  def p_StaticMember(self, p):
-    """StaticMember : STATIC StaticMemberRest"""
-    p[2].AddChildren(self.BuildTrue('STATIC'))
-    p[0] = p[2]
-
-  def p_StaticMemberRest(self, p):
-    """StaticMemberRest : ReadOnly AttributeRest
-                        | ReturnType OperationRest"""
-    if len(p) == 2:
-      p[0] = p[1]
+  def p_ConstType(self,  p):
+    """ConstType : PrimitiveType Null
+                 | identifier Null"""
+    if type(p[1]) == str:
+      p[0] = self.BuildNamed('Typeref', p, 1, p[2])
     else:
-      p[2].AddChildren(p[1])
-      p[0] = p[2]
+      p[1].AddChildren(p[2])
+      p[0] = p[1]
 
   def p_ReadonlyMember(self, p):
     """ReadonlyMember : READONLY ReadonlyMemberRest"""
@@ -613,6 +489,25 @@
     if len(p) > 1:
       p[0] = self.BuildTrue('READONLY')
 
+  def p_DefaultValue(self, p):
+    """DefaultValue : ConstValue
+                    | string
+                    | '[' ']'
+                    | '{' '}'
+                    | null"""
+    if len(p) == 3:
+      if p[1] == '[':
+        p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'sequence'),
+                              self.BuildAttribute('VALUE', '[]'))
+      else:
+        p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'dictionary'),
+                              self.BuildAttribute('VALUE', '{}'))
+    elif type(p[1]) == str:
+      p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'DOMString'),
+                            self.BuildAttribute('VALUE', p[1]))
+    else:
+      p[0] = p[1]
+
   def p_Operation(self, p):
     """Operation : ReturnType OperationRest
                  | SpecialOperation"""
@@ -708,6 +603,41 @@
       p[0] = self.BuildNamed('Argument', p, 1)
       p[0].AddChildren(self.BuildTrue('ELLIPSIS'))
 
+  def p_ReturnType(self, p):
+    """ReturnType : Type
+                  | VOID"""
+    if p[1] == 'void':
+      p[0] = self.BuildProduction('Type', p, 1)
+      p[0].AddChildren(self.BuildNamed('PrimitiveType', p, 1))
+    else:
+      p[0] = p[1]
+
+  def p_Stringifier(self, p):
+    """Stringifier : STRINGIFIER StringifierRest"""
+    p[0] = self.BuildProduction('Stringifier', p, 1, p[2])
+
+  def p_StringifierRest(self, p):
+    """StringifierRest : ReadOnly AttributeRest
+                       | ReturnType OperationRest
+                       | ';'"""
+    if len(p) == 3:
+      p[2].AddChildren(p[1])
+      p[0] = p[2]
+
+  def p_StaticMember(self, p):
+    """StaticMember : STATIC StaticMemberRest"""
+    p[2].AddChildren(self.BuildTrue('STATIC'))
+    p[0] = p[2]
+
+  def p_StaticMemberRest(self, p):
+    """StaticMemberRest : ReadOnly AttributeRest
+                        | ReturnType OperationRest"""
+    if len(p) == 2:
+      p[0] = p[1]
+    else:
+      p[2].AddChildren(p[1])
+      p[0] = p[2]
+
   def p_Iterable(self, p):
     """Iterable : ITERABLE '<' TypeWithExtendedAttributes OptionalType '>' ';'"""
     childlist = ListFromConcat(p[3], p[4])
@@ -723,15 +653,15 @@
     """ReadWriteMaplike : MaplikeRest"""
     p[0] = p[1]
 
-  def p_ReadWriteSetlike(self, p):
-    """ReadWriteSetlike : SetlikeRest"""
-    p[0] = p[1]
-
   def p_MaplikeRest(self, p):
     """MaplikeRest : MAPLIKE '<' TypeWithExtendedAttributes ',' TypeWithExtendedAttributes '>' ';'"""
     childlist = ListFromConcat(p[3], p[5])
     p[0] = self.BuildProduction('Maplike', p, 2, childlist)
 
+  def p_ReadWriteSetlike(self, p):
+    """ReadWriteSetlike : SetlikeRest"""
+    p[0] = p[1]
+
   def p_SetlikeRest(self, p):
     """SetlikeRest : SETLIKE '<' TypeWithExtendedAttributes '>' ';'"""
     p[0] = self.BuildProduction('Setlike', p, 2, p[3])
@@ -776,66 +706,107 @@
       p[3].AddChildren(p[1])
     p[0] = p[3]
 
-  # This rule has custom additions (i.e. SpecialComments).
-  def p_ExtendedAttributeList(self, p):
-    """ExtendedAttributeList : '[' ExtendedAttribute ExtendedAttributes ']'
-                             | """
-    if len(p) > 4:
-      items = ListFromConcat(p[2], p[3])
-      p[0] = self.BuildProduction('ExtAttributes', p, 1, items)
+  def p_Dictionary(self, p):
+    """Dictionary : DICTIONARY identifier Inheritance '{' DictionaryMembers '}' ';'"""
+    p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[3], p[5]))
 
-  # Error recovery for ExtendedAttributeList
-  def p_ExtendedAttributeListError(self, p):
-    """ExtendedAttributeList : '[' ExtendedAttribute ',' error"""
-    p[0] = self.BuildError(p, 'ExtendedAttributeList')
+  # Error recovery for regular Dictionary
+  def p_DictionaryError(self, p):
+    """Dictionary : DICTIONARY error ';'"""
+    p[0] = self.BuildError(p, 'Dictionary')
 
-  def p_ExtendedAttributes(self, p):
-    """ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes
+  # Error recovery for regular Dictionary
+  # (for errors inside dictionary definition)
+  def p_DictionaryError2(self, p):
+    """Dictionary : DICTIONARY identifier Inheritance '{' error"""
+    p[0] = self.BuildError(p, 'Dictionary')
+
+  def p_DictionaryMembers(self, p):
+    """DictionaryMembers : DictionaryMember DictionaryMembers
+                         |"""
+    if len(p) > 1:
+      p[0] = ListFromConcat(p[1], p[2])
+
+  # Error recovery for DictionaryMembers
+  def p_DictionaryMembersError(self, p):
+    """DictionaryMembers : ExtendedAttributeList error"""
+    p[0] = self.BuildError(p, 'DictionaryMembers')
+
+  def p_DictionaryMember(self, p):
+    """DictionaryMember : ExtendedAttributeList REQUIRED TypeWithExtendedAttributes identifier Default ';'
+                        | ExtendedAttributeList Type identifier Default ';'"""
+    if len(p) > 6:
+      p[2] = self.BuildTrue('REQUIRED')
+      p[0] = self.BuildNamed('Key', p, 4, ListFromConcat(p[2], p[3], p[5]))
+      p[0].AddChildren(p[1])
+    else:
+      applicable_to_types, non_applicable_to_types = \
+          DivideExtAttrsIntoApplicableAndNonApplicable(p[1])
+      if applicable_to_types:
+        attributes = self.BuildProduction('ExtAttributes', p, 1,
+            applicable_to_types)
+        p[2].AddChildren(attributes)
+      p[0] = self.BuildNamed('Key', p, 3, ListFromConcat(p[2], p[4]))
+      if non_applicable_to_types:
+        attributes = self.BuildProduction('ExtAttributes', p, 1,
+            non_applicable_to_types)
+        p[0].AddChildren(attributes)
+
+  def p_PartialDictionary(self, p):
+    """PartialDictionary : DICTIONARY identifier '{' DictionaryMembers '}' ';'"""
+    p[0] = self.BuildNamed('Dictionary', p, 2, p[4])
+
+  # Error recovery for Partial Dictionary
+  def p_PartialDictionaryError(self, p):
+    """PartialDictionary : DICTIONARY error ';'"""
+    p[0] = self.BuildError(p, 'PartialDictionary')
+
+  def p_Default(self, p):
+    """Default : '=' DefaultValue
+               |"""
+    if len(p) > 1:
+      p[0] = self.BuildProduction('Default', p, 2, p[2])
+
+  def p_Enum(self, p):
+    """Enum : ENUM identifier '{' EnumValueList '}' ';'"""
+    p[0] = self.BuildNamed('Enum', p, 2, p[4])
+
+  # Error recovery for Enums
+  def p_EnumError(self, p):
+    """Enum : ENUM error ';'"""
+    p[0] = self.BuildError(p, 'Enum')
+
+  def p_EnumValueList(self, p):
+    """EnumValueList : string EnumValueListComma"""
+    enum = self.BuildNamed('EnumItem', p, 1)
+    p[0] = ListFromConcat(enum, p[2])
+
+  def p_EnumValueListComma(self, p):
+    """EnumValueListComma : ',' EnumValueListString
                           |"""
     if len(p) > 1:
-      p[0] = ListFromConcat(p[2], p[3])
+      p[0] = p[2]
 
-  # https://heycam.github.io/webidl/#idl-extended-attributes
-  # The ExtendedAttribute symbol in Web IDL grammar is very flexible but we
-  # only support following patterns:
-  #    [ identifier ]
-  #    [ identifier ( ArgumentList ) ]
-  #    [ identifier = identifier ]
-  #    [ identifier = ( IdentifierList ) ]
-  #    [ identifier = identifier ( ArgumentList ) ]
-  #    [ identifier = ( StringList ) ]
-  # The first five patterns are specified in the Web IDL spec and the last
-  # pattern is Blink's custom extension to support [ReflectOnly].
-  def p_ExtendedAttribute(self, p):
-    """ExtendedAttribute : ExtendedAttributeNoArgs
-                         | ExtendedAttributeArgList
-                         | ExtendedAttributeIdent
-                         | ExtendedAttributeIdentList
-                         | ExtendedAttributeNamedArgList
-                         | ExtendedAttributeStringLiteral
-                         | ExtendedAttributeStringLiteralList"""
-    p[0] = p[1]
+  def p_EnumValueListString(self, p):
+    """EnumValueListString : string EnumValueListComma
+                           |"""
+    if len(p) > 1:
+      enum = self.BuildNamed('EnumItem', p, 1)
+      p[0] = ListFromConcat(enum, p[2])
 
-  def p_ArgumentNameKeyword(self, p):
-    """ArgumentNameKeyword : ATTRIBUTE
-                           | CALLBACK
-                           | CONST
-                           | CREATOR
-                           | DELETER
-                           | DICTIONARY
-                           | ENUM
-                           | GETTER
-                           | INCLUDES
-                           | INHERIT
-                           | LEGACYCALLER
-                           | NAMESPACE
-                           | PARTIAL
-                           | SETTER
-                           | STATIC
-                           | STRINGIFIER
-                           | TYPEDEF
-                           | UNRESTRICTED"""
-    p[0] = p[1]
+  def p_CallbackRest(self, p):
+    """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'"""
+    arguments = self.BuildProduction('Arguments', p, 4, p[5])
+    p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments))
+
+  def p_Typedef(self, p):
+    """Typedef : TYPEDEF TypeWithExtendedAttributes identifier ';'"""
+    p[0] = self.BuildNamed('Typedef', p, 3, p[2])
+
+  # Error recovery for Typedefs
+  def p_TypedefError(self, p):
+    """Typedef : TYPEDEF error ';'"""
+    p[0] = self.BuildError(p, 'Typedef')
 
   def p_Type(self, p):
     """Type : SingleType
@@ -905,16 +876,6 @@
       cls = 'Sequence' if p[1] == 'sequence' else 'FrozenArray'
       p[0] = self.BuildProduction(cls, p, 1, ListFromConcat(p[3], p[5]))
 
-  def p_ConstType(self,  p):
-    """ConstType : PrimitiveType Null
-                 | identifier Null"""
-    if type(p[1]) == str:
-      p[0] = self.BuildNamed('Typeref', p, 1, p[2])
-    else:
-      p[1].AddChildren(p[2])
-      p[0] = p[1]
-
-
   # Added StringType, OBJECT
   def p_PrimitiveType(self, p):
     """PrimitiveType : UnsignedIntegerType
@@ -968,24 +929,76 @@
     else:
       p[0] = ''
 
+  def p_StringType(self, p):
+    """StringType : BYTESTRING
+                  | DOMSTRING
+                  | USVSTRING"""
+    p[0] = self.BuildNamed('StringType', p, 1)
+
   def p_PromiseType(self, p):
     """PromiseType : PROMISE '<' ReturnType '>'"""
     p[0] = self.BuildNamed('Promise', p, 1, p[3])
 
+  def p_RecordType(self, p):
+    """RecordType : RECORD '<' StringType ',' TypeWithExtendedAttributes '>'"""
+    p[0] = self.BuildProduction('Record', p, 2, ListFromConcat(p[3], p[5]))
+
+  # Error recovery for RecordType.
+  def p_RecordTypeError(self, p):
+    """RecordType : RECORD '<' error ',' Type '>'"""
+    p[0] = self.BuildError(p, 'RecordType')
+
   def p_Null(self, p):
     """Null : '?'
             |"""
     if len(p) > 1:
       p[0] = self.BuildTrue('NULLABLE')
 
-  def p_ReturnType(self, p):
-    """ReturnType : Type
-                  | VOID"""
-    if p[1] == 'void':
-      p[0] = self.BuildProduction('Type', p, 1)
-      p[0].AddChildren(self.BuildNamed('PrimitiveType', p, 1))
-    else:
-      p[0] = p[1]
+  # This rule has custom additions (i.e. SpecialComments).
+  def p_ExtendedAttributeList(self, p):
+    """ExtendedAttributeList : '[' ExtendedAttribute ExtendedAttributes ']'
+                             | """
+    if len(p) > 4:
+      items = ListFromConcat(p[2], p[3])
+      p[0] = self.BuildProduction('ExtAttributes', p, 1, items)
+
+  # Error recovery for ExtendedAttributeList
+  def p_ExtendedAttributeListError(self, p):
+    """ExtendedAttributeList : '[' ExtendedAttribute ',' error"""
+    p[0] = self.BuildError(p, 'ExtendedAttributeList')
+
+  def p_ExtendedAttributes(self, p):
+    """ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes
+                          |"""
+    if len(p) > 1:
+      p[0] = ListFromConcat(p[2], p[3])
+
+  # https://heycam.github.io/webidl/#idl-extended-attributes
+  # The ExtendedAttribute symbol in Web IDL grammar is very flexible but we
+  # only support following patterns:
+  #    [ identifier ]
+  #    [ identifier ( ArgumentList ) ]
+  #    [ identifier = identifier ]
+  #    [ identifier = ( IdentifierList ) ]
+  #    [ identifier = identifier ( ArgumentList ) ]
+  #    [ identifier = ( StringList ) ]
+  # The first five patterns are specified in the Web IDL spec and the last
+  # pattern is Blink's custom extension to support [ReflectOnly].
+  def p_ExtendedAttribute(self, p):
+    """ExtendedAttribute : ExtendedAttributeNoArgs
+                         | ExtendedAttributeArgList
+                         | ExtendedAttributeIdent
+                         | ExtendedAttributeIdentList
+                         | ExtendedAttributeNamedArgList
+                         | ExtendedAttributeStringLiteral
+                         | ExtendedAttributeStringLiteralList"""
+    p[0] = p[1]
+
+  # Add definition for NULL
+  def p_null(self, p):
+    """null : NULL"""
+    p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'),
+                          self.BuildAttribute('VALUE', 'NULL'))
 
   def p_IdentifierList(self, p):
     """IdentifierList : identifier Identifiers"""
@@ -1022,6 +1035,11 @@
     value = self.BuildNamed('Call', p, 3, args)
     p[0] = self.BuildNamed('ExtAttribute', p, 1, value)
 
+
+
+
+
+
   # Blink extension: Add support for string literal Extended Attribute values
   def p_ExtendedAttributeStringLiteral(self, p):
     """ExtendedAttributeStringLiteral : identifier '=' StringLiteral"""
@@ -1059,21 +1077,6 @@
     p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'DOMString'),
                           self.BuildAttribute('NAME', p[1]))
 
-  def p_StringType(self, p):
-    """StringType : BYTESTRING
-                  | DOMSTRING
-                  | USVSTRING"""
-    p[0] = self.BuildNamed('StringType', p, 1)
-
-  def p_RecordType(self, p):
-    """RecordType : RECORD '<' StringType ',' TypeWithExtendedAttributes '>'"""
-    p[0] = self.BuildProduction('Record', p, 2, ListFromConcat(p[3], p[5]))
-
-  # Error recovery for RecordType.
-  def p_RecordTypeError(self, p):
-    """RecordType : RECORD '<' error ',' Type '>'"""
-    p[0] = self.BuildError(p, 'RecordType')
-
   # Blink extension: Treat special comments (/** ... */) as AST nodes to
   # annotate other nodes. Currently they are used for testing.
   def p_SpecialComments(self, p):
diff --git a/tools/idl_parser/test_parser/interface_web.idl b/tools/idl_parser/test_parser/interface_web.idl
index 508acf8..09efe94 100644
--- a/tools/idl_parser/test_parser/interface_web.idl
+++ b/tools/idl_parser/test_parser/interface_web.idl
@@ -152,17 +152,6 @@
 };
 
 /** TREE
- *Interface(MyIFaceBig)
- *  Const(setString)
- *    StringType(DOMString)
- *      NULLABLE: True
- *    Value() = "NULL"
- */
-interface MyIFaceBig {
-  const DOMString? setString = null;
-};
-
-/** TREE
  *Interface(MyIfaceDefalutValue)
  *  Operation(foo)
  *    Arguments()
@@ -235,11 +224,7 @@
 };
 
 /** TREE
- *Interface(MyIFaceBig2)
- *  Const(nullValue)
- *    StringType(DOMString)
- *      NULLABLE: True
- *    Value() = "NULL"
+ *Interface(MyIFaceBig)
  *  Const(longValue)
  *    PrimitiveType(long)
  *    Value() = "123"
@@ -273,8 +258,7 @@
  *    Type()
  *      PrimitiveType(void)
  */
-interface MyIFaceBig2 {
-  const DOMString? nullValue = null;
+interface MyIFaceBig {
   const long longValue = 123;
   const long long longValue2 = 123;
   attribute DOMString myString;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 01907ac2..f8fe512e6 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2850,7 +2850,7 @@
   <int value="1" label="[20 to 40)"/>
   <int value="2" label="[40 to 60)"/>
   <int value="3" label="[60 to 80)"/>
-  <int value="4" label="[80 to 100) (warmest)"/>
+  <int value="4" label="[80 to 100] (warmest)"/>
 </enum>
 
 <enum name="AshPipEvents">
@@ -10680,6 +10680,16 @@
   <int value="2" label="Host prefix"/>
 </enum>
 
+<enum name="CookieSameSiteString">
+  <int value="0" label="No SameSite attribute is present."/>
+  <int value="1" label="SameSite attribute is specified but has no value."/>
+  <int value="2" label="SameSite attribute value is unrecognized."/>
+  <int value="3" label="Lax"/>
+  <int value="4" label="Strict"/>
+  <int value="5" label="None"/>
+  <int value="6" label="Extended"/>
+</enum>
+
 <enum name="CookieSourceScheme">
   <int value="0" label="Secure cookie, source scheme is cryptographic"/>
   <int value="1" label="Secure cookie, source scheme is not cryptographic"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 0115272..c9d991e 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -24629,6 +24629,26 @@
   </summary>
 </histogram>
 
+<histogram name="Cookie.SameSiteAttributeValue" enum="CookieSameSiteString"
+    expires_after="M90">
+  <owner>chlily@chromium.org</owner>
+  <owner>bingler@chromium.org</owner>
+  <summary>
+    The value of the cookie's SameSite attribute, if any. This is logged once
+    per created cookie, upon parsing of the SameSite attribute from a string.
+  </summary>
+</histogram>
+
+<histogram name="Cookie.SameSiteNoneIsSecure" enum="Boolean"
+    expires_after="M90">
+  <owner>chlily@chromium.org</owner>
+  <owner>morlovich@chromium.org</owner>
+  <summary>
+    If a cookie was SameSite=None, this records whether or not it was Secure.
+    Logged once per attempt to set a SameSite=None cookie.
+  </summary>
+</histogram>
+
 <histogram name="Cookie.SameSiteUnspecifiedTooOldToAllowUnsafe" units="ms"
     expires_after="M85">
   <owner>chlily@chromium.org</owner>
@@ -27925,6 +27945,9 @@
 
 <histogram name="DataReductionProxy.Pingback.Attempted" enum="BooleanAttempted"
     expires_after="M81">
+  <obsolete>
+    Removed in M79.
+  </obsolete>
   <owner>ryansturm@chromium.org</owner>
   <summary>
     Counts the number of times that pageload metrics were queued to be attempted
@@ -27934,6 +27957,9 @@
 
 <histogram name="DataReductionProxy.Pingback.CrashAction"
     enum="DataReductionProxyPingbackCrashAction" expires_after="M81">
+  <obsolete>
+    Removed in M79.
+  </obsolete>
   <owner>ryansturm@chromium.org</owner>
   <summary>
     Counts various actions related to crash detection in the pingback client.
@@ -27944,6 +27970,9 @@
 
 <histogram name="DataReductionProxy.Pingback.Succeeded" enum="BooleanSuccess"
     expires_after="M81">
+  <obsolete>
+    Removed in M79.
+  </obsolete>
   <owner>ryansturm@chromium.org</owner>
   <summary>
     Counts the number of times that a batched pingback request succeeded or
@@ -131757,10 +131786,10 @@
 </histogram>
 
 <histogram name="SignedExchange.SignatureVerificationError.Expired"
-    units="seconds" expires_after="2019-09-20">
+    units="seconds" expires_after="2020-04-01">
   <owner>kinuko@chromium.org</owner>
-  <owner>kouhei@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
+  <owner>horo@chromium.org</owner>
   <summary>
     Recorded when Signed Exchange signature was expired. Records the time delta
     between current time and signature's &quot;expires&quot; value.
@@ -131779,10 +131808,10 @@
 </histogram>
 
 <histogram name="SignedExchange.SignatureVerificationResult"
-    enum="SignedExchangeSignatureVerificationResult" expires_after="2019-09-20">
+    enum="SignedExchangeSignatureVerificationResult" expires_after="2020-04-01">
   <owner>kinuko@chromium.org</owner>
-  <owner>kouhei@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
+  <owner>horo@chromium.org</owner>
   <summary>
     Reports the result of Signed Exchange signature verification, including
     success.
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index d48caed8..5cc6255f 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -64,7 +64,7 @@
  <item id="cryptauth_get_my_devices" hash_code="136498680" type="1" second_id="29188932" deprecated="2018-04-04" content_hash_code="73842435" file_path=""/>
  <item id="cryptauth_toggle_easyunlock" hash_code="25204343" type="1" second_id="29188932" deprecated="2018-04-04" content_hash_code="13570943" file_path=""/>
  <item id="data_reduction_proxy_config" hash_code="485305" type="0" content_hash_code="134075813" os_list="linux,windows" file_path="components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc"/>
- <item id="data_reduction_proxy_pingback" hash_code="68561428" type="0" content_hash_code="78407792" os_list="linux,windows" file_path="components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc"/>
+ <item id="data_reduction_proxy_pingback" hash_code="68561428" type="0" deprecated="2019-09-17" content_hash_code="78407792" file_path="components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc"/>
  <item id="data_reduction_proxy_secure_proxy_check" hash_code="131236802" type="0" content_hash_code="122297136" os_list="linux,windows" file_path="components/data_reduction_proxy/core/browser/secure_proxy_checker.cc"/>
  <item id="data_reduction_proxy_warmup" hash_code="8250451" type="0" content_hash_code="6321249" os_list="linux,windows" file_path="components/data_reduction_proxy/core/browser/warmup_url_fetcher.cc"/>
  <item id="desktop_ios_promotion" hash_code="13694792" type="0" deprecated="2018-11-04" content_hash_code="19776951" file_path=""/>
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb b/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb
index 665f1c5..c32df54 100644
--- a/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb
+++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb
@@ -18,7 +18,7 @@
 <translation id="2648340354586434750">शब्दांनुसार हलविण्‍यासाठी &lt;span class='key'&gt;पर्याय&lt;/span&gt; धरून ठेवा.</translation>
 <translation id="2795227192542594043">हा विस्‍तार तुम्हाला कीबोर्डसह मजकूर निवडण्‍याची अनुमती देणारा, वेबपेजमधील हलणारा कर्सर देतो.</translation>
 <translation id="2808027189040546825">चरण 1: सर्वाधिक अंधुक तारे असलेली पंक्ती निवडा:</translation>
-<translation id="2965611304828530558">&lt;p&gt;तुम्ही लिंकवर किंवा नियंत्रणावर पोहचता तेव्‍हा, ते स्‍वयंचलितपणे फोकस केले जाते. लिंक किंवा बटण क्लिक करण्यासाठी &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;span class='key'&gt;Tab&lt;/span&gt; दाबा. &lt;/p&gt;</translation>
+<translation id="2965611304828530558">&lt;p&gt;तुम्ही दुव्‍यावर किंवा नियंत्रणावर पोहचता तेव्‍हा, ते आपोआप फोकस केले जाते. दुवा किंवा बटण क्लिक करण्यासाठी &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;span class='key'&gt;Tab&lt;/span&gt; दाबा. &lt;/p&gt;</translation>
 <translation id="3252573918265662711">सेटअप</translation>
 <translation id="3410969471888629217">साइट सानुकूलने विसरा</translation>
 <translation id="3435896845095436175">सुरू करा</translation>
diff --git a/ui/aura/window_event_dispatcher.cc b/ui/aura/window_event_dispatcher.cc
index b3887da..07db9b12 100644
--- a/ui/aura/window_event_dispatcher.cc
+++ b/ui/aura/window_event_dispatcher.cc
@@ -1032,6 +1032,14 @@
       !host_->ShouldSendKeyEventToIme()) {
     return DispatchDetails();
   }
+
+  // At this point (i.e: EP_PREDISPATCH), event target is still not set, so do
+  // it explicitly here thus making it possible for InputMethodContext
+  // implementation to retrieve target window through KeyEvent::target().
+  // Event::target is reset at WindowTreeHost::DispatchKeyEventPostIME(), just
+  // after key is processed by InputMethodContext.
+  ui::Event::DispatcherApi(event).set_target(window());
+
   DispatchDetails details = host_->GetInputMethod()->DispatchKeyEvent(event);
   event->StopPropagation();
   return details;
diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc
index afa9987..9fe458d 100644
--- a/ui/aura/window_tree_host.cc
+++ b/ui/aura/window_tree_host.cc
@@ -263,6 +263,11 @@
   // If dispatch to IME is already disabled we shouldn't reach here.
   DCHECK(!dispatcher_->should_skip_ime());
   dispatcher_->set_skip_ime(true);
+
+  // InputMethod::DispatchKeyEvent() is called in PRE_DISPATCH phase, so event
+  // target is reset here to avoid issues in subsequent processing phases.
+  ui::Event::DispatcherApi(event).set_target(nullptr);
+
   // We should bypass event rewriters here as they've been tried before.
   ui::EventDispatchDetails dispatch_details =
       event_sink()->OnEventFromSource(event);
diff --git a/ui/events/event.cc b/ui/events/event.cc
index 9f1bb86c..ac84b45 100644
--- a/ui/events/event.cc
+++ b/ui/events/event.cc
@@ -28,6 +28,7 @@
 
 #if defined(USE_X11)
 #include "ui/events/keycodes/keyboard_code_conversion_x.h"  // nogncheck
+#include "ui/events/x/events_x_utils.h"                     // nogncheck
 #include "ui/gfx/x/x11.h"                                   // nogncheck
 #elif defined(USE_OZONE)
 #include "ui/events/ozone/layout/keyboard_layout_engine.h"  // nogncheck
@@ -50,6 +51,22 @@
 
   return event && (event->xkey.state & ~kAllStateMask) != 0;
 }
+
+Event::Properties GetKeyEventPropertiesFromXKeyEvent(const XKeyEvent& xev) {
+  using Values = std::vector<uint8_t>;
+  Event::Properties properties;
+
+  // Keyboard group
+  uint8_t group = XkbGroupForCoreState(xev.state);
+  properties.emplace(kPropertyKeyboardGroup, Values{group});
+
+  // IBus-gtk specific flags
+  uint8_t ibus_flags = (xev.state >> kPropertyKeyboardIBusFlagOffset) &
+                       kPropertyKeyboardIBusFlagMask;
+  properties.emplace(kPropertyKeyboardIBusFlag, Values{ibus_flags});
+
+  return properties;
+}
 #endif
 
 constexpr int kChangedButtonFlagMask =
@@ -890,6 +907,7 @@
 
 #if defined(USE_X11)
   NormalizeFlags();
+  SetProperties(GetKeyEventPropertiesFromXKeyEvent(native_event->xkey));
 #endif
 #if defined(OS_WIN)
   // Only Windows has native character events.
diff --git a/ui/events/event_utils.h b/ui/events/event_utils.h
index d82cfc4..691012e0 100644
--- a/ui/events/event_utils.h
+++ b/ui/events/event_utils.h
@@ -40,6 +40,16 @@
 class MouseEvent;
 enum class DomCode;
 
+// Key used to store keyboard 'group' values in Event::Properties
+constexpr char kPropertyKeyboardGroup[] = "_keyevent_kbd_group_";
+
+// IBus specific Event::Properties constants. ibus-gtk in async mode uses
+// gtk-specific XKeyEvent::state bits 24 and 25 for its key events.
+// https://mail.gnome.org/archives/gtk-devel-list/2013-June/msg00003.html
+constexpr char kPropertyKeyboardIBusFlag[] = "_keyevent_kbd_ibus_ime_flags_";
+constexpr unsigned int kPropertyKeyboardIBusFlagOffset = 24;
+constexpr unsigned int kPropertyKeyboardIBusFlagMask = 0x03;
+
 // Returns a ui::Event wrapping a native event. Ownership of the returned value
 // is transferred to the caller.
 EVENTS_EXPORT std::unique_ptr<Event> EventFromNative(
diff --git a/ui/latency/latency_info.cc b/ui/latency/latency_info.cc
index 29dceca..a3e449e 100644
--- a/ui/latency/latency_info.cc
+++ b/ui/latency/latency_info.cc
@@ -130,6 +130,7 @@
       predicted_scroll_update_delta_(0) {}
 
 LatencyInfo::LatencyInfo(const LatencyInfo& other) = default;
+LatencyInfo::LatencyInfo(LatencyInfo&& other) = default;
 
 LatencyInfo::~LatencyInfo() {}
 
@@ -143,6 +144,8 @@
       scroll_update_delta_(0),
       predicted_scroll_update_delta_(0) {}
 
+LatencyInfo& LatencyInfo::operator=(const LatencyInfo& other) = default;
+
 bool LatencyInfo::Verify(const std::vector<LatencyInfo>& latency_info,
                          const char* referring_msg) {
   if (latency_info.size() > kMaxLatencyInfoNumber) {
diff --git a/ui/latency/latency_info.h b/ui/latency/latency_info.h
index 68e31c1..ac374e5 100644
--- a/ui/latency/latency_info.h
+++ b/ui/latency/latency_info.h
@@ -120,12 +120,15 @@
 
   LatencyInfo();
   LatencyInfo(const LatencyInfo& other);
+  LatencyInfo(LatencyInfo&& other);
   LatencyInfo(SourceEventType type);
   ~LatencyInfo();
 
   // For test only.
   LatencyInfo(int64_t trace_id, bool terminated);
 
+  LatencyInfo& operator=(const LatencyInfo& other);
+
   // Returns true if the vector |latency_info| is valid. Returns false
   // if it is not valid and log the |referring_msg|.
   // This function is mainly used to check the latency_info vector that
diff --git a/ui/message_center/public/cpp/notification.h b/ui/message_center/public/cpp/notification.h
index 63e0c0f..9a374b2 100644
--- a/ui/message_center/public/cpp/notification.h
+++ b/ui/message_center/public/cpp/notification.h
@@ -403,6 +403,10 @@
            SettingsButtonHandler::NONE;
   }
 
+  void set_settings_button_handler(SettingsButtonHandler handler) {
+    optional_fields_.settings_button_handler = handler;
+  }
+
   bool should_show_snooze_button() const {
     return optional_fields_.should_show_snooze_button;
   }
diff --git a/ui/native_theme/native_theme_aura.cc b/ui/native_theme/native_theme_aura.cc
index 6024bce..d65523f 100644
--- a/ui/native_theme/native_theme_aura.cc
+++ b/ui/native_theme/native_theme_aura.cc
@@ -48,50 +48,24 @@
 
 const int kCheckboxBorderRadius = 2;
 const int kCheckboxAndRadioBorderWidth = 1;
-const SkColor kCheckboxAndRadioTinyColor = SK_ColorGRAY;
-const SkColor kCkeckboxAndRadioBackgroundColor =
-    SkColorSetRGB(0xFF, 0xFF, 0xFF);
-const SkColor kCheckboxAndRadioBorderColor = SkColorSetRGB(0xCE, 0xCE, 0xCE);
-const SkColor kCheckboxAndRadioBorderHoveredColor =
-    SkColorSetRGB(0x9D, 0x9D, 0x9D);
-const SkColor kCheckboxAndRadioBorderDisabledColor =
-    SkColorSetRGB(0xC5, 0xC5, 0xC5);
-const SkColor kCheckboxAndRadioStrokeColor = SkColorSetRGB(0x73, 0x73, 0x73);
-const SkColor kCheckboxAndRadioStrokeDisabledColor =
-    SkColorSetRGB(0xC5, 0xC5, 0xC5);
 
 const int kInputBorderRadius = 2;
 const int kInputBorderWidth = 1;
-const SkColor kInputBorderColor = SkColorSetRGB(0xCE, 0xCE, 0xCE);
-const SkColor kInputBorderHoveredColor = SkColorSetRGB(0x9D, 0x9D, 0x9D);
-const SkColor kInputBorderDisabledColor = SkColorSetRGB(0xC5, 0xC5, 0xC5);
-
 const SkScalar kButtonBorderRadius = 2.f;
 const SkScalar kButtonBorderWidth = 1.f;
-const SkColor kButtonBackgroundColor = SkColorSetRGB(0xEF, 0xEF, 0xEF);
-const SkColor kButtonBackgroundHoveredColor = SkColorSetRGB(0xF3, 0xF3, 0xF3);
-const SkColor kButtonBackgroundDisabledColor = SkColorSetRGB(0xEF, 0xEF, 0xEF);
-const SkColor kButtonBorderColor = SkColorSetRGB(0xCE, 0xCE, 0xCE);
-const SkColor kButtonBorderHoveredColor = SkColorSetRGB(0x9D, 0x9D, 0x9D);
-const SkColor kButtonBorderDisabledColor = SkColorSetRGB(0xC5, 0xC5, 0xC5);
 
 const SkScalar kSliderTrackRadius = 40.f;
-const SkColor kSliderTrackColor = SkColorSetRGB(0xCE, 0xCE, 0xCE);
-const SkColor kSliderTrackHoveredColor = SkColorSetRGB(0x9D, 0x9D, 0x9D);
-const SkColor kSliderTrackActiveColor = SkColorSetRGB(0xB5, 0xB5, 0xB5);
-const SkColor kSliderTrackDisabledColor = SkColorSetRGB(0xC5, 0xC5, 0xC5);
-const SkColor kSliderTrackValueColor = SkColorSetRGB(0x10, 0x10, 0x10);
 
 const int kSliderThumbWidth = 21;
 const int kSliderThumbHeight = 21;
-const SkColor kSliderThumbBackgroundColor = SkColorSetRGB(0xFF, 0xFF, 0xFF);
-const SkColor kSliderThumbBorderColor = SkColorSetRGB(0x10, 0x10, 0x10);
-const SkColor kSliderThumbBorderDisabledColor = SkColorSetRGB(0xC5, 0xC5, 0xC5);
 const SkScalar kSliderThumbBorderWidth = 2.f;
 const SkScalar kSliderThumbBorderHoveredWidth = 4.f;
 
 const SkScalar kMenuListArrowStrokeWidth = 1.f;
 
+// The "dash" is 8x2 px by default (the checkbox is 13x13 px).
+const SkScalar kIndeterminateInsetWidthRatio = (13 - 8) / 2.0f / 13;
+const SkScalar kIndeterminateInsetHeightRatio = (13 - 2) / 2.0f / 13;
 }  // namespace
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -150,23 +124,89 @@
 
 SkColor NativeThemeAura::GetSystemColor(ColorId color_id,
                                         ColorScheme color_scheme) const {
-  if (UsesHighContrastColors() && features::IsFormControlsRefreshEnabled() &&
-      !system_colors_.empty()) {
+  return GetAuraColor(color_id, this, color_scheme);
+}
+
+SkColor NativeThemeAura::GetControlColor(ControlColorId color_id,
+                                         ColorScheme color_scheme) const {
+  if (UsesHighContrastColors())
+    return GetHighContrastControlColor(color_id, color_scheme);
+
+  switch (color_id) {
+    case kBorder:
+      return SkColorSetRGB(0x76, 0x76, 0x76);
+    case kHoveredBorder:
+      return SkColorSetRGB(0x4F, 0x4F, 0x4F);
+    case kDisabledBorder:
+      return SkColorSetARGB(0x4D, 0x76, 0x76, 0x76);
+    case kAccent:
+      return SkColorSetRGB(0x00, 0x75, 0xFF);
+    case kHoveredAccent:
+      return SkColorSetRGB(0x00, 0x5C, 0xC8);
+    case kDisabledAccent:
+      return SkColorSetARGB(0x4D, 0x76, 0x76, 0x76);
+    case kBackground:
+      return SK_ColorWHITE;
+    case kDisabledBackground:
+      return SkColorSetA(SK_ColorWHITE, 0x99);
+    case kFill:
+      return SkColorSetRGB(0xEF, 0xEF, 0xEF);
+    case kHoveredFill:
+      return SkColorSetRGB(0xE5, 0xE5, 0xE5);
+    case kDisabledFill:
+      return SkColorSetARGB(0x4D, 0xEF, 0xEF, 0xEF);
+    case kLightenLayer:
+      return SkColorSetARGB(0x33, 0xA9, 0xA9, 0xA9);
+  }
+  NOTREACHED();
+  return gfx::kPlaceholderColor;
+}
+
+SkColor NativeThemeAura::GetHighContrastControlColor(
+    ControlColorId color_id,
+    ColorScheme color_scheme) const {
+  if (!system_colors_.empty()) {
     switch (color_id) {
-      case kColorId_ButtonDisabledColor:
+      case kDisabledBorder:
+      case kDisabledAccent:
         return system_colors_[SystemThemeColor::kGrayText];
-      case kColorId_ButtonEnabledColor:
+      case kBorder:
+      case kHoveredBorder:
         return system_colors_[SystemThemeColor::kButtonText];
-      case kColorId_MenuBackgroundColor:
+      case kAccent:
+      case kHoveredAccent:
         return system_colors_[SystemThemeColor::kHighlight];
-      case kColorId_WindowBackground:
+      case kBackground:
+      case kDisabledBackground:
+      case kFill:
+      case kHoveredFill:
+      case kDisabledFill:
+      case kLightenLayer:
         return system_colors_[SystemThemeColor::kWindow];
-      default:
-        break;
+    }
+  } else {
+    // Default high contrast colors (used in web test mode)
+    switch (color_id) {
+      case kDisabledBorder:
+      case kDisabledAccent:
+        return SK_ColorGREEN;
+      case kBorder:
+      case kHoveredBorder:
+        return SK_ColorWHITE;
+      case kAccent:
+      case kHoveredAccent:
+        return SK_ColorCYAN;
+      case kBackground:
+      case kDisabledBackground:
+      case kFill:
+      case kHoveredFill:
+      case kDisabledFill:
+      case kLightenLayer:
+        return SK_ColorBLACK;
     }
   }
-
-  return GetAuraColor(color_id, this, color_scheme);
+  NOTREACHED();
+  return gfx::kPlaceholderColor;
 }
 
 void NativeThemeAura::PaintMenuPopupBackground(
@@ -403,6 +443,64 @@
   canvas->drawIRect(RectToSkIRect(rect), flags);
 }
 
+SkColor NativeThemeAura::ControlsAccentColorForState(
+    State state,
+    ColorScheme color_scheme) const {
+  ControlColorId color_id;
+  if (state == kHovered) {
+    color_id = kHoveredAccent;
+  } else if (state == kPressed) {
+    color_id = kHoveredAccent;
+  } else if (state == kDisabled) {
+    color_id = kDisabledAccent;
+  } else {
+    color_id = kAccent;
+  }
+  return GetControlColor(color_id, color_scheme);
+}
+
+SkColor NativeThemeAura::ControlsBorderColorForState(
+    State state,
+    ColorScheme color_scheme) const {
+  ControlColorId color_id;
+  if (state == kHovered) {
+    color_id = kHoveredBorder;
+  } else if (state == kDisabled) {
+    color_id = kDisabledBorder;
+  } else {
+    color_id = kBorder;
+  }
+  return GetControlColor(color_id, color_scheme);
+}
+
+SkColor NativeThemeAura::ControlsFillColorForState(
+    State state,
+    ColorScheme color_scheme) const {
+  ControlColorId color_id;
+  if (state == kHovered) {
+    color_id = kHoveredFill;
+  } else if (state == kPressed) {
+    color_id = kHoveredFill;
+  } else if (state == kDisabled) {
+    color_id = kDisabledFill;
+  } else {
+    color_id = kFill;
+  }
+  return GetControlColor(color_id, color_scheme);
+}
+
+SkColor NativeThemeAura::ControlsBackgroundColorForState(
+    State state,
+    ColorScheme color_scheme) const {
+  ControlColorId color_id;
+  if (state == kDisabled) {
+    color_id = kDisabledBackground;
+  } else {
+    color_id = kBackground;
+  }
+  return GetControlColor(color_id, color_scheme);
+}
+
 void NativeThemeAura::PaintCheckbox(cc::PaintCanvas* canvas,
                                     State state,
                                     const gfx::Rect& rect,
@@ -413,34 +511,31 @@
                                           color_scheme);
   }
 
-  SkRect skrect = PaintCheckboxRadioCommon(
-      canvas, state, rect, SkIntToScalar(kCheckboxBorderRadius), color_scheme);
+  SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect, button, true,
+                                           SkIntToScalar(kCheckboxBorderRadius),
+                                           color_scheme);
 
   if (!skrect.isEmpty()) {
-    // Draw the checkmark / dash.
     cc::PaintFlags flags;
     flags.setAntiAlias(true);
 
-    if (UsesHighContrastColors()) {
-      ColorId color_id = (state == kDisabled)
-                             ? NativeTheme::kColorId_ButtonDisabledColor
-                             : NativeTheme::kColorId_ButtonEnabledColor;
-      flags.setColor(GetSystemColor(color_id, color_scheme));
-    } else {
-      if (state == kDisabled) {
-        flags.setColor(kCheckboxAndRadioStrokeDisabledColor);
-      } else {
-        flags.setColor(kCheckboxAndRadioStrokeColor);
-      }
-    }
-
     if (button.indeterminate) {
+      // Draw the dash.
+      flags.setColor(ControlsBorderColorForState(state, color_scheme));
       const auto indeterminate =
-          skrect.makeInset(skrect.width() * 0.2, skrect.height() * 0.2);
+          skrect.makeInset(skrect.width() * kIndeterminateInsetWidthRatio,
+                           skrect.height() * kIndeterminateInsetHeightRatio);
       flags.setStyle(cc::PaintFlags::kFill_Style);
       canvas->drawRoundRect(indeterminate, SkIntToScalar(kCheckboxBorderRadius),
                             SkIntToScalar(kCheckboxBorderRadius), flags);
     } else if (button.checked) {
+      // Draw the accent background.
+      flags.setStyle(cc::PaintFlags::kFill_Style);
+      flags.setColor(ControlsAccentColorForState(state, color_scheme));
+      canvas->drawRoundRect(skrect, kCheckboxBorderRadius,
+                            kCheckboxBorderRadius, flags);
+
+      // Draw the checkmark.
       SkPath check;
       check.moveTo(skrect.x() + skrect.width() * 0.2, skrect.centerY());
       check.rLineTo(skrect.width() * 0.2, skrect.height() * 0.2);
@@ -448,6 +543,9 @@
                    skrect.y() + skrect.height() * 0.2);
       flags.setStyle(cc::PaintFlags::kStroke_Style);
       flags.setStrokeWidth(SkFloatToScalar(skrect.height() * 0.16));
+      SkColor checkmark_color =
+          ControlsBackgroundColorForState(state, color_scheme);
+      flags.setColor(checkmark_color);
       canvas->drawPath(check, flags);
     }
   }
@@ -468,26 +566,14 @@
   const SkScalar radius = SkFloatToScalar(
       static_cast<float>(std::max(rect.width(), rect.height())) * 0.5);
 
-  SkRect skrect =
-      PaintCheckboxRadioCommon(canvas, state, rect, radius, color_scheme);
+  SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect, button, false,
+                                           radius, color_scheme);
   if (!skrect.isEmpty() && button.checked) {
     // Draw the dot.
     cc::PaintFlags flags;
     flags.setAntiAlias(true);
     flags.setStyle(cc::PaintFlags::kFill_Style);
-
-    if (UsesHighContrastColors()) {
-      ColorId color_id = (state == kDisabled)
-                             ? NativeTheme::kColorId_ButtonDisabledColor
-                             : NativeTheme::kColorId_ButtonEnabledColor;
-      flags.setColor(GetSystemColor(color_id, color_scheme));
-    } else {
-      if (state == kDisabled) {
-        flags.setColor(kCheckboxAndRadioStrokeDisabledColor);
-      } else {
-        flags.setColor(kCheckboxAndRadioStrokeColor);
-      }
-    }
+    flags.setColor(ControlsAccentColorForState(state, color_scheme));
 
     skrect.inset(skrect.width() * 0.2, skrect.height() * 0.2);
     // Use drawRoundedRect instead of drawOval to be completely consistent
@@ -503,6 +589,8 @@
     cc::PaintCanvas* canvas,
     State state,
     const gfx::Rect& rect,
+    const ButtonExtraParams& button,
+    bool is_checkbox,
     const SkScalar borderRadius,
     ColorScheme color_scheme) const {
   SkRect skrect = gfx::RectToSkRect(rect);
@@ -520,14 +608,7 @@
   // or underflow.
   if (skrect.width() <= 2) {
     cc::PaintFlags flags;
-
-    if (UsesHighContrastColors()) {
-      flags.setColor(GetSystemColor(NativeTheme::kColorId_ButtonEnabledColor,
-                                    color_scheme));
-    } else {
-      flags.setColor(kCheckboxAndRadioTinyColor);
-    }
-
+    flags.setColor(GetControlColor(kBorder, color_scheme));
     flags.setStyle(cc::PaintFlags::kFill_Style);
     canvas->drawRect(skrect, flags);
     // Too small to draw anything more.
@@ -540,38 +621,30 @@
   const SkScalar borderWidth = SkIntToScalar(kCheckboxAndRadioBorderWidth);
 
   // Paint the background (is not visible behind the rounded corners).
-  skrect.inset(borderWidth / 2, borderWidth / 2);
-
-  if (UsesHighContrastColors()) {
-    flags.setColor(
-        GetSystemColor(NativeTheme::kColorId_WindowBackground, color_scheme));
-  } else {
-    flags.setColor(kCkeckboxAndRadioBackgroundColor);
-  }
-
+  // Note we need to shrink the rect for background a little bit so we don't see
+  // artifacts introduced by antialiasing between the border and the background
+  // near the rounded corners of checkbox.
+  const auto background_rect =
+      skrect.makeInset(borderWidth * 0.2f, borderWidth * 0.2f);
+  PaintLightenLayer(canvas, background_rect, state, borderRadius, color_scheme);
+  flags.setColor(ControlsBackgroundColorForState(state, color_scheme));
   flags.setStyle(cc::PaintFlags::kFill_Style);
-  canvas->drawRoundRect(skrect, borderRadius, borderRadius, flags);
+  canvas->drawRoundRect(background_rect, borderRadius, borderRadius, flags);
 
   // Draw the border.
-  if (UsesHighContrastColors()) {
-    ColorId color_id = (state == kDisabled)
-                           ? NativeTheme::kColorId_ButtonDisabledColor
-                           : NativeTheme::kColorId_ButtonEnabledColor;
-    flags.setColor(GetSystemColor(color_id, color_scheme));
-  } else {
-    if (state == kHovered) {
-      flags.setColor(kCheckboxAndRadioBorderHoveredColor);
-    } else if (state == kDisabled) {
-      flags.setColor(kCheckboxAndRadioBorderDisabledColor);
-    } else {
-      flags.setColor(kCheckboxAndRadioBorderColor);
-    }
+  if (!(is_checkbox && button.checked)) {
+    // Shrink half border width so the final pixels of the border will be within
+    // the rectangle.
+    const auto border_rect = skrect.makeInset(borderWidth / 2, borderWidth / 2);
+    SkColor border_color =
+        button.checked ? ControlsAccentColorForState(state, color_scheme)
+                       : ControlsBorderColorForState(state, color_scheme);
+    flags.setColor(border_color);
+    flags.setStyle(cc::PaintFlags::kStroke_Style);
+    flags.setStrokeWidth(borderWidth);
+    canvas->drawRoundRect(border_rect, borderRadius, borderRadius, flags);
   }
 
-  flags.setStyle(cc::PaintFlags::kStroke_Style);
-  flags.setStrokeWidth(borderWidth);
-  canvas->drawRoundRect(skrect, borderRadius, borderRadius, flags);
-
   // Return the rectangle for drawing any additional decorations.
   return skrect;
 }
@@ -588,35 +661,40 @@
 
   SkRect bounds = gfx::RectToSkRect(rect);
   const SkScalar borderWidth = SkIntToScalar(kInputBorderWidth);
+  const SkScalar borderRadius = SkIntToScalar(kInputBorderRadius);
 
   // Paint the background (is not visible behind the rounded corners).
   bounds.inset(borderWidth / 2, borderWidth / 2);
   cc::PaintFlags fill_flags;
   fill_flags.setStyle(cc::PaintFlags::kFill_Style);
-  fill_flags.setColor(text.background_color);
-  canvas->drawRoundRect(bounds, SkIntToScalar(kInputBorderRadius),
-                        SkIntToScalar(kInputBorderRadius), fill_flags);
+  if (text.background_color != 0) {
+    PaintLightenLayer(canvas, bounds, state, borderRadius, color_scheme);
+    fill_flags.setColor(ControlsBackgroundColorForState(state, color_scheme));
+    canvas->drawRoundRect(bounds, borderRadius, borderRadius, fill_flags);
+  }
 
   // Paint the border: 1px solid.
   cc::PaintFlags stroke_flags;
-  if (UsesHighContrastColors()) {
-    ColorId color_id = (state == kDisabled)
-                           ? NativeTheme::kColorId_ButtonDisabledColor
-                           : NativeTheme::kColorId_ButtonEnabledColor;
-    stroke_flags.setColor(GetSystemColor(color_id, color_scheme));
-  } else {
-    if (state == kHovered) {
-      stroke_flags.setColor(kInputBorderHoveredColor);
-    } else if (state == kDisabled) {
-      stroke_flags.setColor(kInputBorderDisabledColor);
-    } else {
-      stroke_flags.setColor(kInputBorderColor);
-    }
-  }
+  stroke_flags.setColor(ControlsBorderColorForState(state, color_scheme));
   stroke_flags.setStyle(cc::PaintFlags::kStroke_Style);
   stroke_flags.setStrokeWidth(borderWidth);
-  canvas->drawRoundRect(bounds, SkIntToScalar(kInputBorderRadius),
-                        SkIntToScalar(kInputBorderRadius), stroke_flags);
+  canvas->drawRoundRect(bounds, borderRadius, borderRadius, stroke_flags);
+}
+
+void NativeThemeAura::PaintLightenLayer(cc::PaintCanvas* canvas,
+                                        SkRect skrect,
+                                        State state,
+                                        SkScalar border_radius,
+                                        ColorScheme color_scheme) const {
+  if (state == kDisabled) {
+    cc::PaintFlags flags;
+    flags.setAntiAlias(true);
+    flags.setStyle(cc::PaintFlags::kFill_Style);
+    // Draw the lighten layer to lighten the background so the translucent
+    // disabled color works regardless of what it's over.
+    flags.setColor(GetControlColor(kLightenLayer, color_scheme));
+    canvas->drawRoundRect(skrect, border_radius, border_radius, flags);
+  }
 }
 
 void NativeThemeAura::PaintButton(cc::PaintCanvas* canvas,
@@ -632,56 +710,28 @@
   cc::PaintFlags flags;
   SkRect skrect = gfx::RectToSkRect(rect);
 
-  SkColor background_color;
-  if (UsesHighContrastColors()) {
-    background_color =
-        GetSystemColor(NativeTheme::kColorId_WindowBackground, color_scheme);
-  } else {
-    if (state == kHovered) {
-      background_color = kButtonBackgroundHoveredColor;
-    } else if (state == kDisabled) {
-      background_color = kButtonBackgroundDisabledColor;
-    } else {
-      background_color = kButtonBackgroundColor;
-    }
-  }
-
   flags.setAntiAlias(true);
   flags.setStyle(cc::PaintFlags::kFill_Style);
-  flags.setColor(background_color);
 
   // If the button is too small, fallback to drawing a single, solid color.
   if (rect.width() < 5 || rect.height() < 5) {
+    flags.setColor(ControlsFillColorForState(state, color_scheme));
     canvas->drawRect(skrect, flags);
     return;
   }
 
   // Paint the background (is not visible behind the rounded corners).
   skrect.inset(kButtonBorderWidth / 2, kButtonBorderWidth / 2);
+  PaintLightenLayer(canvas, skrect, state, kButtonBorderRadius, color_scheme);
+  flags.setColor(ControlsFillColorForState(state, color_scheme));
   canvas->drawRoundRect(skrect, kButtonBorderRadius, kButtonBorderRadius,
                         flags);
 
   // Paint the border: 1px solid.
   if (button.has_border) {
-    SkColor border_color;
-    if (UsesHighContrastColors()) {
-      ColorId color_id = (state == kDisabled)
-                             ? NativeTheme::kColorId_ButtonDisabledColor
-                             : NativeTheme::kColorId_ButtonEnabledColor;
-      border_color = GetSystemColor(color_id, color_scheme);
-    } else {
-      if (state == kHovered) {
-        border_color = kButtonBorderHoveredColor;
-      } else if (state == kDisabled) {
-        border_color = kButtonBorderDisabledColor;
-      } else {
-        border_color = kButtonBorderColor;
-      }
-    }
-
     flags.setStyle(cc::PaintFlags::kStroke_Style);
     flags.setStrokeWidth(kButtonBorderWidth);
-    flags.setColor(border_color);
+    flags.setColor(ControlsBorderColorForState(state, color_scheme));
     canvas->drawRoundRect(skrect, kButtonBorderRadius, kButtonBorderRadius,
                           flags);
   }
@@ -725,44 +775,16 @@
   // Paint the entire slider track.
   cc::PaintFlags flags;
   flags.setAntiAlias(true);
-  if (UsesHighContrastColors()) {
-    ColorId color_id = (state == kDisabled)
-                           ? NativeTheme::kColorId_ButtonDisabledColor
-                           : NativeTheme::kColorId_ButtonEnabledColor;
-    flags.setColor(GetSystemColor(color_id, color_scheme));
-  } else {
-    switch (state) {
-      case kHovered:
-        flags.setColor(kSliderTrackHoveredColor);
-        break;
-      case kDisabled:
-        flags.setColor(kSliderTrackDisabledColor);
-        break;
-      case kPressed:
-        flags.setColor(kSliderTrackActiveColor);
-        break;
-      default:
-        flags.setColor(kSliderTrackColor);
-        break;
-    }
-  }
-
+  flags.setColor(GetControlColor(kFill, color_scheme));
   SkRect track_rect = AlignSliderTrack(rect, slider, false);
   canvas->drawRoundRect(track_rect, kSliderTrackRadius, kSliderTrackRadius,
                         flags);
 
   // Paint the value slider track.
-  if (state != kDisabled) {
-    if (UsesHighContrastColors()) {
-      flags.setColor(GetSystemColor(NativeTheme::kColorId_MenuBackgroundColor,
-                                    color_scheme));
-    } else {
-      flags.setColor(kSliderTrackValueColor);
-    }
-    SkRect value_rect = AlignSliderTrack(rect, slider, true);
-    canvas->drawRoundRect(value_rect, kSliderTrackRadius, kSliderTrackRadius,
-                          flags);
-  }
+  flags.setColor(ControlsAccentColorForState(state, color_scheme));
+  SkRect value_rect = AlignSliderTrack(rect, slider, true);
+  canvas->drawRoundRect(value_rect, kSliderTrackRadius, kSliderTrackRadius,
+                        flags);
 }
 
 void NativeThemeAura::PaintSliderThumb(cc::PaintCanvas* canvas,
@@ -788,25 +810,12 @@
 
   // Paint the background (is not visible behind the rounded corners).
   thumb_rect.inset(border_width / 2, border_width / 2);
-  if (UsesHighContrastColors()) {
-    flags.setColor(
-        GetSystemColor(NativeTheme::kColorId_WindowBackground, color_scheme));
-  } else {
-    flags.setColor(kSliderThumbBackgroundColor);
-  }
+  flags.setColor(GetControlColor(kFill, color_scheme));
   flags.setStyle(cc::PaintFlags::kFill_Style);
   canvas->drawRoundRect(thumb_rect, radius, radius, flags);
 
   // Paint the border.
-  if (UsesHighContrastColors()) {
-    ColorId color_id = (state == kDisabled)
-                           ? NativeTheme::kColorId_ButtonDisabledColor
-                           : NativeTheme::kColorId_MenuBackgroundColor;
-    flags.setColor(GetSystemColor(color_id, color_scheme));
-  } else {
-    flags.setColor(state == kDisabled ? kSliderThumbBorderDisabledColor
-                                      : kSliderThumbBorderColor);
-  }
+  flags.setColor(ControlsBorderColorForState(state, color_scheme));
   flags.setStyle(cc::PaintFlags::kStroke_Style);
   flags.setStrokeWidth(border_width);
   canvas->drawRoundRect(thumb_rect, radius, radius, flags);
diff --git a/ui/native_theme/native_theme_aura.h b/ui/native_theme/native_theme_aura.h
index 7c1265a..2e8b80f 100644
--- a/ui/native_theme/native_theme_aura.h
+++ b/ui/native_theme/native_theme_aura.h
@@ -18,12 +18,46 @@
   friend class NativeThemeAuraTest;
   friend class base::NoDestructor<NativeThemeAura>;
 
+  // Colors for form controls refresh.
+  enum ControlColorId {
+    kBorder,
+    kDisabledBorder,
+    kHoveredBorder,
+    kAccent,
+    kDisabledAccent,
+    kHoveredAccent,
+    kBackground,
+    kDisabledBackground,
+    kFill,
+    kDisabledFill,
+    kHoveredFill,
+    kLightenLayer
+  };
+
   explicit NativeThemeAura(bool use_overlay_scrollbars);
   ~NativeThemeAura() override;
 
   static NativeThemeAura* instance();
   static NativeThemeAura* web_instance();
 
+  void PaintLightenLayer(cc::PaintCanvas* canvas,
+                         SkRect skrect,
+                         State state,
+                         SkScalar border_radius,
+                         ColorScheme color_scheme) const;
+  SkColor ControlsAccentColorForState(State state,
+                                      ColorScheme color_scheme) const;
+  SkColor ControlsBorderColorForState(State state,
+                                      ColorScheme color_scheme) const;
+  SkColor ControlsFillColorForState(State state,
+                                    ColorScheme color_scheme) const;
+  SkColor ControlsBackgroundColorForState(State state,
+                                          ColorScheme color_scheme) const;
+  SkColor GetHighContrastControlColor(ControlColorId color_id,
+                                      ColorScheme color_scheme) const;
+  SkColor GetControlColor(ControlColorId color_id,
+                          ColorScheme color_scheme) const;
+
   // NativeThemeBase:
   SkColor GetSystemColor(ColorId color_id,
                          ColorScheme color_scheme) const override;
@@ -107,6 +141,8 @@
   SkRect PaintCheckboxRadioCommon(cc::PaintCanvas* canvas,
                                   State state,
                                   const gfx::Rect& rect,
+                                  const ButtonExtraParams& button,
+                                  bool is_checkbox,
                                   const SkScalar borderRadius,
                                   ColorScheme color_scheme) const;
 
diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc
index 0b338f9a..e9ed7c7 100644
--- a/ui/native_theme/native_theme_base.cc
+++ b/ui/native_theme/native_theme_base.cc
@@ -521,7 +521,7 @@
                                     const gfx::Rect& rect,
                                     const ButtonExtraParams& button,
                                     ColorScheme color_scheme) const {
-  SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect,
+  SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect, button, true,
                                            SkIntToScalar(2), color_scheme);
   if (!skrect.isEmpty()) {
     // Draw the checkmark / dash.
@@ -559,6 +559,8 @@
     cc::PaintCanvas* canvas,
     State state,
     const gfx::Rect& rect,
+    const ButtonExtraParams& button,
+    bool is_checkbox,
     const SkScalar borderRadius,
     ColorScheme color_scheme) const {
   SkRect skrect = gfx::RectToSkRect(rect);
@@ -651,8 +653,8 @@
   // square is a circle (i.e. border radius >= 100%).
   const SkScalar radius = SkFloatToScalar(
       static_cast<float>(std::max(rect.width(), rect.height())) / 2);
-  SkRect skrect =
-      PaintCheckboxRadioCommon(canvas, state, rect, radius, color_scheme);
+  SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect, button, false,
+                                           radius, color_scheme);
   if (!skrect.isEmpty() && button.checked) {
     // Draw the dot.
     cc::PaintFlags flags;
diff --git a/ui/native_theme/native_theme_base.h b/ui/native_theme/native_theme_base.h
index 01587b92..f6bb2fc 100644
--- a/ui/native_theme/native_theme_base.h
+++ b/ui/native_theme/native_theme_base.h
@@ -205,6 +205,8 @@
   SkRect PaintCheckboxRadioCommon(cc::PaintCanvas* canvas,
                                   State state,
                                   const gfx::Rect& rect,
+                                  const ButtonExtraParams& button,
+                                  bool is_checkbox,
                                   const SkScalar borderRadius,
                                   ColorScheme color_scheme) const;
 
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb
index 92319ade..86154cbe 100644
--- a/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -225,7 +225,7 @@
 <translation id="8806053966018712535">Folder <ph name="FOLDER_NAME" /></translation>
 <translation id="883911313571074303">Annotate image</translation>
 <translation id="8841375032071747811">Back button</translation>
-<translation id="8867568208303837180">sending ...</translation>
+<translation id="8867568208303837180">Sending...</translation>
 <translation id="8876215549894133151">Format:</translation>
 <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation>
 <translation id="8926951137623668982">Shelf always hidden</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb
index 36d0d61..67d6cb4 100644
--- a/ui/strings/translations/ui_strings_fil.xtb
+++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -113,6 +113,7 @@
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 buwan ang natitira}one{# buwan ang natitira}other{# na buwan ang natitira}}</translation>
 <translation id="4841881773802181781">Paglagay</translation>
 <translation id="4881695831933465202">Buksan</translation>
+<translation id="4888938634149558681">Tumawag</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}one{# segundo}other{# na segundo}}</translation>
 <translation id="4971687151119236543">Nakaraang Track ng Media</translation>
 <translation id="5046499563572181734">Mag-tap dito</translation>
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb
index 154c939..a5f1f0c1 100644
--- a/ui/strings/translations/ui_strings_hi.xtb
+++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -113,6 +113,7 @@
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 माह शेष}one{# माह शेष}other{# माह शेष}}</translation>
 <translation id="4841881773802181781">डालना</translation>
 <translation id="4881695831933465202">खोलें</translation>
+<translation id="4888938634149558681">कॉल करें</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}</translation>
 <translation id="4971687151119236543">मीडिया पिछला ट्रैक</translation>
 <translation id="5046499563572181734">यहां टैप करें</translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb
index 5efdff8..90c67b5 100644
--- a/ui/strings/translations/ui_strings_ko.xtb
+++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -113,6 +113,7 @@
 <translation id="4788285488841504513">{MONTHS,plural, =1{1개월 남음}other{#개월 남음}}</translation>
 <translation id="4841881773802181781">삽입</translation>
 <translation id="4881695831933465202">열기</translation>
+<translation id="4888938634149558681">전화 걸기</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1초}other{#초}}</translation>
 <translation id="4971687151119236543">미디어 이전 트랙</translation>
 <translation id="5046499563572181734">여기를 탭하세요.</translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb
index 070d4e0..c7a7c8a 100644
--- a/ui/strings/translations/ui_strings_mr.xtb
+++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -8,14 +8,17 @@
 <translation id="1169783199079129864">{MINUTES,plural, =1{1मि}other{#मि}}</translation>
 <translation id="1181037720776840403">काढून टाका</translation>
 <translation id="1243314992276662751">अपलोड करा</translation>
+<translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> शेअर करू शकलो नाही</translation>
 <translation id="1269641567813814718">Win</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" /> फोल्डर <ph name="FOLDER_NAME" /> वर हलवा.</translation>
+<translation id="1291104554099683393">मजकूर लहान भागांमध्ये शेअर करून पाहा.</translation>
 <translation id="1293699935367580298">Esc</translation>
 <translation id="1306549533752902673">शिफारस केलेले अ‍ॅप्स</translation>
 <translation id="1368832886055348810">डावीकडून उजवीकडे</translation>
 <translation id="1383876407941801731">शोधा</translation>
 <translation id="1398853756734560583">वाढवा</translation>
 <translation id="1409544243779336081">ॲप शिफारस</translation>
+<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेअर करू शकत नाही</translation>
 <translation id="1498028757988366001">तुम्ही यापूर्वी याचा शोध घेतला होता. तुमच्या इतिहासामधून "<ph name="QUERY" />" हटवल्याने ती तुमच्या संपूर्ण डिव्हाइसवरील सर्व खात्यामधून कायमची काढून टाकली जाईल.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 मिनिट आणि }other{# मिनिटे आणि }}</translation>
 <translation id="1643823602425662293">सूचना</translation>
@@ -35,6 +38,7 @@
 <translation id="1884435127456172652"><ph name="NUMBER" /> %</translation>
 <translation id="1901303067676059328">&amp;सर्व निवडा</translation>
 <translation id="1938451708255335766">विंडो डिस्प्ले घनता अ‍ॅडजस्ट करण्यासाठी, अ‍ॅप रीस्टार्ट करा.</translation>
+<translation id="2006524834898217237">हे डिव्हाइस इंटरनेटशी कनेक्ट केलेले असल्याची खात्री करा.</translation>
 <translation id="208586643495776849">कृपया पुन्हा प्रयत्न करा</translation>
 <translation id="2141853158323869627">{DAYS,plural, =1{1दि}other{#दि}}</translation>
 <translation id="2148716181193084225">आज</translation>
@@ -76,6 +80,7 @@
 <translation id="3291688615589870984">{DAYS,plural, =1{1 दिवस}other{# दिवस}}</translation>
 <translation id="3295886253693811851">यावरून कॉल करा</translation>
 <translation id="335581015389089642">भाषण</translation>
+<translation id="3389286852084373014">मजकूर खूप मोठा आहे</translation>
 <translation id="3443810440409579745">टॅब मिळाला.</translation>
 <translation id="3479552764303398839">सध्या नाही</translation>
 <translation id="348799646910989694">शेल्फ आपोआप लपवले</translation>
@@ -151,11 +156,13 @@
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 सेकंदापूर्वी}other{# सेकंदांपूर्वी}}</translation>
 <translation id="6430678249303439055">या अ‍ॅपच्या सर्व सूचना ब्‍लॉक करा</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 सेकंदापूर्वी}other{# सेकंदांपूर्वी}}</translation>
+<translation id="6539092367496845964">काहीतरी चूक झाली. पुन्हा प्रयत्न करा.</translation>
 <translation id="654149438358937226">सर्व सूचना ब्लॉक करा</translation>
 <translation id="6567071839949112727">पूर्वजवर क्लिक करा</translation>
 <translation id="6578407462441924264">नाव नसलेले</translation>
 <translation id="6612467943526193239">कॅलिब्रेशनमधून बाहेर पडण्‍यासाठी Esc दाबा.</translation>
 <translation id="6620110761915583480">फाइल सेव्ह करा</translation>
+<translation id="6656912866303152668">Chrome मध्ये <ph name="TARGET_DEVICE_NAME" /> चे सिंक सुरू केले असल्याची खात्री करा आणि त्यानंतर पाठवण्याचा पुन्हा प्रयत्न करा.</translation>
 <translation id="6699343763173986273">मीडिया पुढील ट्रॅक</translation>
 <translation id="673773751041746814">हटवणे</translation>
 <translation id="6779314412797872738">येथून तुमच्या Android फोनवर नंबर पाठवण्यासाठी, सेटिंग्जमध्ये दोन्ही डिव्हाइससाठी <ph name="TROUBLESHOOT_LINK" />.</translation>
@@ -221,6 +228,7 @@
 <translation id="8876215549894133151">स्वरूप:</translation>
 <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation>
 <translation id="8926951137623668982">शेल्फ नेहमी लपवलेले आहे</translation>
+<translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" />इंटरनेटशी कनेक्ट केलेली असल्याची खात्री करा.</translation>
 <translation id="9002566407876343676">उघडा</translation>
 <translation id="9039076430527029379">पेज <ph name="PAGE_NUMBER" />, पंक्ती <ph name="ROW_NUMBER" />, स्तंभ <ph name="COLUMN_NUMBER" /> वर हलवा.</translation>
 <translation id="9044832324875206639">{SECONDS,plural, =1{1 से}other{# से}}</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb
index 6df6922..9c18310 100644
--- a/ui/strings/translations/ui_strings_ta.xtb
+++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -11,7 +11,7 @@
 <translation id="1266864766717917324"><ph name="CONTENT_TYPE" />ஐப் பகிர முடியவில்லை</translation>
 <translation id="1269641567813814718">Win</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" />ஐ <ph name="FOLDER_NAME" /> கோப்புறைக்கு நகர்த்தும்.</translation>
-<translation id="1291104554099683393">சிறுசிறு பகுதியாக உரையைப் பகிர முயலவும்.</translation>
+<translation id="1291104554099683393">சிறுசிறு பகுதிகளாக உரையைப் பகிர முயலவும்.</translation>
 <translation id="1293699935367580298">Esc</translation>
 <translation id="1306549533752902673">பரிந்துரைக்கப்படும் பயன்பாடுகள்</translation>
 <translation id="1368832886055348810">இடமிருந்து வலம்</translation>
diff --git a/ui/views/examples/box_layout_example.cc b/ui/views/examples/box_layout_example.cc
index 40fac8e..61c39340 100644
--- a/ui/views/examples/box_layout_example.cc
+++ b/ui/views/examples/box_layout_example.cc
@@ -52,7 +52,7 @@
   min_cross_axis_size_ =
       CreateTextfield(base::ASCIIToUTF16("Min cross axis"), &vertical_pos);
 
-  CreateMarginsTextFields(base::ASCIIToUTF16("Insets"), border_insets_,
+  CreateMarginsTextFields(base::ASCIIToUTF16("Insets"), &border_insets_,
                           &vertical_pos);
 
   collapse_margins_ =
@@ -93,8 +93,10 @@
     int min_cross_size;
     base::StringToInt(min_cross_axis_size_->GetText(), &min_cross_size);
     layout_->set_minimum_cross_axis_size(min_cross_size);
-  } else if (textfield == border_insets_[0] || textfield == border_insets_[1] ||
-             textfield == border_insets_[2] || textfield == border_insets_[3]) {
+  } else if (textfield == border_insets_.left ||
+             textfield == border_insets_.top ||
+             textfield == border_insets_.right ||
+             textfield == border_insets_.bottom) {
     UpdateBorderInsets();
   }
   RefreshLayoutPanel(false);
diff --git a/ui/views/examples/box_layout_example.h b/ui/views/examples/box_layout_example.h
index e8a9d83a..54cc9bb 100644
--- a/ui/views/examples/box_layout_example.h
+++ b/ui/views/examples/box_layout_example.h
@@ -47,7 +47,7 @@
   Textfield* between_child_spacing_ = nullptr;
   Textfield* default_flex_ = nullptr;
   Textfield* min_cross_axis_size_ = nullptr;
-  Textfield* border_insets_[4] = {nullptr, nullptr, nullptr, nullptr};
+  InsetTextfields border_insets_;
   Checkbox* collapse_margins_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(BoxLayoutExample);
diff --git a/ui/views/examples/flex_layout_example.cc b/ui/views/examples/flex_layout_example.cc
index 7027dc1..27e9b5e 100644
--- a/ui/views/examples/flex_layout_example.cc
+++ b/ui/views/examples/flex_layout_example.cc
@@ -46,10 +46,10 @@
                                          cross_axis_values, 4, &vertical_pos);
 
   CreateMarginsTextFields(base::ASCIIToUTF16("Interior margin"),
-                          interior_margin_, &vertical_pos);
+                          &interior_margin_, &vertical_pos);
 
   CreateMarginsTextFields(base::ASCIIToUTF16("Default margins"),
-                          default_child_margins_, &vertical_pos);
+                          &default_child_margins_, &vertical_pos);
 
   collapse_margins_ =
       CreateCheckbox(base::ASCIIToUTF16("Collapse margins"), &vertical_pos);
diff --git a/ui/views/examples/flex_layout_example.h b/ui/views/examples/flex_layout_example.h
index de012a2..58390ca 100644
--- a/ui/views/examples/flex_layout_example.h
+++ b/ui/views/examples/flex_layout_example.h
@@ -46,8 +46,8 @@
   Combobox* main_axis_alignment_ = nullptr;
   Combobox* cross_axis_alignment_ = nullptr;
   Checkbox* collapse_margins_ = nullptr;
-  Textfield* interior_margin_[4] = {nullptr, nullptr, nullptr, nullptr};
-  Textfield* default_child_margins_[4] = {nullptr, nullptr, nullptr, nullptr};
+  InsetTextfields interior_margin_;
+  InsetTextfields default_child_margins_;
 
   DISALLOW_COPY_AND_ASSIGN(FlexLayoutExample);
 };
diff --git a/ui/views/examples/layout_example_base.cc b/ui/views/examples/layout_example_base.cc
index 2655e19..eb25142 100644
--- a/ui/views/examples/layout_example_base.cc
+++ b/ui/views/examples/layout_example_base.cc
@@ -59,22 +59,19 @@
 
 }  // namespace
 
-LayoutExampleBase::ChildPanel::ChildPanel(LayoutExampleBase* example,
-                                          const gfx::Size& preferred_size)
-    : example_(example), preferred_size_(preferred_size) {
+LayoutExampleBase::ChildPanel::ChildPanel(LayoutExampleBase* example)
+    : example_(example) {
   SetBorder(CreateSolidBorder(1, SK_ColorGRAY));
-  for (size_t i = 0; i < base::size(margin_); ++i)
-    margin_[i] = CreateTextfield();
+  margin_.left = CreateTextfield();
+  margin_.top = CreateTextfield();
+  margin_.right = CreateTextfield();
+  margin_.bottom = CreateTextfield();
   flex_ = CreateTextfield();
   flex_->SetText(base::ASCIIToUTF16(""));
 }
 
 LayoutExampleBase::ChildPanel::~ChildPanel() = default;
 
-gfx::Size LayoutExampleBase::ChildPanel::CalculatePreferredSize() const {
-  return preferred_size_;
-}
-
 bool LayoutExampleBase::ChildPanel::OnMousePressed(
     const ui::MouseEvent& event) {
   if (event.IsOnlyLeftMouseButton())
@@ -86,30 +83,16 @@
   const int kSpacing = 2;
   if (selected_) {
     gfx::Rect client = GetContentsBounds();
-    for (size_t i = 0; i < base::size(margin_); ++i) {
-      gfx::Point pos;
-      Textfield* textfield = margin_[i];
-      switch (i) {
-        case 0:
-          pos = gfx::Point((client.width() - textfield->width()) / 2, kSpacing);
-          break;
-        case 1:
-          pos =
-              gfx::Point(kSpacing, (client.height() - textfield->height()) / 2);
-          break;
-        case 2:
-          pos = gfx::Point((client.width() - textfield->width()) / 2,
-                           client.height() - textfield->height() - kSpacing);
-          break;
-        case 3:
-          pos = gfx::Point(client.width() - textfield->width() - kSpacing,
-                           (client.height() - textfield->height()) / 2);
-          break;
-        default:
-          NOTREACHED();
-      }
-      textfield->SetPosition(pos);
-    }
+    margin_.top->SetPosition(
+        gfx::Point((client.width() - margin_.top->width()) / 2, kSpacing));
+    margin_.left->SetPosition(
+        gfx::Point(kSpacing, (client.height() - margin_.left->height()) / 2));
+    margin_.bottom->SetPosition(
+        gfx::Point((client.width() - margin_.bottom->width()) / 2,
+                   client.height() - margin_.bottom->height() - kSpacing));
+    margin_.right->SetPosition(
+        gfx::Point(client.width() - margin_.right->width() - kSpacing,
+                   (client.height() - margin_.right->height()) / 2));
     flex_->SetPosition(gfx::Point((client.width() - flex_->width()) / 2,
                                   (client.height() - flex_->height()) / 2));
   }
@@ -125,8 +108,10 @@
           static_cast<ChildPanel*>(child)->SetSelected(false);
       }
     }
-    for (Textfield* textfield : margin_)
-      textfield->SetVisible(selected_);
+    margin_.left->SetVisible(selected_);
+    margin_.top->SetVisible(selected_);
+    margin_.right->SetVisible(selected_);
+    margin_.bottom->SetVisible(selected_);
     flex_->SetVisible(selected_);
     InvalidateLayout();
     example_->RefreshLayoutPanel(false);
@@ -237,6 +222,25 @@
                   kLayoutExampleVerticalSpacing;
 }
 
+void LayoutExampleBase::CreateMarginsTextFields(
+    const base::string16& label_text,
+    InsetTextfields* textfields,
+    int* vertical_pos) {
+  textfields->top = CreateTextfield(label_text, vertical_pos);
+  int center = textfields->top->x() + textfields->top->width() / 2;
+  int horizontal_pos = std::max(
+      0,
+      center - (textfields->top->width() + kLayoutExampleVerticalSpacing / 2));
+  textfields->left = CreateRawTextfield(*vertical_pos, true, &horizontal_pos);
+  textfields->right = CreateRawTextfield(*vertical_pos, true, &horizontal_pos);
+  *vertical_pos = textfields->left->y() + textfields->left->height() +
+                  kLayoutExampleVerticalSpacing;
+  horizontal_pos = textfields->top->x();
+  textfields->bottom = CreateRawTextfield(*vertical_pos, true, &horizontal_pos);
+  *vertical_pos = textfields->bottom->y() + textfields->bottom->height() +
+                  kLayoutExampleVerticalSpacing;
+}
+
 Checkbox* LayoutExampleBase::CreateCheckbox(const base::string16& label_text,
                                             int* vertical_pos) {
   Checkbox* checkbox = new Checkbox(label_text, this);
@@ -249,14 +253,14 @@
 
 void LayoutExampleBase::CreateExampleView(View* container) {
   container->SetLayoutManager(std::make_unique<FillLayout>());
-  full_panel_ = new FullPanel();
-  container->AddChildView(full_panel_);
+  View* full_panel = new FullPanel();
+  container->AddChildView(full_panel);
 
   layout_panel_ = new View();
   layout_panel_->SetBorder(CreateSolidBorder(1, SK_ColorLTGRAY));
-  full_panel_->AddChildView(layout_panel_);
+  full_panel->AddChildView(layout_panel_);
   control_panel_ = new View();
-  full_panel_->AddChildView(control_panel_);
+  full_panel->AddChildView(control_panel_);
 
   int vertical_pos = kLayoutExampleVerticalSpacing;
   int horizontal_pos = kLayoutExampleLeftPadding;
@@ -266,16 +270,21 @@
   add_button->SizeToPreferredSize();
   add_button_ = control_panel_->AddChildView(std::move(add_button));
   horizontal_pos += add_button_->width() + kLayoutExampleVerticalSpacing;
-  for (size_t i = 0; i < base::size(child_panel_size_); ++i) {
-    child_panel_size_[i] =
-        CreateRawTextfield(vertical_pos, true, &horizontal_pos);
-    child_panel_size_[i]->SetY(
-        vertical_pos +
-        (add_button_->height() - child_panel_size_[i]->height()) / 2);
-  }
-  child_panel_size_[0]->SetText(
+
+  preferred_width_view_ =
+      CreateRawTextfield(vertical_pos, true, &horizontal_pos);
+  preferred_width_view_->SetY(
+      vertical_pos +
+      (add_button_->height() - preferred_width_view_->height()) / 2);
+  preferred_width_view_->SetText(
       base::NumberToString16(kLayoutExampleDefaultChildSize.width()));
-  child_panel_size_[1]->SetText(
+
+  preferred_height_view_ =
+      CreateRawTextfield(vertical_pos, true, &horizontal_pos);
+  preferred_height_view_->SetY(
+      vertical_pos +
+      (add_button_->height() - preferred_height_view_->height()) / 2);
+  preferred_height_view_->SetText(
       base::NumberToString16(kLayoutExampleDefaultChildSize.height()));
 
   CreateAdditionalControls(add_button_->y() + add_button_->height() +
@@ -283,21 +292,14 @@
 }
 
 void LayoutExampleBase::ButtonPressed(Button* sender, const ui::Event& event) {
-  constexpr int kMaxPanels = 5;
   constexpr int kChildPanelGroup = 100;
 
   if (sender == add_button_) {
-    if (panel_count_ < kMaxPanels) {
-      ++panel_count_;
-      ChildPanel* panel = new ChildPanel(
-          this,
-          TextfieldsToSize(child_panel_size_, kLayoutExampleDefaultChildSize));
-      panel->SetGroup(kChildPanelGroup);
-      layout_panel_->AddChildView(panel);
-      RefreshLayoutPanel(false);
-    } else {
-      PrintStatus("Only %i panels may be added", kMaxPanels);
-    }
+    std::unique_ptr<ChildPanel> panel = std::make_unique<ChildPanel>(this);
+    panel->SetPreferredSize(GetNewChildPanelPreferredSize());
+    panel->SetGroup(kChildPanelGroup);
+    layout_panel_->AddChildView(std::move(panel));
+    RefreshLayoutPanel(false);
   } else {
     ButtonPressedImpl(sender);
   }
@@ -313,31 +315,32 @@
   layout_panel_->SchedulePaint();
 }
 
-gfx::Size LayoutExampleBase::TextfieldsToSize(Textfield* textfields[2],
-                                              const gfx::Size& default_size) {
+gfx::Size LayoutExampleBase::GetNewChildPanelPreferredSize() {
   int width;
+  if (!base::StringToInt(preferred_width_view_->GetText(), &width))
+    width = kLayoutExampleDefaultChildSize.width();
+
   int height;
-  if (!base::StringToInt(textfields[0]->GetText(), &width))
-    width = default_size.width();
-  if (!base::StringToInt(textfields[1]->GetText(), &height))
-    height = default_size.height();
+  if (!base::StringToInt(preferred_height_view_->GetText(), &height))
+    height = kLayoutExampleDefaultChildSize.height();
+
   return gfx::Size(std::max(0, width), std::max(0, height));
 }
 
 gfx::Insets LayoutExampleBase::TextfieldsToInsets(
-    Textfield* textfields[4],
+    const InsetTextfields& textfields,
     const gfx::Insets& default_insets) {
   int top;
   int left;
   int bottom;
   int right;
-  if (!base::StringToInt(textfields[0]->GetText(), &top))
+  if (!base::StringToInt(textfields.top->GetText(), &top))
     top = default_insets.top();
-  if (!base::StringToInt(textfields[1]->GetText(), &left))
+  if (!base::StringToInt(textfields.left->GetText(), &left))
     left = default_insets.left();
-  if (!base::StringToInt(textfields[2]->GetText(), &bottom))
+  if (!base::StringToInt(textfields.bottom->GetText(), &bottom))
     bottom = default_insets.bottom();
-  if (!base::StringToInt(textfields[3]->GetText(), &right))
+  if (!base::StringToInt(textfields.right->GetText(), &right))
     right = default_insets.right();
 
   return gfx::Insets(std::max(0, top), std::max(0, left), std::max(0, bottom),
diff --git a/ui/views/examples/layout_example_base.h b/ui/views/examples/layout_example_base.h
index e61d626..a6d1db3 100644
--- a/ui/views/examples/layout_example_base.h
+++ b/ui/views/examples/layout_example_base.h
@@ -26,17 +26,24 @@
                                                 public ComboboxListener,
                                                 public TextfieldController {
  public:
+  // Grouping of multiple textfields that provide insets.
+  struct InsetTextfields {
+    Textfield* left = nullptr;
+    Textfield* top = nullptr;
+    Textfield* right = nullptr;
+    Textfield* bottom = nullptr;
+  };
+
   // This view is created and added to the left-side view in the FullPanel each
   // time the "Add" button is pressed. It also will display Textfield controls
   // when the mouse is pressed over the view. These Textfields allow the user to
   // interactively set each margin and the "flex" for the given view.
   class ChildPanel : public View, public TextfieldController {
    public:
-    ChildPanel(LayoutExampleBase* example, const gfx::Size& preferred_size);
+    explicit ChildPanel(LayoutExampleBase* example);
     ~ChildPanel() override;
 
     // View
-    gfx::Size CalculatePreferredSize() const override;
     bool OnMousePressed(const ui::MouseEvent& event) override;
     void Layout() override;
 
@@ -55,7 +62,7 @@
     LayoutExampleBase* example_;
     bool selected_ = false;
     Textfield* flex_;
-    Textfield* margin_[4];
+    InsetTextfields margin_;
     gfx::Size preferred_size_;
 
     DISALLOW_COPY_AND_ASSIGN(ChildPanel);
@@ -67,11 +74,8 @@
   // Force the box_layout_panel_ to layout and repaint.
   void RefreshLayoutPanel(bool update_layout);
 
-  static gfx::Size TextfieldsToSize(
-      Textfield* textfields[2],
-      const gfx::Size& default_size = gfx::Size());
   static gfx::Insets TextfieldsToInsets(
-      Textfield* textfields[4],
+      const InsetTextfields& textfields,
       const gfx::Insets& default_insets = gfx::Insets());
 
  protected:
@@ -104,6 +108,14 @@
                                Textfield* textfields[4],
                                int* vertical_pos);
 
+  // Creates a set of labeled Textfields with |label_text|, and four text fields
+  // arranged at compass points representing a set of insets. |vertical_pos| is
+  // updated to the bottom of the last Textfield + kSpacing, and |textfields| is
+  // populated with the fields that are created.
+  void CreateMarginsTextFields(const base::string16& label_text,
+                               InsetTextfields* textfields,
+                               int* vertical_pos);
+
   // Creates a Checkbox with label |label_text|. Adjust |vertical_pos| to
   // |vertical_pos| + checkbox->height() + kSpacing.
   Checkbox* CreateCheckbox(const base::string16& label_text, int* vertical_pos);
@@ -118,6 +130,8 @@
   // controls are created correctly.
   void CreateExampleView(View* container) final;
 
+  gfx::Size GetNewChildPanelPreferredSize();
+
   // Called by CreateExampleView() to create any additional controls required by
   // the specific layout. |vertical_start_pos| tells the control where to start
   // placing new controls (i.e. the bottom of the existing common controls).
@@ -131,12 +145,11 @@
   virtual void UpdateLayoutManager() = 0;
 
  private:
-  View* full_panel_ = nullptr;
   View* layout_panel_ = nullptr;
   View* control_panel_ = nullptr;
   LabelButton* add_button_ = nullptr;
-  Textfield* child_panel_size_[2] = {nullptr, nullptr};
-  int panel_count_ = 0;
+  Textfield* preferred_width_view_ = nullptr;
+  Textfield* preferred_height_view_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(LayoutExampleBase);
 };
diff --git a/weblayer/browser/browser_main_parts_impl.cc b/weblayer/browser/browser_main_parts_impl.cc
index 141e501..c20c009 100644
--- a/weblayer/browser/browser_main_parts_impl.cc
+++ b/weblayer/browser/browser_main_parts_impl.cc
@@ -56,7 +56,7 @@
 BrowserMainPartsImpl::BrowserMainPartsImpl(
     MainParams* params,
     const content::MainFunctionParams& main_function_params)
-    : params_(params) {}
+    : params_(params), main_function_params_(main_function_params) {}
 
 BrowserMainPartsImpl::~BrowserMainPartsImpl() = default;
 
@@ -83,6 +83,16 @@
 void BrowserMainPartsImpl::PreMainMessageLoopRun() {
   ui::MaterialDesignController::Initialize();
   params_->delegate->PreMainMessageLoopRun();
+
+  if (main_function_params_.ui_task) {
+    main_function_params_.ui_task->Run();
+    delete main_function_params_.ui_task;
+    run_message_loop_ = false;
+  }
+}
+
+bool BrowserMainPartsImpl::MainMessageLoopRun(int* result_code) {
+  return !run_message_loop_;
 }
 
 void BrowserMainPartsImpl::PreDefaultMainMessageLoopRun(
diff --git a/weblayer/browser/browser_main_parts_impl.h b/weblayer/browser/browser_main_parts_impl.h
index 00dd41a..eb03851 100644
--- a/weblayer/browser/browser_main_parts_impl.h
+++ b/weblayer/browser/browser_main_parts_impl.h
@@ -26,11 +26,16 @@
   int PreEarlyInitialization() override;
   void PreMainMessageLoopStart() override;
   void PreMainMessageLoopRun() override;
+  bool MainMessageLoopRun(int* result_code) override;
   void PreDefaultMainMessageLoopRun(base::OnceClosure quit_closure) override;
 
  private:
   MainParams* params_;
 
+  // For running weblayer_browsertests.
+  const content::MainFunctionParams main_function_params_;
+  bool run_message_loop_ = true;
+
   DISALLOW_COPY_AND_ASSIGN(BrowserMainPartsImpl);
 };
 
diff --git a/weblayer/shell/BUILD.gn b/weblayer/shell/BUILD.gn
index 44d80ae82..14cf54c4 100644
--- a/weblayer/shell/BUILD.gn
+++ b/weblayer/shell/BUILD.gn
@@ -23,8 +23,12 @@
 jumbo_static_library("weblayer_shell_lib") {
   testonly = true
   sources = [
+    "app/shell_main_params.cc",
+    "app/shell_main_params.h",
     "browser/shell.cc",
     "browser/shell.h",
+    "common/shell_switches.cc",
+    "common/shell_switches.h",
   ]
 
   configs += [
@@ -34,6 +38,11 @@
     "//build/config/compiler:no_size_t_to_int_warning",
   ]
 
+  defines = [
+    "WEBLAYER_SHELL_VERSION=\"$weblayer_shell_version\"",
+    "WEBLAYER_SHELL_MAJOR_VERSION=\"$weblayer_shell_major_version\"",
+  ]
+
   public_deps = [
     "//weblayer:weblayer_lib",
   ]
@@ -239,10 +248,7 @@
       sources += [ "app/shell.rc" ]
     }
 
-    defines = [
-      "WEBLAYER_SHELL_VERSION=\"$weblayer_shell_version\"",
-      "WEBLAYER_SHELL_MAJOR_VERSION=\"$weblayer_shell_major_version\"",
-    ]
+    defines = []
 
     deps = [
       ":pak",
diff --git a/weblayer/shell/android/demo_apk/src/org/chromium/weblayer/demo/WebLayerAnimationDemoActivity.java b/weblayer/shell/android/demo_apk/src/org/chromium/weblayer/demo/WebLayerAnimationDemoActivity.java
index a8d5cca..3b0e3f53 100644
--- a/weblayer/shell/android/demo_apk/src/org/chromium/weblayer/demo/WebLayerAnimationDemoActivity.java
+++ b/weblayer/shell/android/demo_apk/src/org/chromium/weblayer/demo/WebLayerAnimationDemoActivity.java
@@ -17,6 +17,9 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.TextView;
@@ -34,9 +37,12 @@
 public class WebLayerAnimationDemoActivity extends FragmentActivity {
     private static final String TAG = "AnimationDemo";
 
+    private static final boolean USE_WEBVIEW = false;
+
     private Profile mProfile;
     private final BrowserFragmentImpl mBrowserFragments[] = new BrowserFragmentImpl[4];
     private final ContainerFrameLayout mContainerViews[] = new ContainerFrameLayout[4];
+    private final MyWebView mWebViews[] = new MyWebView[4];
     private FrameLayout mMainView;
 
     public static class ShellFragment extends Fragment {
@@ -85,6 +91,38 @@
         }
     }
 
+    private static class MyWebView extends WebView {
+        private int mIndex;
+        private boolean mInterceptTouchEvent;
+
+        public MyWebView(Context context, int index) {
+            super(context);
+            mIndex = index;
+        }
+
+        public void setInterceptTouchEvent(boolean intercept) {
+            mInterceptTouchEvent = intercept;
+        }
+
+        public int getIndex() {
+            return mIndex;
+        }
+
+        @Override
+        public boolean onInterceptTouchEvent(MotionEvent ev) {
+            return mInterceptTouchEvent;
+        }
+
+        @Override
+        public boolean onTouchEvent(MotionEvent event) {
+            if (!mInterceptTouchEvent) return super.onTouchEvent(event);
+            if (event.getAction() == KeyEvent.ACTION_UP) {
+                performClick();
+            }
+            return true;
+        }
+    }
+
     private void createNewFragment(int index) {
         ContainerFrameLayout container = new ContainerFrameLayout(this, index);
         mContainerViews[index] = container;
@@ -131,27 +169,53 @@
 
     @Override
     protected void onCreate(final Bundle savedInstanceState) {
-        // Only call init for main process.
-        WebLayer.getInstance().init(getApplication());
+        if (USE_WEBVIEW) {
+            super.onCreate(savedInstanceState);
 
-        super.onCreate(savedInstanceState);
+            FrameLayout mainView = new FrameLayout(this);
+            mMainView = mainView;
+            setContentView(mainView);
 
-        FrameLayout mainView = new FrameLayout(this);
-        mMainView = mainView;
-        setContentView(mainView);
+            for (int i = 0; i < 3; ++i) {
+                mWebViews[i] = new MyWebView(this, i);
+                mWebViews[i].setWebViewClient(new WebViewClient() {
+                    @Override
+                    public boolean shouldOverrideUrlLoading(WebView webView, String url) {
+                        return false;
+                    }
+                });
+                mMainView.addView(mWebViews[i]);
+                WebSettings settings = mWebViews[i].getSettings();
+                settings.setJavaScriptEnabled(true);
 
-        mProfile = WebLayer.getInstance().createProfile(null);
+                // Default layout behavior for chrome on android.
+                settings.setUseWideViewPort(true);
+                settings.setLoadWithOverviewMode(true);
+                settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);
+            }
+        } else {
+            // Only call init for main process.
+            WebLayer.getInstance().init(getApplication());
 
-        createNewFragment(0);
-        createNewFragment(1);
-        createNewFragment(2);
+            super.onCreate(savedInstanceState);
 
-        mBrowserFragments[0].getBrowserController().getNavigationController().navigate(
-                Uri.parse(sanitizeUrl("https://www.google.com")));
-        mBrowserFragments[1].getBrowserController().getNavigationController().navigate(
-                Uri.parse(sanitizeUrl("https://en.wikipedia.org")));
-        mBrowserFragments[2].getBrowserController().getNavigationController().navigate(
-                Uri.parse(sanitizeUrl("https://www.chromium.org")));
+            FrameLayout mainView = new FrameLayout(this);
+            mMainView = mainView;
+            setContentView(mainView);
+
+            mProfile = WebLayer.getInstance().createProfile(null);
+
+            createNewFragment(0);
+            createNewFragment(1);
+            createNewFragment(2);
+
+            mBrowserFragments[0].getBrowserController().getNavigationController().navigate(
+                    Uri.parse(sanitizeUrl("https://www.google.com")));
+            mBrowserFragments[1].getBrowserController().getNavigationController().navigate(
+                    Uri.parse(sanitizeUrl("https://en.wikipedia.org")));
+            mBrowserFragments[2].getBrowserController().getNavigationController().navigate(
+                    Uri.parse(sanitizeUrl("https://www.chromium.org")));
+        }
     }
 
     @Override
@@ -174,34 +238,61 @@
     protected void onResume() {
         super.onResume();
 
-        mContainerViews[0].setOnClickListener(new OnClickImpl());
-        mContainerViews[1].setOnClickListener(new OnClickImpl());
-        mContainerViews[2].setOnClickListener(new OnClickImpl());
-        mContainerViews[0].post(() -> {
-            mBrowserFragments[0].setSupportsEmbedding(true);
-            mBrowserFragments[1].setSupportsEmbedding(true);
-            mBrowserFragments[2].setSupportsEmbedding(true);
-            animateDown(mContainerViews[0]);
-            animateDown(mContainerViews[1]);
-            animateDown(mContainerViews[2]);
-        });
+        if (USE_WEBVIEW) {
+            mWebViews[0].post(() -> {
+                mWebViews[0].loadUrl("https://www.google.com");
+                mWebViews[1].loadUrl("https://en.wikipedia.org");
+                mWebViews[2].loadUrl("https://www.chromium.org");
+                for (int i = 0; i < 3; ++i) {
+                    mWebViews[i].setOnClickListener(new OnClickImpl());
+                    animateDown(mWebViews[i]);
+                }
+            });
+        } else {
+            mContainerViews[0].setOnClickListener(new OnClickImpl());
+            mContainerViews[1].setOnClickListener(new OnClickImpl());
+            mContainerViews[2].setOnClickListener(new OnClickImpl());
+            mContainerViews[0].post(() -> {
+                mBrowserFragments[0].setSupportsEmbedding(true);
+                mBrowserFragments[1].setSupportsEmbedding(true);
+                mBrowserFragments[2].setSupportsEmbedding(true);
+                animateDown(mContainerViews[0]);
+                animateDown(mContainerViews[1]);
+                animateDown(mContainerViews[2]);
+            });
+        }
     }
 
     private ContainerFrameLayout mFullscreenContainer;
+    private MyWebView mFullscreenWebView;
     public class OnClickImpl implements View.OnClickListener {
         @Override
         public void onClick(View v) {
-            ContainerFrameLayout container = (ContainerFrameLayout) v;
-            if (mFullscreenContainer == container) return;
+            if (USE_WEBVIEW) {
+                MyWebView webview = (MyWebView) v;
+                if (mFullscreenWebView == webview) return;
 
-            mMainView.removeView(container);
-            mMainView.addView(container, 0);
+                mMainView.removeView(webview);
+                mMainView.addView(webview, 0);
 
-            if (mFullscreenContainer != null) {
-                animateDown(mFullscreenContainer);
+                if (mFullscreenWebView != null) {
+                    animateDown(mFullscreenWebView);
+                }
+                animateUp(webview);
+                mFullscreenWebView = webview;
+            } else {
+                ContainerFrameLayout container = (ContainerFrameLayout) v;
+                if (mFullscreenContainer == container) return;
+
+                mMainView.removeView(container);
+                mMainView.addView(container, 0);
+
+                if (mFullscreenContainer != null) {
+                    animateDown(mFullscreenContainer);
+                }
+                animateUp(container);
+                mFullscreenContainer = container;
             }
-            animateUp(container);
-            mFullscreenContainer = container;
         }
     }
 
@@ -228,6 +319,29 @@
         container.setInterceptTouchEvent(false);
     }
 
+    private static void animateDown(MyWebView webview) {
+        int index = webview.getIndex();
+        webview.animate()
+                .scaleX(1.0f / 3)
+                .scaleY(1.0f / 3)
+                .translationX(-webview.getWidth() / 3.0f + (webview.getWidth() / 3.0f * index))
+                .translationY(webview.getHeight() / 3.0f)
+                .alpha(0.8f)
+                .setDuration(500);
+        webview.setInterceptTouchEvent(true);
+    }
+
+    private static void animateUp(MyWebView webview) {
+        webview.animate()
+                .scaleX(1.0f)
+                .scaleY(1.0f)
+                .translationX(0)
+                .translationY(0)
+                .alpha(1.0f)
+                .setDuration(500);
+        webview.setInterceptTouchEvent(false);
+    }
+
     /**
      * Given an URL, this performs minimal sanitizing to ensure it will be valid.
      * @param url The url to be sanitized.
diff --git a/weblayer/shell/app/shell_main.cc b/weblayer/shell/app/shell_main.cc
index 2fed096e..41a26d1 100644
--- a/weblayer/shell/app/shell_main.cc
+++ b/weblayer/shell/app/shell_main.cc
@@ -2,125 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/callback.h"
-#include "base/command_line.h"
-#include "base/environment.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/no_destructor.h"
-#include "base/path_service.h"
-#include "build/build_config.h"
-#include "net/base/filename_util.h"
-#include "url/gurl.h"
 #include "weblayer/public/main.h"
-#include "weblayer/public/profile.h"
-#include "weblayer/shell/browser/shell.h"
-
-#if defined(OS_WIN)
-#include "base/base_paths_win.h"
-#elif defined(OS_LINUX)
-#include "base/nix/xdg_util.h"
-#endif
-
-namespace {
-
-GURL GetStartupURL() {
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  const base::CommandLine::StringVector& args = command_line->GetArgs();
-
-#if defined(OS_ANDROID)
-  // Delay renderer creation on Android until surface is ready.
-  return GURL();
-#endif
-
-  if (args.empty())
-    return GURL("https://www.google.com/");
-
-  GURL url(args[0]);
-  if (url.is_valid() && url.has_scheme())
-    return url;
-
-  return net::FilePathToFileURL(
-      base::MakeAbsoluteFilePath(base::FilePath(args[0])));
-}
-
-class MainDelegateImpl : public weblayer::MainDelegate {
- public:
-  void PreMainMessageLoopRun() override {
-    InitializeProfiles();
-
-    weblayer::Shell::Initialize();
-
-    weblayer::Shell::CreateNewWindow(profile_.get(), GetStartupURL(),
-                                     gfx::Size());
-  }
-
-  void SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure) override {
-    weblayer::Shell::SetMainMessageLoopQuitClosure(std::move(quit_closure));
-  }
-
- private:
-  void InitializeProfiles() {
-    base::FilePath path;
-#if defined(OS_WIN)
-    CHECK(base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path));
-    path = path.AppendASCII("web_shell");
-#elif defined(OS_LINUX)
-    std::unique_ptr<base::Environment> env(base::Environment::Create());
-    base::FilePath config_dir(base::nix::GetXDGDirectory(
-        env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir));
-    path = config_dir.AppendASCII("web_shell");
-#elif defined(OS_ANDROID)
-    CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &path));
-    path = path.AppendASCII("web_shell");
-#else
-    NOTIMPLEMENTED();
-#endif
-
-    if (!base::PathExists(path))
-      base::CreateDirectory(path);
-
-    profile_ = weblayer::Profile::Create(path);
-
-    // TODO: create an incognito profile as well.
-  }
-
-  std::unique_ptr<weblayer::Profile> profile_;
-};
-
-weblayer::MainParams CreateMainParams() {
-  static const base::NoDestructor<MainDelegateImpl> weblayer_delegate;
-  weblayer::MainParams params;
-  params.delegate = const_cast<MainDelegateImpl*>(&(*weblayer_delegate));
-
-  base::PathService::Get(base::DIR_EXE, &params.log_filename);
-  params.log_filename = params.log_filename.AppendASCII("weblayer_shell.log");
-
-  params.pak_name = "weblayer.pak";
-
-  params.brand = "weblayer_shell";
-  params.full_version = WEBLAYER_SHELL_VERSION;
-  params.major_version = WEBLAYER_SHELL_MAJOR_VERSION;
-  return params;
-}
-
-}  // namespace
+#include "weblayer/shell/app/shell_main_params.h"
 
 #if defined(OS_WIN)
 
 #if defined(WIN_CONSOLE_APP)
 int main() {
-  return weblayer::Main(CreateMainParams());
+  return weblayer::Main(weblayer::CreateMainParams());
 #else
 int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t*, int) {
-  return weblayer::Main(CreateMainParams(), instance);
+  return weblayer::Main(weblayer::CreateMainParams(), instance);
 #endif
 }
 
 #else
 
 int main(int argc, const char** argv) {
-  return weblayer::Main(CreateMainParams(), argc, argv);
+  return weblayer::Main(weblayer::CreateMainParams(), argc, argv);
 }
 
 #endif  // OS_POSIX
diff --git a/weblayer/shell/app/shell_main_params.cc b/weblayer/shell/app/shell_main_params.cc
new file mode 100644
index 0000000..3524d87d
--- /dev/null
+++ b/weblayer/shell/app/shell_main_params.cc
@@ -0,0 +1,127 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "weblayer/shell/app/shell_main_params.h"
+
+#include "base/callback.h"
+#include "base/command_line.h"
+#include "base/environment.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/no_destructor.h"
+#include "base/path_service.h"
+#include "build/build_config.h"
+#include "net/base/filename_util.h"
+#include "url/gurl.h"
+#include "weblayer/public/main.h"
+#include "weblayer/public/profile.h"
+#include "weblayer/shell/browser/shell.h"
+#include "weblayer/shell/common/shell_switches.h"
+
+#if defined(OS_WIN)
+#include "base/base_paths_win.h"
+#elif defined(OS_LINUX)
+#include "base/nix/xdg_util.h"
+#endif
+
+namespace weblayer {
+
+namespace {
+
+GURL GetStartupURL() {
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  const base::CommandLine::StringVector& args = command_line->GetArgs();
+
+#if defined(OS_ANDROID)
+  // Delay renderer creation on Android until surface is ready.
+  return GURL();
+#endif
+
+  if (args.empty())
+    return GURL("https://www.google.com/");
+
+  GURL url(args[0]);
+  if (url.is_valid() && url.has_scheme())
+    return url;
+
+  return net::FilePathToFileURL(
+      base::MakeAbsoluteFilePath(base::FilePath(args[0])));
+}
+
+class MainDelegateImpl : public MainDelegate {
+ public:
+  void PreMainMessageLoopRun() override {
+    InitializeProfiles();
+
+    Shell::Initialize();
+
+    Shell::CreateNewWindow(profile_.get(), GetStartupURL(), gfx::Size());
+  }
+
+  void SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure) override {
+    Shell::SetMainMessageLoopQuitClosure(std::move(quit_closure));
+  }
+
+ private:
+  void InitializeProfiles() {
+    base::FilePath path;
+
+    base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+    if (cmd_line->HasSwitch(switches::kWebLayerShellDataPath)) {
+      path = cmd_line->GetSwitchValuePath(switches::kWebLayerShellDataPath);
+      if (base::DirectoryExists(path) || base::CreateDirectory(path)) {
+        // Profile needs an absolute path, which we would normally get via
+        // PathService. In this case, manually ensure the path is absolute.
+        if (!path.IsAbsolute())
+          path = base::MakeAbsoluteFilePath(path);
+      } else {
+        LOG(ERROR) << "Unable to create data-path directory: " << path.value();
+      }
+    } else {
+#if defined(OS_WIN)
+      CHECK(base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path));
+      path = path.AppendASCII("web_shell");
+#elif defined(OS_LINUX)
+      std::unique_ptr<base::Environment> env(base::Environment::Create());
+      base::FilePath config_dir(
+          base::nix::GetXDGDirectory(env.get(), base::nix::kXdgConfigHomeEnvVar,
+                                     base::nix::kDotConfigDir));
+      path = config_dir.AppendASCII("web_shell");
+#elif defined(OS_ANDROID)
+      CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &path));
+      path = path.AppendASCII("web_shell");
+#else
+      NOTIMPLEMENTED();
+#endif
+      if (!base::PathExists(path))
+        base::CreateDirectory(path);
+    }
+
+    profile_ = Profile::Create(path);
+
+    // TODO: create an incognito profile as well.
+  }
+
+  std::unique_ptr<Profile> profile_;
+};
+
+}  // namespace
+
+MainParams CreateMainParams() {
+  static const base::NoDestructor<MainDelegateImpl> weblayer_delegate;
+  MainParams params;
+  params.delegate = const_cast<MainDelegateImpl*>(&(*weblayer_delegate));
+
+  base::PathService::Get(base::DIR_EXE, &params.log_filename);
+  params.log_filename = params.log_filename.AppendASCII("weblayer_shell.log");
+
+  params.pak_name = "weblayer.pak";
+
+  params.brand = "weblayer_shell";
+  params.full_version = WEBLAYER_SHELL_VERSION;
+  params.major_version = WEBLAYER_SHELL_MAJOR_VERSION;
+  return params;
+}
+
+}  //  namespace weblayer
diff --git a/weblayer/shell/app/shell_main_params.h b/weblayer/shell/app/shell_main_params.h
new file mode 100644
index 0000000..15b99a2
--- /dev/null
+++ b/weblayer/shell/app/shell_main_params.h
@@ -0,0 +1,15 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBLAYER_SHELL_APP_SHELL_MAIN_PARAMS_H_
+#define WEBLAYER_SHELL_APP_SHELL_MAIN_PARAMS_H_
+
+namespace weblayer {
+struct MainParams;
+
+weblayer::MainParams CreateMainParams();
+
+}  // namespace weblayer
+
+#endif  // WEBLAYER_SHELL_APP_SHELL_MAIN_PARAMS_H_
diff --git a/weblayer/shell/browser/shell.h b/weblayer/shell/browser/shell.h
index c429bfb..51a3de5 100644
--- a/weblayer/shell/browser/shell.h
+++ b/weblayer/shell/browser/shell.h
@@ -56,6 +56,9 @@
                                 const GURL& url,
                                 const gfx::Size& initial_size);
 
+  // Returns the currently open windows.
+  static std::vector<Shell*>& windows() { return windows_; }
+
   // Closes all windows, pumps teardown tasks, then returns. The main message
   // loop will be signalled to quit, before the call returns.
   static void CloseAllWindows();
@@ -64,6 +67,8 @@
   // instance is destroyed.
   static void SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure);
 
+  BrowserController* browser_controller() { return browser_controller_.get(); }
+
   gfx::NativeWindow window() { return window_; }
 
   static gfx::Size GetShellDefaultSize();
diff --git a/weblayer/shell/common/shell_switches.cc b/weblayer/shell/common/shell_switches.cc
new file mode 100644
index 0000000..feded8a
--- /dev/null
+++ b/weblayer/shell/common/shell_switches.cc
@@ -0,0 +1,12 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "weblayer/shell/common/shell_switches.h"
+
+namespace switches {
+
+// Makes WebLayer Shell use the given path for its data directory.
+const char kWebLayerShellDataPath[] = "data-path";
+
+}  // namespace switches
diff --git a/weblayer/shell/common/shell_switches.h b/weblayer/shell/common/shell_switches.h
new file mode 100644
index 0000000..26548d9
--- /dev/null
+++ b/weblayer/shell/common/shell_switches.h
@@ -0,0 +1,14 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBLAYER_SHELL_COMMON_SHELL_SWITCHES_H_
+#define WEBLAYER_SHELL_COMMON_SHELL_SWITCHES_H_
+
+namespace switches {
+
+extern const char kWebLayerShellDataPath[];
+
+}  // namespace switches
+
+#endif  // WEBLAYER_SHELL_COMMON_SHELL_SWITCHES_H_
diff --git a/weblayer/test/BUILD.gn b/weblayer/test/BUILD.gn
new file mode 100644
index 0000000..12a16fd
--- /dev/null
+++ b/weblayer/test/BUILD.gn
@@ -0,0 +1,44 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/features.gni")
+import("//build/config/ui.gni")
+import("//testing/test.gni")
+import("//tools/grit/grit_rule.gni")
+import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
+
+test("weblayer_browsertests") {
+  data = [
+    "//net/tools/testserver/",
+    "//third_party/pywebsocket/src/mod_pywebsocket/",
+    "//third_party/tlslite/",
+  ]
+
+  data_deps = [
+    "//third_party/mesa_headers",
+  ]
+
+  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
+
+  deps = [
+    "//base",
+    "//base/test:test_support",
+    "//content/test:test_support",
+    "//net:test_support",
+    "//testing/gtest",
+    "//ui/base",
+    "//weblayer/shell:weblayer_shell_lib",
+  ]
+
+  sources = [
+    "browsertests_main.cc",
+    "test_launcher_delegate_impl.cc",
+    "test_launcher_delegate_impl.h",
+    "weblayer_browser_test.cc",
+    "weblayer_browser_test.h",
+    "weblayer_browser_test_test.cc",
+    "weblayer_browser_test_utils.cc",
+    "weblayer_browser_test_utils.h",
+  ]
+}
diff --git a/weblayer/test/DEPS b/weblayer/test/DEPS
new file mode 100644
index 0000000..f619579
--- /dev/null
+++ b/weblayer/test/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+content/public/test",
+  "+net/test",
+]
diff --git a/weblayer/test/browsertests_main.cc b/weblayer/test/browsertests_main.cc
new file mode 100644
index 0000000..c0dae98
--- /dev/null
+++ b/weblayer/test/browsertests_main.cc
@@ -0,0 +1,15 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/command_line.h"
+#include "base/test/launcher/test_launcher.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "weblayer/test/test_launcher_delegate_impl.h"
+
+int main(int argc, char** argv) {
+  base::CommandLine::Init(argc, argv);
+  size_t parallel_jobs = base::NumParallelJobs();
+  weblayer::TestLauncherDelegateImpl launcher_delegate;
+  return content::LaunchTests(&launcher_delegate, parallel_jobs, argc, argv);
+}
diff --git a/weblayer/test/data/simple_page.html b/weblayer/test/data/simple_page.html
new file mode 100644
index 0000000..6170792
--- /dev/null
+++ b/weblayer/test/data/simple_page.html
@@ -0,0 +1,6 @@
+<html>
+<head><title>OK</title></head>
+<body>
+Basic html test.
+</body>
+</html>
diff --git a/weblayer/test/test_launcher_delegate_impl.cc b/weblayer/test/test_launcher_delegate_impl.cc
new file mode 100644
index 0000000..a1a5218
--- /dev/null
+++ b/weblayer/test/test_launcher_delegate_impl.cc
@@ -0,0 +1,38 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "weblayer/test/test_launcher_delegate_impl.h"
+
+#include "base/command_line.h"
+#include "base/test/test_suite.h"
+#include "weblayer/app/content_main_delegate_impl.h"
+#include "weblayer/shell/app/shell_main_params.h"
+#include "weblayer/shell/common/shell_switches.h"
+
+namespace weblayer {
+
+int TestLauncherDelegateImpl::RunTestSuite(int argc, char** argv) {
+  base::TestSuite test_suite(argc, argv);
+  // Browser tests are expected not to tear-down various globals and may
+  // complete with the thread priority being above NORMAL.
+  test_suite.DisableCheckForLeakedGlobals();
+  return test_suite.Run();
+}
+
+bool TestLauncherDelegateImpl::AdjustChildProcessCommandLine(
+    base::CommandLine* command_line,
+    const base::FilePath& temp_data_dir) {
+  command_line->AppendSwitchPath(switches::kWebLayerShellDataPath,
+                                 temp_data_dir);
+  return true;
+}
+
+#if !defined(OS_ANDROID)
+content::ContentMainDelegate*
+TestLauncherDelegateImpl::CreateContentMainDelegate() {
+  return new ContentMainDelegateImpl(CreateMainParams());
+}
+#endif
+
+}  // namespace weblayer
diff --git a/weblayer/test/test_launcher_delegate_impl.h b/weblayer/test/test_launcher_delegate_impl.h
new file mode 100644
index 0000000..6a5d43754
--- /dev/null
+++ b/weblayer/test/test_launcher_delegate_impl.h
@@ -0,0 +1,25 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBLAYER_TEST_TEST_LAUNCHER_DELEGATE_IMPL_H_
+#define WEBLAYER_TEST_TEST_LAUNCHER_DELEGATE_IMPL_H_
+
+#include "content/public/test/test_launcher.h"
+
+namespace weblayer {
+
+class TestLauncherDelegateImpl : public content::TestLauncherDelegate {
+ public:
+  int RunTestSuite(int argc, char** argv) override;
+  bool AdjustChildProcessCommandLine(
+      base::CommandLine* command_line,
+      const base::FilePath& temp_data_dir) override;
+#if !defined(OS_ANDROID)
+  content::ContentMainDelegate* CreateContentMainDelegate() override;
+#endif
+};
+
+}  // namespace weblayer
+
+#endif  // WEBLAYER_TEST_TEST_LAUNCHER_DELEGATE_IMPL_H_
diff --git a/weblayer/test/weblayer_browser_test.cc b/weblayer/test/weblayer_browser_test.cc
new file mode 100644
index 0000000..fa80cf2
--- /dev/null
+++ b/weblayer/test/weblayer_browser_test.cc
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "weblayer/test/weblayer_browser_test.h"
+
+#include "base/base_paths.h"
+#include "base/command_line.h"
+#include "weblayer/shell/browser/shell.h"
+
+namespace weblayer {
+
+WebLayerBrowserTest::WebLayerBrowserTest() {
+  CreateTestServer(base::FilePath(FILE_PATH_LITERAL("weblayer/test/data")));
+}
+
+WebLayerBrowserTest::~WebLayerBrowserTest() = default;
+
+void WebLayerBrowserTest::SetUp() {
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  SetUpCommandLine(command_line);
+  content::BrowserTestBase::SetUp();
+}
+
+void WebLayerBrowserTest::PreRunTestOnMainThread() {
+  ASSERT_EQ(Shell::windows().size(), 1u);
+  shell_ = Shell::windows()[0];
+}
+
+void WebLayerBrowserTest::PostRunTestOnMainThread() {}
+
+}  // namespace weblayer
diff --git a/weblayer/test/weblayer_browser_test.h b/weblayer/test/weblayer_browser_test.h
new file mode 100644
index 0000000..fd527657
--- /dev/null
+++ b/weblayer/test/weblayer_browser_test.h
@@ -0,0 +1,36 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBLAYER_TEST_WEBLAYER_BROWSER_TEST_H_
+#define WEBLAYER_TEST_WEBLAYER_BROWSER_TEST_H_
+
+#include "base/macros.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_base.h"
+
+namespace weblayer {
+class Shell;
+
+class WebLayerBrowserTest : public content::BrowserTestBase {
+ public:
+  WebLayerBrowserTest();
+  ~WebLayerBrowserTest() override;
+
+  // content::BrowserTestBase implementation.
+  void SetUp() override;
+  void PreRunTestOnMainThread() override;
+  void PostRunTestOnMainThread() override;
+
+  // Returns the window for the test.
+  Shell* shell() const { return shell_; }
+
+ private:
+  Shell* shell_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(WebLayerBrowserTest);
+};
+
+}  // namespace weblayer
+
+#endif  // WEBLAYER_TEST_WEBLAYER_BROWSER_TEST_H_
diff --git a/weblayer/test/weblayer_browser_test_test.cc b/weblayer/test/weblayer_browser_test_test.cc
new file mode 100644
index 0000000..417dda7e
--- /dev/null
+++ b/weblayer/test/weblayer_browser_test_test.cc
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "weblayer/test/weblayer_browser_test.h"
+
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "weblayer/test/weblayer_browser_test_utils.h"
+
+namespace weblayer {
+
+IN_PROC_BROWSER_TEST_F(WebLayerBrowserTest, Basic) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url = embedded_test_server()->GetURL("/simple_page.html");
+
+  NavigateAndWait(url, shell());
+}
+
+}  // namespace weblayer
diff --git a/weblayer/test/weblayer_browser_test_utils.cc b/weblayer/test/weblayer_browser_test_utils.cc
new file mode 100644
index 0000000..a6754b3
--- /dev/null
+++ b/weblayer/test/weblayer_browser_test_utils.cc
@@ -0,0 +1,57 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "weblayer/test/weblayer_browser_test_utils.h"
+
+#include "base/run_loop.h"
+#include "url/gurl.h"
+#include "weblayer/public/browser_controller.h"
+#include "weblayer/public/navigation.h"
+#include "weblayer/public/navigation_controller.h"
+#include "weblayer/public/navigation_observer.h"
+#include "weblayer/shell/browser/shell.h"
+
+namespace weblayer {
+
+namespace {
+
+// Runs |closure| once |url| is successfully navigated to.
+class TestNavigationObserver : public NavigationObserver {
+ public:
+  TestNavigationObserver(base::OnceClosure closure,
+                         const GURL& url,
+                         Shell* shell)
+      : closure_(std::move(closure)),
+        url_(url),
+        browser_(shell->browser_controller()) {
+    browser_->GetNavigationController()->AddObserver(this);
+  }
+
+  ~TestNavigationObserver() override {
+    browser_->GetNavigationController()->RemoveObserver(this);
+  }
+
+ private:
+  // NavigationObserver implementation:
+  void NavigationCompleted(Navigation* navigation) override {
+    if (navigation->GetURL() == url_)
+      std::move(closure_).Run();
+  }
+
+  base::OnceClosure closure_;
+  const GURL url_;
+  BrowserController* browser_;
+};
+
+}  // namespace
+
+void NavigateAndWait(const GURL& url, Shell* shell) {
+  base::RunLoop run_loop;
+  TestNavigationObserver test_observer(run_loop.QuitClosure(), url, shell);
+
+  shell->browser_controller()->GetNavigationController()->Navigate(url);
+  run_loop.Run();
+}
+
+}  // namespace weblayer
diff --git a/weblayer/test/weblayer_browser_test_utils.h b/weblayer/test/weblayer_browser_test_utils.h
new file mode 100644
index 0000000..65daf4ca
--- /dev/null
+++ b/weblayer/test/weblayer_browser_test_utils.h
@@ -0,0 +1,18 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBLAYER_TEST_WEBLAYER_BROWSER_TEST_UTILS_H_
+#define WEBLAYER_TEST_WEBLAYER_BROWSER_TEST_UTILS_H_
+
+class GURL;
+
+namespace weblayer {
+class Shell;
+
+// Navigates |shell| to |url| and wait for successful navigation.
+void NavigateAndWait(const GURL& url, Shell* shell);
+
+}  // namespace weblayer
+
+#endif  // WEBLAYER_TEST_WEBLAYER_BROWSER_TEST_UTILS_H_